summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Othacehe <m.othacehe@gmail.com>2022-12-25 13:19:53 +0100
committerJonathan Brielmaier <jonathan.brielmaier@web.de>2022-12-31 13:40:41 +0100
commit4ef2d8252881cf9f724a85680ee9a152fd3845e1 (patch)
treece86aea228a3eb1c357172f54c39f0ecbf920638
parentee2826e22be82ebd624b4daeadc6de97eaa69d02 (diff)
nongnu: Keep the raw-initrd references file.
The raw-initrd contains a "references" file that is used to keep the static guile used in the initrd alive. This file is not part of the combined-initrd. It means that during garbage collection, the static guile could be collected making the system unbootable because the static guile is then not part of the store once the root is switched. In the combined-initrds procedure, make sure to concatenate all the possible references files of the underlying initrds into a top-level references file. Fixes: <https://gitlab.com/nonguix/nonguix/issues/111> Signed-off-by: Jonathan Brielmaier <jonathan.brielmaier@web.de>
-rw-r--r--nongnu/system/linux-initrd.scm25
1 files changed, 21 insertions, 4 deletions
diff --git a/nongnu/system/linux-initrd.scm b/nongnu/system/linux-initrd.scm
index 3bf54af..5f34e79 100644
--- a/nongnu/system/linux-initrd.scm
+++ b/nongnu/system/linux-initrd.scm
@@ -67,7 +67,9 @@ MICROCODE-PACKAGES, in the format expected by the kernel."
"/initrd.cpio"))
(define (combined-initrd . initrds)
- "Return a combined initrd, the result of concatenating INITRDS."
+ "Return a combined initrd, the result of concatenating INITRDS. This relies
+on the kernel ability to detect and load multiple initrds archives from a
+single file."
(define builder
(with-imported-modules (source-module-closure
'((guix build utils)
@@ -75,13 +77,28 @@ MICROCODE-PACKAGES, in the format expected by the kernel."
#:select? import-nonguix-module?)
#~(begin
(use-modules (guix build utils)
- (nonguix build utils))
+ (nonguix build utils)
+ (srfi srfi-1))
;; Use .img suffix since the result is no longer easily inspected by
;; standard tools like cpio and gzip.
- (let ((initrd (string-append #$output "/initrd.img")))
+ ;;
+ ;; The initrds may contain "references" files to keep some items
+ ;; such as the static guile alive. Concatenate them in a single,
+ ;; top-level references file.
+ (let ((initrd (string-append #$output "/initrd.img"))
+ (references
+ (filter-map
+ (lambda (initrd)
+ (let ((ref (string-append (dirname initrd)
+ "/references")))
+ (and (file-exists? ref) ref)))
+ '#$initrds))
+ (new-references
+ (string-append #$output "/references")))
(mkdir-p #$output)
- (concatenate-files '#$initrds initrd)))))
+ (concatenate-files '#$initrds initrd)
+ (concatenate-files references new-references)))))
(file-append (computed-file "combined-initrd" builder)
"/initrd.img"))