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 [ -n "$LABEL" ] && [ -n "$ID_FS_LABEL" ] && echo "LABEL=$ID_FS_LABEL_ENC" && return
144 [ -n "$DM_NAME" ] && echo /dev/mapper/$DM_NAME && return
147 for name in $DEVLINKS ; do
160 mountpoint="${device##*/}"
161 mountpoint="${mountpoint#*=}"
162 echo /mnt/$mountpoint
168 echo $ADDEDBYGRML $1 >> /etc/fstab
169 echo "$2" >> /etc/fstab
170 ) 200>/var/run/rebuildfstab.lock
175 if [ -n "$CONFIG_FSTAB_USER" ] ; then
176 user="$CONFIG_FSTAB_USER"
178 user='1000' # take default
180 if [ -n "$CONFIG_FSTAB_GROUP" ] ; then
181 group="$CONFIG_FSTAB_GROUP"
183 group='users' # take default
186 if [ -z "$ACTION" ] ; then
187 logit "Seems that $0 is not run in a udev environment, exiting." >&2
191 # ignore loop devices for now.
198 removeentries "$ADDEDBYGRML $DEVNAME" /etc/fstab
200 device=$(get_device_name)
201 mountpoint=$(get_mount_point $device)
203 # if entry is already present in /etc/fstab ignore the current event
206 grep -v '^#' /etc/fstab > $TMPFILE
207 ) 200>/var/run/rebuildfstab.lock
209 for devicelink in $DEVLINKS ; do
211 case "$devicelink" in "*external*") continue ;; esac
212 stringinfile $devicelink $TMPFILE && bailout 0
215 # if entry is already present ignore it
216 stringinfile $device $TMPFILE && bailout 0
218 options=noauto,user,dev,suid,exec
221 options=$options,ro,umask=000
224 options=$options,umask=000
235 test -n "$user" && options=$options,uid=$user
236 test -n "$group" && options=$options,gid=$group
244 echo $ADDEDBYGRML $DEVNAME >> /etc/fstab
245 echo $device $mountpoint $ID_FS_TYPE $options 0 0 $addinfo >> /etc/fstab
246 ) 200>/var/run/rebuildfstab.lock
252 # Clean /mnt/... according to info $MNTFILE
253 if [ -r "$MNTFILE" ] ; then
254 for directory in $(cat $MNTFILE) ; do
255 rmdir $directory 2>/dev/null && sed -i "s#$directory##" $MNTFILE
257 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
258 cat $TMPFILE > $MNTFILE
261 # Make sure we have all /mnt/* directories
262 while read p m f relax; do
263 case "$m" in *none*|*proc*|*sys*|'') continue ;; esac
264 if ! grep -q "$m" /proc/mounts ; then
265 if ! [ -d "$m" ] ; then
266 if mkdir -m 755 -p "$m" ; then
267 [ -r "$MNTFILE" ] && grep -q "$m" $MNTFILE || echo "$m" >> $MNTFILE
272 $(cat /etc/fstab | grep -v '^#')
275 # sort the file again...
276 if [ -r "$MNTFILE" ] ; then
277 grep '^/.*$' $MNTFILE | sort -u > $TMPFILE
278 cat $TMPFILE > $MNTFILE
283 ## END OF FILE #################################################################