diff --git a/nixos/modules/system/boot/luksroot.nix b/nixos/modules/system/boot/luksroot.nix index 8978b73749b..6e867b67439 100644 --- a/nixos/modules/system/boot/luksroot.nix +++ b/nixos/modules/system/boot/luksroot.nix @@ -6,29 +6,38 @@ let luks = config.boot.initrd.luks; 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 - # available as a function. - if ! test -e ${device}; then - echo -n "waiting 10 seconds for device ${device} to appear..." - for try in $(seq 10); do - sleep 1 - if test -e ${device}; then break; fi - echo -n . - done - echo "ok" - fi + + # Wait for a target (e.g. device, keyFile, header, ...) to appear. + wait_target() { + local name="$1" + local target="$2" + + if [ ! -e $target ]; then + echo -n "Waiting 10 seconds for $name $target to appear" + local success=false; + for try in $(seq 10); do + echo -n "." + 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) '' - if ! test -e ${keyFile}; then - echo -n "waiting 10 seconds for key file ${keyFile} to appear..." - for try in $(seq 10); do - sleep 1 - if test -e ${keyFile}; then break; fi - echo -n . - done - echo "ok" - fi + wait_target "key file" ${keyFile} + ''} + + ${optionalString (header != null) '' + wait_target "header" ${header} ''} open_normally() {