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>
This commit is contained in:
Mathieu Othacehe 2022-12-25 13:19:53 +01:00 committed by Jonathan Brielmaier
parent ee2826e22b
commit 4ef2d82528
No known key found for this signature in database
GPG key ID: ECFC83988B4E4B9F

View file

@ -67,7 +67,9 @@ MICROCODE-PACKAGES, in the format expected by the kernel."
"/initrd.cpio")) "/initrd.cpio"))
(define (combined-initrd . initrds) (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 (define builder
(with-imported-modules (source-module-closure (with-imported-modules (source-module-closure
'((guix build utils) '((guix build utils)
@ -75,13 +77,28 @@ MICROCODE-PACKAGES, in the format expected by the kernel."
#:select? import-nonguix-module?) #:select? import-nonguix-module?)
#~(begin #~(begin
(use-modules (guix build utils) (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 ;; Use .img suffix since the result is no longer easily inspected by
;; standard tools like cpio and gzip. ;; 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) (mkdir-p #$output)
(concatenate-files '#$initrds initrd))))) (concatenate-files '#$initrds initrd)
(concatenate-files references new-references)))))
(file-append (computed-file "combined-initrd" builder) (file-append (computed-file "combined-initrd" builder)
"/initrd.img")) "/initrd.img"))