This bug has affected one of my remote servers after upgrading to Stretch.
I would have appreciated a hint in Release Notes not (yet) to install
Debian 9 on servers with sysvinit and encrypted partitions.

Anyway, while the fix to this bug is not present in Stretch, I have
created two simplistic init scripts that keep udev running until
cryptdisks have finished, effectively implementing Pali's suggestion in
#238 but without having to modify /etc/init.d/udev itself.
#!/bin/sh
### BEGIN INIT INFO
# Provides:          fix-udev-cryptsetup
# Required-Start:
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Fix cryptsetup hang on shutdown
# Description:       If sysvinit is used on a system with at least
#                    one encrypted partition and systemd-udev
#                    installed, cryptsetup (/etc/init.d/cryptdisks)
#                    will hang on shutdown (see
#                    
<https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=791944>).
#                    This script keeps udev running until after
#                    cryptdisks have shut down.
### END INIT INFO

# Author: Marc Andre Selig <s...@sedacon.com>

DESC="Fix cryptsetup hang on shutdown"

case "$1" in
start)
        ;;
stop)
        mkdir -p /run/sendsigs.omit.d
        pgrep systemd-udevd > /run/sendsigs.omit.d/udev
        ;;
*)
        echo "Usage: fix-udev-cryptsetup {start|stop}"
        exit 1
        ;;
esac
#!/bin/sh
### BEGIN INIT INFO
# Provides:          fix-udev-stop
# Required-Start:
# Required-Stop:     umountroot
# X-Stop-After:      cryptdisks-early
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Stop udev if not done before
# Description:       If sysvinit is used on a system with at least
#                    one encrypted partition and systemd-udev
#                    installed, cryptsetup (/etc/init.d/cryptdisks)
#                    will hang on shutdown (see
#                    
<https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=791944>).
#                    This script kills systemd-udevd if it has been
#                    kept running by fix-udev-cryptsetup.
### END INIT INFO

# Author: Marc Andre Selig <s...@sedacon.com>

DESC="Stop udev if not done before"

case "$1" in
start)
        ;;
stop)
        if [ -f /run/sendsigs.omit.d/udev ]; then
                kill $(cat /run/sendsigs.omit.d/udev)
                rm -f /run/sendsigs.omit.d/udev
        fi
        ;;
*)
        echo "Usage: fix-udev-stop {start|stop}"
        exit 1
        ;;
esac

Reply via email to