scaleway-image-archlinux/images/common-patches/usr/sbin/nbd-disconnect-root

75 lines
1.9 KiB
Bash
Executable File

#!/bin/sh
# Thanks to the LTSP project
# If the root /dev/nbd0 device is unmounted on shutdown then nbd read
# errors occur, and if it isn't, then # the nbd-server process on the server
# doesn't terminate.
# Called by init scripts on reboot or shutdown.
case "$RUNLEVEL" in
0)
key="o"
command="poweroff -f"
;;
6)
key="b"
command="reboot -d -f -i"
;;
*)
echo "nbd-disconnect should only be called by initscripts on reboot/shutdown." >&2
exit 1
;;
esac
disconnect() {
# Stop trapping
trap - 0 HUP INT QUIT KILL SEGV PIPE TERM
# ltsp-client-core.upstart needs "console output" to show stderr
echo "nbd-disconnect executing: " >&2
# Cache the command in order to use it after nbd-client disconnects
$command --version >/dev/null 2>&1
nbd-client -d "$root"
$command
# Hopefully this should never be reached
echo "$key" > /proc/sysrq-trigger
}
# Disconnect swap nbd devices first
while read device etc; do
case "$device" in
/dev/nbd[0-9])
swapoff "$device"
nbd-client -d "$device"
;;
/dev/mapper/swap[0-9])
nbd_device=$(cryptsetup status "$device" | awk '/device:/{print $2}')
swapoff "$device"
cryptsetup remove "$device"
case "$nbd_device" in
/dev/nbd[1-9])
nbd-client -d "$nbd_device"
;;
esac
;;
esac
done < /proc/swaps
# If we're not using an nbd root, exit
unset root
for param in $(cat /proc/cmdline); do
case "$param" in
root=/dev/nbd[0-9])
root="${param#root=}"
;;
esac
done
test -n "$root" || exit 0
trap "disconnect" 0 HUP INT QUIT KILL SEGV PIPE TERM
sync
# Give up to 5 seconds for other services to be called.
# If they finish before that time, process termination will start, and the trap
# will be called.
sleep 5