#!/bin/sh # Do unmount/remount-ro. Wait. # KILL everybody. Wait. # Repeat. umountcnt=2 writeout=0 # increase if your kernel doesn ot guarantee writes to complete # No /usr - we are expecting all binaries to be accessible # from root fs alone PATH=/sbin:/bin say() { printf "\r%s\n\r" "$*" } showps() { # sleep 1 ensures that xargs will have time to start up # this makes pslist less prone to random jitter pslist=`{ sleep 1; ps -A -o comm=; } | sort | xargs` pscnt=$(( `say "$pslist" | wc -w` + 0 )) if test x"$VERBOSE" = x; then say "* `date '+%H:%M:%S'` $pscnt processes" else say "* `date '+%H:%M:%S'` Processes ($pscnt): $pslist" fi } say "<*> `date '+%Y-%m-%d %H:%M:%S'` Executing '$0 $*'" showps i="$umountcnt" while test "$i" -gt 0; do say "* `date '+%H:%M:%S'` Unmounting filesystems" umount -a -n -r -f # In case we unmounted proc... test -e /proc/version || mount -t proc none /proc # Remounting / RO isn't necessary when /etc/mtab is linked to /proc/mounts: # already done. But let's be more paranoid here... say "* `date '+%H:%M:%S'` Remounting root filesystem read-only" mount -n -o remount,ro / say "* `date '+%H:%M:%S'` Freeing loop devices" for a in /dev/loop*; do test -b "$a" && losetup -d "$a" done say "* `date '+%H:%M:%S'` Syncing" sync say "* `date '+%H:%M:%S'` Executing: killall5 -KILL" killall5 -9 showps i=$((i-1)) done say "* `date '+%H:%M:%S'` Filesystem status (/proc/mounts)" cat /proc/mounts \ | { bad=false while read dev mntpoint fstype opt n1 n2; do case "$fstype" in ( proc | sysfs | usbfs | devpts | rpc_pipefs | binfmt_misc | autofs | rootfs | tmpfs | ramfs ) say "$dev $mntpoint $fstype $opt $n1 $n2" continue ;; esac if test "${opt:0:2}" = "rw"; then say "$dev $mntpoint $fstype $opt $n1 $n2 - RW!" bad=true else say "$dev $mntpoint $fstype $opt $n1 $n2" fi done if $bad; then say "ERROR: we have filesystems mounted RW! Press (^J)..." read junk &0 2>&0 # debug fi } # Disk cache writeout sleep "$writeout"