123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #!/bin/sh
- # Do unmount/remount-ro. Wait.
- # KILL everybody. Wait.
- # Repeat.
- umountcnt=2
- writeout=0 # increase if your kernel does not 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 <Enter> (^J)..."
- read junk </dev/console
- #sh </dev/console >&0 2>&0 # debug
- fi
- }
- # Disk cache writeout
- sleep "$writeout"
|