#! /bin/sh ### BEGIN INIT INFO # Provides: umountroot # Required-Start: # Required-Stop: # Should-Stop: halt reboot kexec # Default-Start: # Default-Stop: 0 6 # Short-Description: Mount the root filesystem read-only. ### END INIT INFO setglobal PATH = '/sbin:/bin' source /lib/init/vars.sh source /lib/lsb/init-functions proc do_stop { test $VERBOSE = no || log_action_begin_msg "Mounting root filesystem read-only" # Ask init to re-exec itself before we go down if it has been # upgraded this cycle. It'll lose all its state, but at least # it won't hold open files on the root filesystem (lp:#672177). if test -f /var/run/init.upgraded { setglobal old_map = $[ cat /proc/1/maps] setglobal map = $old_map telinit u || : setglobal i = '0' setglobal timeout = '5' while [ "$map" = "$old_map" ] { sleep 1 setglobal map = $[ cat /proc/1/maps] /usr/bin/logger "waiting for init to respawn" setglobal i = $shExpr('i+1') if test $i -eq $timeout { break } } if test $map = $old_map { /usr/bin/logger "FAIL: init failed to respawn in $timeout seconds - unmounting anyway" } else { /usr/bin/logger "SUCCESS: init respawned after $i seconds (within $timeout seconds timeout)" } } setglobal MOUNT_FORCE_OPT = '' test $[uname -s] = "GNU/kFreeBSD" && setglobal MOUNT_FORCE_OPT = '-f' # This: # mount -n -o remount,ro / # will act on a bind mount of / if there is one. # See #339023 and the comment in checkroot.sh mount $MOUNT_FORCE_OPT -n -o remount,ro -t dummytype dummydev / !2 >/dev/null \ || mount $MOUNT_FORCE_OPT -n -o remount,ro dummydev / !2 >/dev/null \ || mount $MOUNT_FORCE_OPT -n -o remount,ro / setglobal ES = $Status test $VERBOSE = no || log_action_end_msg $ES } match $1 { with start|status # No-op with restart|reload|force-reload echo "Error: argument '$1' not supported" > !2 exit 3 with stop do_stop with * echo "Usage: $0 start|stop" > !2 exit 3 } :