merged grml-quickconfig nonblocking branch
[grml-scripts.git] / usr_sbin / prepare_ramdisk.sh
1 #!/bin/zsh
2 # Filename:      prepare_ramdisk.sh
3 # Purpose:       set up a ramdisk of a selected directory
4 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 # Latest change: Sam Okt 06 13:23:35 CEST 2007 [mika]
8 ################################################################################
9
10 if [ $UID != 0 ]; then
11   echo "Error: $0 requires root permissions. Exiting."
12   exit 1
13 fi
14
15 setopt nonomatch
16
17 usage(){
18   echo "Usage: $0 <directory> <start|stop>"
19 }
20
21 if ! [ -n "$1" -a -n "$2" ] ; then
22   usage
23   exit 1
24 fi
25
26 DIRECTORY="$1"
27 FILENAME=$(echo $DIRECTORY | sed 's#/#_#g')
28 CACHE_FILE="/ramdisk_cache/$FILENAME"
29 CACHE_FILE_SIZE=64
30
31 prepare_start () {
32   if ! mount | grep -q "tmpfs on /ramdisk_cache" ; then
33     echo -n "Setting up ramdisk /ramdisk_cache: "
34     [ -d /ramdisk_cache ] || mkdir /ramdisk_cache
35     mount -t tmpfs tmpfs /ramdisk_cache && echo "done"
36   fi
37
38   if ! mount | grep -q "${DIRECTORY}.*loop" ; then
39    if [ -d "$DIRECTORY" ] ; then
40     if ! mount | grep -q "loop.*${DIRECTORY}" ; then
41       mv $DIRECTORY/ $DIRECTORY.tmpfile && \
42       mkdir $DIRECTORY
43
44       echo -n "Setting up cachefile $CACHE_FILE for $DIRECTORY: "
45       dd if=/dev/zero of=${CACHE_FILE} bs=1M count=${CACHE_FILE_SIZE} \
46       seek=${CACHE_FILE_SIZE} &>/dev/null && \
47       mkfs.ext2 -F ${CACHE_FILE} &>/dev/null && \
48       mount -o loop ${CACHE_FILE} $DIRECTORY && \
49       cp -a $DIRECTORY.tmpfile/*  $DIRECTORY  &>/dev/null
50       cp -a $DIRECTORY.tmpfile/.* $DIRECTORY  &>/dev/null
51       echo "done" || echo "failed."
52     else
53       echo "Error: $DIRECTORY already mounted as loopback device. Exiting."
54     fi
55    else
56     echo "Error: $DIRECTORY does not exist. Exiting."
57     exit 1
58    fi
59   else
60    echo "Error: $DIRECTORY already mounted loop back."
61   fi
62 }
63
64 prepare_stop () {
65   if mount | grep -q $DIRECTORY ; then
66     echo -n "Unmounting cachefile ${CACHE_FILE}: "
67     cp -a $DIRECTORY/*  $DIRECTORY.tmpfile/  &>/dev/null
68     cp -a $DIRECTORY/.* $DIRECTORY.tmpfile/  &>/dev/null
69     if umount $DIRECTORY ; then
70       rmdir $DIRECTORY
71       mv $DIRECTORY.tmpfile/ $DIRECTORY
72       echo done
73     else
74       echo "error [while unmounting ${DIRECTORY}]"
75     fi
76   else
77     echo "Error: $DIRECTORY not mounted."
78   fi
79 }
80
81 case "$2" in
82   start)
83      prepare_start || exit 1
84      ;;
85   stop)
86      prepare_stop || exit 1
87      ;;
88   *)
89      usage
90      exit 1
91 esac
92
93 exit 0
94
95 ## END OF FILE #################################################################