75 lines
1.9 KiB
Bash
Executable File
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
|