Sorry for not submitting this to Debian sooner; the cryptsetup delta in Ubuntu is rather large, including extensive changes for upstart support, so it's a challenge to pick out the bits that are currently relevant to Debian. I only caught sight of this bug report by way of Guido's blog.
I agree that this change would be good to have in Debian - I would quite enjoy having plymouth working on my Debian systems for squeeze. However, the patch Guido sent will only add plymouth support for decryption of the rootfs and the swap partition, since other devices are decrypted post-initramfs, so another patch will be needed there for the init scripts. I think the attached diff to cryptdisks.functions, also lifted from Ubuntu, does the job. If you have any questions, feel free to ask. (This patch also changes the handling of random-crypted devices, by making sure they're temp-mounted under /var/run/cryptsetup instead of under /tmp; this is not immediately relevant to Debian, but paves the way for udev-driven activation of crypted disks and upstart support, so I've included it here rather than trying to disentangle the separate changes to individual lines of code.) The Ubuntu changelog entries corresponding to this change are as follows: * debian/cryptdisks.functions: - change interaction to use plymouth directly if present, and if not, to fall back to /lib/cryptsetup/askpass as before * debian/cryptdisk.functions: initially create the device under a temporary name and rename it only at the end using 'dmsetup rename', to ensure that upstart/mountall doesn't see our device before it's ready to go. LP: #475936. * cryptdisks.functions: do_tmp should mount under /var/run/cryptsetup for changing the permissions of the filesystem root, not directly on /tmp, since mounting on /tmp a) is racy, b) confuses mountall something fierce. LP: #475936. * cryptdisks.functions, debian/initramfs/cryptroot-script: fix the invocation of plymouth, so that we actually get proper passphrase prompts (once bug #496765 is fixed). * cryptdisks.functions: replace 'echo -e' bashism with 'printf'. Cheers, -- Steve Langasek Give me a lever long enough and a Free OS Debian Developer to set it on, and I can move the world. Ubuntu Developer http://www.debian.org/ slanga...@ubuntu.com vor...@debian.org
=== modified file 'debian/cryptdisks.functions' --- debian/cryptdisks.functions 2009-11-11 13:50:18 +0000 +++ debian/cryptdisks.functions 2010-01-21 14:46:41 +0000 @@ -288,7 +288,12 @@ # no keyscript, no key => password keyscriptarg="Unlocking the disk $src ($dst)\nEnter passphrase: " key="-" - KEYSCRIPT="/lib/cryptsetup/askpass" + if [ -x /bin/plymouth ] && plymouth --ping; then + KEYSCRIPT="plymouth ask-for-password --prompt" + keyscriptarg=$(printf "$keyscriptarg") + else + KEYSCRIPT="/lib/cryptsetup/askpass" + fi elif [ "$key" != "${key%/dev/*}" ]; then # no keyscript, device key => special treatment keyscriptarg="" @@ -354,7 +359,12 @@ # no keyscript, no key => password keyscriptarg="Unlocking the disk $cryptsource ($crypttarget)\nEnter passphrase: " key="-" - KEYSCRIPT="/lib/cryptsetup/askpass" + if [ -x /bin/plymouth ] && plymouth --ping; then + KEYSCRIPT="plymouth ask-for-password --prompt" + keyscriptarg=$(printf "$keyscriptarg") + else + KEYSCRIPT="/lib/cryptsetup/askpass" + fi else # no keyscript, key => file input keyscriptarg="" @@ -366,16 +376,16 @@ while [ "$tried" -lt "$TRIES" ]; do if [ -n "$KEYSCRIPT" ]; then - "$KEYSCRIPT" "$keyscriptarg" | cryptsetup $PARAMS create "$dst" "$src" + $KEYSCRIPT "$keyscriptarg" | cryptsetup $PARAMS create "${dst}_unformatted" "$src" else - cryptsetup $PARAMS create "$dst" "$src" + cryptsetup $PARAMS create "${dst}_unformatted" "$src" fi - if [ -z "$CHECK" ] || "$CHECK" "/dev/mapper/$dst" $CHECKARGS; then + if [ -z "$CHECK" ] || "$CHECK" "/dev/mapper/${dst}_unformatted" $CHECKARGS; then break else log_warning_msg "$dst: the check for '/dev/mapper/$dst' failed - maybe the password is wrong" - cryptsetup remove "$dst" + cryptsetup remove "${dst}_unformatted" fi tried=$(( $tried + 1 )) @@ -412,13 +422,14 @@ do_swap () { local swap_out - if [ "$MAKESWAP" != "yes" ] || [ ! -b "/dev/mapper/$dst" ]; then + if [ "$MAKESWAP" != "yes" ] || [ ! -b "/dev/mapper/${dst}_unformatted" ] + then return 0 fi - if swap_out=$(/lib/cryptsetup/checks/un_blkid "/dev/mapper/$dst" 2> /dev/null) || \ - /lib/cryptsetup/checks/blkid "/dev/mapper/$dst" swap > /dev/null 2>&1; then - mkswap "/dev/mapper/$dst" > /dev/null 2>&1 + if swap_out=$(/lib/cryptsetup/checks/un_blkid "/dev/mapper/${dst}_unformatted" 2> /dev/null) || \ + /lib/cryptsetup/checks/blkid "/dev/mapper/${dst}_unformatted" swap > /dev/null 2>&1; then + mkswap "/dev/mapper/${dst}_unformatted" > /dev/null 2>&1 else log_warning_msg "$dst: the check for '/dev/mapper/$dst' failed. /dev/mapper/$dst contains data: $swap_out" do_close @@ -430,17 +441,24 @@ # Prepares tmp partitions using random keys do_tmp () { - if [ "x$TMPFS" = "x" ] || [ ! -b "/dev/mapper/$dst" ]; then + if [ "x$TMPFS" = "x" ] || [ ! -b "/dev/mapper/${dst}_unformatted" ]; then return 0 fi - mkfs -t $TMPFS -q "/dev/mapper/$dst" > /dev/null 2>&1 || return 1 - mount -t $TMPFS "/dev/mapper/$dst" /tmp || return 1 - chmod 1777 /tmp - umount /tmp + mkfs -t $TMPFS -q "/dev/mapper/${dst}_unformatted" > /dev/null 2>&1 || return 1 + mkdir -p "/var/run/cryptsetup/$dst" + mount -t $TMPFS "/dev/mapper/${dst}_unformatted" "/var/run/cryptsetup/$dst" || return 1 + chmod 1777 "/var/run/cryptsetup/$dst" + umount "/var/run/cryptsetup/$dst" return 0 } +# Rename the device from its temp name to its final name, which will +# trigger mountall +finalize_device () { + dmsetup rename "${dst}_unformatted" "$dst" +} + # Removes a mapping do_close () { local found IFS opt @@ -530,7 +548,8 @@ fi # Make sure that target device doesn't exist - if [ -b "/dev/mapper/$dst" ]; then + if [ -b "/dev/mapper/${dst}_unformatted" ] || [ -b "/dev/mapper/$dst" ] + then device_msg "$dst" "running" return 0 fi @@ -552,6 +571,7 @@ else do_swap do_tmp + finalize_device device_msg "$dst" "started" fi
signature.asc
Description: Digital signature