Subject: Re: bug#27242: Fail to load LUKS encrypted rootfs, attempts to open luks device before it's ready.

From: Mark H Weaver <[email-masked]>
Date: Mon, 05 Jun 2017 06:07:52 -0400

Adam Van Ymeren <[email-masked]> writes:

> On my machine when booting GuixSD, it fails to find the rootfs from the
> initramfs.  It errors out attempting to find the luks device node.
> Shortly after it errors is when I see the kernel dmesg output of the
> nvme0 device becomining ready.
>
> It looks like we need to wait for the device node to become ready, or
> poll/sleep a few times if we fail to locate the device.

I ran into the same problem at one point, and have applied the following
patch to my private branch of Guix.  Perhaps it should be applied to
master.

      Mark

>From b7c1947d050a944937b983532d940491821fa75f Mon Sep 17 00:00:00 2001
From: Mark H Weaver <[email-masked]>
Date: Tue, 28 Mar 2017 05:52:28 -0400
Subject: [PATCH] DRAFT: Cope with delayed appearance of LUKS source.

---
 gnu/system/mapped-devices.scm | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/gnu/system/mapped-devices.scm b/gnu/system/mapped-devices.scm
index 2959802c9..3659ac2d6 100644
--- a/gnu/system/mapped-devices.scm
+++ b/gnu/system/mapped-devices.scm
@@ -101,6 +101,7 @@
     #~(let ((source #$source))
         ;; XXX: 'use-modules' should be at the top level.
         (use-modules (rnrs bytevectors)           ;bytevector?
+                     (srfi srfi-1)
                      ((gnu build file-systems)
                       #:select (find-partition-by-luks-uuid)))
 
@@ -114,7 +115,11 @@
                         ;; udev-populated /dev/disk/by-id directory but udev may
                         ;; be unavailable at the time we run this.
                         (if (bytevector? source)
-                            (or (find-partition-by-luks-uuid source)
+                            (or (let loop ((tries-left 10))
+                                  (and (positive? tries-left)
+                                       (or (find-partition-by-luks-uuid source)
+                                           (begin (sleep 1)
+                                                  (loop (- tries-left 1))))))
                                 (error "LUKS partition not found" source))
                             source)
 
-- 
2.13.0