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