On Sat, Oct 29, 2011 at 8:54 PM, Dave Reisner <d@falconindy.com> wrote:
So, as we discussed, I does not like your umount_all. It'll be really nice when umount can do this on its own, but until then, something such as the following should suffice:
umount_all() { while read -r fstype options target; do # match only targetted fstypes if [[ $1 && $1 != "$fstype" ]]; then continue fi
# don't unmount API filesystems if [[ $target = /@(proc|sys|run|dev)?(/*) ]]; then continue fi
# avoid networked devices IFS=, read -ra opts <<< "$options" if in_array _netdev "${opts[@]}"; then continue fi
mounts+=("$target") done < <(findmnt -runRo FSTYPE,OPTIONS,TARGET / | tac) }
hey, i only recently joined/realized i could post to this list ... if there is an established etiquette/procedure that i'm breaking (now or ever), just lmk. ... btw, you should be able to eliminate the call to `tac` via `findmnt -d backward [...]`. however, i wrote a simple routine semi-recently for a project that may be useful -- it reads `/proc/self/mountinfo` directly (like findmnt), but it also makes use of `tsort` to automatically order the umounts properly (findmnt doesn't seem to do this) -- it can handle any arbitrary depth, original mount order, `--bind`, and `--move` (the latter will unsort the mountinfo table): ------------------------------------------------------------------- # cat umountall.sh #!/bin/bash IFS=; mnts=$(sort -k1n /proc/self/mountinfo | tr -s ' ' '\t'); topo=$(echo ${mnts} | cut -f1,2 | tsort | nl -w1 | sort -k2n); join -o1.1,2.5 -t$'\t' -12 -21 - <(echo ${mnts}) <<<${topo} | sort -k1n; # ./umountall.sh 1 /run 2 /dev/shm 3 /dev/pts 4 /sys/fs/cgroup/systemd 5 /sys/fs/cgroup/cpuset 6 /sys/fs/cgroup/cpu,cpuacct 7 /sys/fs/cgroup/memory 8 /sys/fs/cgroup/devices 9 /sys/fs/cgroup/freezer 10 /sys/fs/cgroup/net_cls 11 /sys/fs/cgroup/blkio 12 /proc/sys/fs/binfmt_misc 13 /var/run 14 /var/lock 15 /dev/mqueue 16 /dev/hugepages 17 /sys/kernel/security 18 /sys/kernel/debug 19 /media 20 /boot 21 /home/anthony/.gvfs 22 /sys/fs/fuse/connections 23 /sys/fs/cgroup 24 /proc 25 /dev 26 /boot 27 /sys 28 / ------------------------------------------------------------------- execution shows you [a] proper umount order -- not the best example because my system is not that interesting, but it really should work for *anything* so long as the kernel doesn't lie. more fields added by modifying the `join` command, eg. `join -o1.1,2.5,2.6` additionally outputs the mount options. pathnames are octal(?) encoded, thus easy to handle, but need to be expanded before actual umount (`echo -e` or `printf`[?] or ???) all binaries are in `coreutils` package there was mention of a shudown hook after a pivot_root recently -- this should work well for that. if there is a simpler way to accomplish this, i'd love to here that as well. this isn't my original but it's tested and functions the same. the original just did a little more like unmount everything under a specific path, or filter stuff out (eg. /proc, /dev, ...) by using the unique mount id; can provide all that if interested. -- C Anthony