diff --git a/conf.d/Makefile b/conf.d/Makefile index c874bae1..5040ba27 100644 --- a/conf.d/Makefile +++ b/conf.d/Makefile @@ -1,5 +1,5 @@ DIR= ${CONFDIR} -CONF= bootmisc fsck hostname local net urandom +CONF= bootmisc fsck hostname local localmount net urandom MK= ../mk include ${MK}/os.mk diff --git a/conf.d/localmount b/conf.d/localmount new file mode 100644 index 00000000..e3361da3 --- /dev/null +++ b/conf.d/localmount @@ -0,0 +1,3 @@ +# Stop the unmounting of certain points. +# This could be useful for some NFS related work. +#no_umounts="/dir1:/var/dir2" diff --git a/init.d/halt.sh.in b/init.d/halt.sh.in index 7b6f55c4..8431b1cb 100644 --- a/init.d/halt.sh.in +++ b/init.d/halt.sh.in @@ -4,6 +4,7 @@ . @SYSCONFDIR@/init.d/functions.sh . "${RC_LIBDIR}"/sh/rc-functions.sh +[ -r @SYSCONFDIR@/conf.d/localmount ] && . @SYSCONFDIR@/conf.d/localmount [ -r @SYSCONFDIR@/rc.conf ] && . @SYSCONFDIR@/rc.conf # Support LiveCD foo @@ -79,6 +80,20 @@ if [ "${RC_UNAME}" = "Linux" ]; then # We need the do_unmount function . "${RC_LIBDIR}"/sh/rc-mount.sh eindent + no_umounts_r="/|/dev|/dev/.*|${RC_SVCDIR}" + # RC_NO_UMOUNTS is an env var that can be set by plugins + OIFS=${IFS} SIFS=${IFS-y} + IFS=$IFS: + for x in ${no_umounts} ${RC_NO_UMOUNTS}; do + no_umounts_r="${no_umounts_r}|${x}" + done + if [ "${SIFS}" = "y" ]; then + IFS=$OIFS + else + unset IFS + fi + no_umounts_r="${no_umounts_r}|/proc|/proc/.*|/sys|/sys/.*" + no_umounts_r="^(${no_umounts})$" fs= for x in ${net_fs_list}; do fs="${fs}${fs:+|}${x}" @@ -86,7 +101,6 @@ if [ "${RC_UNAME}" = "Linux" ]; then [ -n "${fs}" ] && fs="^(${fs})$" do_unmount "mount -n -o remount,ro" \ --skip-point-regex "^(/dev|/dev/.*|/proc|/proc/.*|/sys|/sys/.*)$" \ - --skip-options-regex "^ro" \ ${fs:+--skip-fstype-regex} ${fs} --nonetdev eoutdent eend $? diff --git a/init.d/localmount.in b/init.d/localmount.in index 48c76b70..bcd39e7d 100644 --- a/init.d/localmount.in +++ b/init.d/localmount.in @@ -30,13 +30,13 @@ start() stop() { # We never unmount / or /dev or $RC_SVCDIR - local x= no_umounts="/|/dev|/dev/.*|${RC_SVCDIR}" + local x= no_umounts_r="/|/dev|/dev/.*|${RC_SVCDIR}" # RC_NO_UMOUNTS is an env var that can be set by plugins OIFS=${IFS} SIFS=${IFS-y} IFS=$IFS: for x in ${no_umounts} ${RC_NO_UMOUNTS}; do - no_umounts="${no_umounts}|${x}" + no_umounts_r="${no_umounts_r}|${x}" done if [ "${SIFS}" = "y" ]; then IFS=$OIFS @@ -45,9 +45,9 @@ stop() fi if [ "${RC_UNAME}" = "Linux" ]; then - no_umounts="${no_umounts}|/proc|/proc/.*|/sys|/sys/.*" + no_umounts_r="${no_umounts_r}|/proc|/proc/.*|/sys|/sys/.*" fi - no_umounts="^(${no_umounts})$" + no_umounts_r="^(${no_umounts})$" # Flush all pending disk writes now sync; sync @@ -63,7 +63,7 @@ stop() # Umount loopback devices einfo "Unmounting loopback devices" eindent - do_unmount "umount -d" --skip-point-regex "${no_umounts}" \ + do_unmount "umount -d" --skip-point-regex "${no_umounts_r}" \ --node-regex "^/dev/loop" eoutdent