2 # Filename: rebuildfstab
3 # Purpose: calls scanpartitions as root and adds entries to /etc/fstab
4 # Authors: grml-team (grml.org), (c) Klaus Knopper Nov 2002, (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 ################################################################################
9 PATH="/bin:/sbin:/usr/bin:/usr/sbin"
10 TMP=$(mktemp 2>/dev/null)
11 TMPFILE=$(mktemp 2>/dev/null)
12 ADDEDBYGRML="# Added by GRML"
13 MNTFILE="/mnt/.grml-auto-created_do-not-delete-this-file"
14 MOUNTPOINT_PREFIX=/mnt/
18 if [ -x /usr/bin/logger ] ; then
19 /usr/bin/logger -i -t rebuildfstab "$*"
24 [ -n "$1" ] && EXITCODE="$1" || EXITCODE=1
25 rm -f $TMP $TMPFILE /var/run/rebuildfstab.pid
29 echo "$$" > /var/run/rebuildfstab.pid
35 [ -e /etc/grml/autconfig ] && . /etc/grml/autoconfig
37 if ! [ -w "$(dirname $MNTFILE)" ] ; then
38 echo "$0: can not write to $MNTFILE">&2
39 logit "can not write to $MNTFILE"
43 if [ -z "$TMP" -o -z "$TMPFILE" ] ; then
44 echo "$0: could not create tmpfile (is / mounted read-only?), exiting" >&2
45 logit 'fatal - could not create tmpfile (is / mounted read-only?), exiting'
49 # trap "rm -f $TMP $TMPFILE" 2 3 11
52 if grep -q " nofstab" /proc/cmdline ; then
56 grep -q 'nolabel' /proc/cmdline && NOLABEL='TRUE' || LABEL='TRUE'
60 if [ "$CONFIG_FSTAB" = "no" ] ; then
65 if grep -q ' /mnt ' /proc/mounts ; then
66 logit '/mnt is a mounted directory, exiting.'
70 # make sure we have the $MNTFILE before reading/writing into it
71 if [ -z "$NO_AUTO_FILE" ] ; then
72 [ -r $MNTFILE ] || touch $MNTFILE
76 # make sure we have a /etc/fstab at all
79 if ! [ -f /etc/fstab ] ; then
80 cat > /etc/fstab << EOF
81 # /etc/fstab - static file system information
82 # <filesystem> <mountpoint> <type> <options> <dump> <pass>
83 proc /proc proc rw,nosuid,nodev,noexec 0 0
84 none /proc/bus/usb usbfs defaults,noauto 0 0
85 sysfs /sys sysfs rw,nosuid,nodev,noexec 0 0
86 devpts /dev/pts devpts noauto,mode=0622 0 0
87 /dev/fd0 /mnt/floppy auto user,noauto,exec 0 0
88 /dev/external /mnt/external auto user,noauto,exec,rw,uid=grml,gid=grml 0 0
89 /dev/external1 /mnt/external1 auto user,noauto,exec,rw,uid=grml,gid=grml 0 0
90 /dev/cdrom /mnt/cdrom auto user,noauto,exec,ro 0 0
91 /dev/dvd /mnt/dvd auto user,noauto,exec,ro 0 0
92 # some other examples:
93 # /dev/hda1 /Grml ext3 dev,suid,user,noauto 0 2
94 # //1.2.3.4/pub /smb/pub smbfs defaults,user,noauto,uid=grml,gid=grml 0 0
95 # linux:/pub /beer nfs defaults 0 0
96 # tmpfs /tmp tmpfs size=300M 0 0
97 # none /proc/bus/usb usbfs defaults,nodev,noexec,nosuid,noauto,devgid=1001,devmode=664 0 0
98 # 192.168.1.101:/backups /mnt/nfs nfs defaults,user,wsize=8192,rsize=8192 0 0
100 # Warning! Please do *not* change any lines below because they are auto-generated by rebuildfstab!
101 # If you want to disable rebuildfstab set CONFIG_FSTAB='no' in /etc/grml/autoconfig!
102 # See 'man grml-rebuildfstab' for more details about the following entries.
105 ) 200>/var/run/rebuildfstab.lock
107 [ ! -w /etc/fstab ] && {
108 logit "fatal - /etc/fstab not writeable, exiting"
112 # Simple shell grep, searches for lines STARTING with string
122 # Remove comment line $1 and the following line from file $2
123 # sed '/^# Added by GRML/{N;d;}'
126 entry=$(echo $1 | sed "s#/#\\\/#g")
129 sed -i -e "/$entry/{N;d}" /etc/fstab
130 ) 200>/var/run/rebuildfstab.lock
136 # dont use labels for some filesystem
141 if [ -n "$LABEL" ] && [ -n "$ID_FS_LABEL_ENC" ] ; then
142 # see check_for_label() in scanpartitions for details
143 case $ID_FS_LABEL_ENC in
145 addinfo=" # space char inside label ($ID_FS_LABEL_ENC) not supported"
148 addinfo=" # label '/' not supported"
152 echo "LABEL=$ID_FS_LABEL_ENC"
157 [ -n "$DM_NAME" ] && echo /dev/mapper/$DM_NAME && return
160 for name in $DEVLINKS ; do
173 mountpoint="${device##*/}"
174 mountpoint="${mountpoint#*=}"
175 echo /mnt/$mountpoint
181 echo $ADDEDBYGRML $1 >> /etc/fstab
182 echo "$2" >> /etc/fstab
183 ) 200>/var/run/rebuildfstab.lock
188 if [ -n "$CONFIG_FSTAB_USER" ] ; then
189 user="$CONFIG_FSTAB_USER"
191 user='1000' # take default
193 if [ -n "$CONFIG_FSTAB_GROUP" ] ; then
194 group="$CONFIG_FSTAB_GROUP"
196 group='users' # take default
199 if [ -z "$ACTION" ] ; then
200 logit "Seems that $0 is not run in a udev environment, exiting." >&2
204 # ignore loop devices for now.
211 removeentries "$ADDEDBYGRML $DEVNAME" /etc/fstab
213 device=$(get_device_name)
214 mountpoint=$(get_mount_point $device)
216 # if entry is already present in /etc/fstab ignore the current event
219 grep -v '^#' /etc/fstab > $TMPFILE
220 ) 200>/var/run/rebuildfstab.lock
222 for devicelink in $DEVLINKS ; do
224 case "$devicelink" in *external*) continue ;; esac
225 stringinfile $devicelink $TMPFILE && bailout 0
228 # if entry is already present ignore it
229 stringinfile $device $TMPFILE && bailout 0
231 options=noauto,user,dev,suid,exec
234 options=$options,ro,umask=000
237 options=$options,umask=000
248 test -n "$user" && options=$options,uid=$user
249 test -n "$group" && options=$options,gid=$group
257 echo $ADDEDBYGRML $DEVNAME >> /etc/fstab
258 echo $device $mountpoint $ID_FS_TYPE $options 0 0 $addinfo >> /etc/fstab
259 ) 200>/var/run/rebuildfstab.lock
265 # Clean /mnt/... according to info $MNTFILE
266 if [ -r "$MNTFILE" ] ; then
267 for directory in $(cat $MNTFILE) ; do
268 rmdir $directory 2>/dev/null && sed -i "s#$directory##" $MNTFILE
270 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
271 cat $TMPFILE > $MNTFILE
274 # Make sure we have all /mnt/* directories
275 while read p m f relax; do
276 case "$m" in *none*|*proc*|*sys*|'') continue ;; esac
277 if ! grep -q "$m" /proc/mounts ; then
278 if ! [ -d "$m" ] ; then
279 if mkdir -m 755 -p "$m" ; then
280 [ -r "$MNTFILE" ] && grep -q "$m" $MNTFILE || echo "$m" >> $MNTFILE
285 $(cat /etc/fstab | grep -v '^#')
288 # sort the file again...
289 if [ -r "$MNTFILE" ] ; then
290 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
291 cat $TMPFILE > $MNTFILE
296 ## END OF FILE #################################################################