luksroot: Wait for the header (device) to appear

The LUKS header can be on another device (e.g. a USB stick). In my case
it can take up to two seconds until the partition on my USB stick is
available (i.e. the decryption fails without this patch). This will also
remove some redundancy by providing the shell function `wait_target` and
slightly improve the output (one "." per second and a success/failure
indication after 10 seconds instead of always printing "ok").
This commit is contained in:
Michael Weiss 2017-04-04 21:19:38 +02:00
parent 2ba604f292
commit a6420e13a2

View File

@ -6,29 +6,38 @@ let
luks = config.boot.initrd.luks; luks = config.boot.initrd.luks;
openCommand = name': { name, device, header, keyFile, keyFileSize, allowDiscards, yubikey, ... }: assert name' == name; '' openCommand = name': { name, device, header, keyFile, keyFileSize, allowDiscards, yubikey, ... }: assert name' == name; ''
# Wait for luksRoot to appear, e.g. if on a usb drive.
# XXX: copied and adapted from stage-1-init.sh - should be # Wait for a target (e.g. device, keyFile, header, ...) to appear.
# available as a function. wait_target() {
if ! test -e ${device}; then local name="$1"
echo -n "waiting 10 seconds for device ${device} to appear..." local target="$2"
for try in $(seq 10); do
sleep 1 if [ ! -e $target ]; then
if test -e ${device}; then break; fi echo -n "Waiting 10 seconds for $name $target to appear"
echo -n . local success=false;
done for try in $(seq 10); do
echo "ok" echo -n "."
fi sleep 1
if [ -e $target ]; then success=true break; fi
done
if [ $success = true ]; then
echo " - success";
else
echo " - failure";
fi
fi
}
# Wait for luksRoot (and optionally keyFile and/or header) to appear, e.g.
# if on a USB drive.
wait_target "device" ${device}
${optionalString (keyFile != null) '' ${optionalString (keyFile != null) ''
if ! test -e ${keyFile}; then wait_target "key file" ${keyFile}
echo -n "waiting 10 seconds for key file ${keyFile} to appear..." ''}
for try in $(seq 10); do
sleep 1 ${optionalString (header != null) ''
if test -e ${keyFile}; then break; fi wait_target "header" ${header}
echo -n .
done
echo "ok"
fi
''} ''}
open_normally() { open_normally() {