summary refs log tree commit diff
path: root/gnu/system/linux-initrd.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/system/linux-initrd.scm')
-rw-r--r--gnu/system/linux-initrd.scm75
1 files changed, 56 insertions, 19 deletions
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 42ca29cb58..786e068764 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -21,12 +21,15 @@
   #:use-module (guix utils)
   #:use-module ((guix store)
                 #:select (%store-prefix))
+  #:use-module ((guix derivations)
+                #:select (derivation->output-path))
   #:use-module (gnu packages cpio)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages guile)
   #:use-module ((gnu packages make-bootstrap)
                 #:select (%guile-static-stripped))
+  #:use-module (ice-9 match)
   #:use-module (ice-9 regex)
   #:export (expression->initrd
             qemu-initrd
@@ -49,12 +52,14 @@
                              (name "guile-initrd")
                              (system (%current-system))
                              (modules '())
+                             (inputs '())
                              (linux #f)
                              (linux-modules '()))
   "Return a package that contains a Linux initrd (a gzipped cpio archive)
 containing GUILE and that evaluates EXP upon booting.  LINUX-MODULES is a list
-of `.ko' file names to be copied from LINUX into the initrd.  MODULES is a
-list of Guile module names to be embedded in the initrd."
+of `.ko' file names to be copied from LINUX into the initrd.  INPUTS is a list
+of additional inputs to be copied in the initrd.  MODULES is a list of Guile
+module names to be embedded in the initrd."
 
   ;; General Linux overview in `Documentation/early-userspace/README' and
   ;; `Documentation/filesystems/ramfs-rootfs-initramfs.txt'.
@@ -63,7 +68,16 @@ list of Guile module names to be embedded in the initrd."
     ;; Return a regexp that matches STR exactly.
     (string-append "^" (regexp-quote str) "$"))
 
-  (define builder
+  (define (files-to-copy)
+    (mlet %store-monad ((inputs (lower-inputs inputs)))
+      (return (map (match-lambda
+                    ((_ drv)
+                     (derivation->output-path drv))
+                    ((_ drv sub-drv)
+                     (derivation->output-path drv sub-drv)))
+                   inputs))))
+
+  (define (builder to-copy)
     `(begin
        (use-modules (guix build utils)
                     (ice-9 pretty-print)
@@ -137,6 +151,18 @@ list of Guile module names to be embedded in the initrd."
                                  ,module module-dir))))
                     linux-modules))
 
+           ,@(if (null? to-copy)
+                 '()
+                 `((let ((store ,(string-append "." (%store-prefix))))
+                     (mkdir-p store)
+                     ;; XXX: Should we do export-references-graph?
+                     (for-each (lambda (input)
+                                 (let ((target
+                                        (string-append store "/"
+                                                       (basename input))))
+                                  (copy-recursively input target)))
+                               ',to-copy))))
+
            ;; Reset the timestamps of all the files that will make it in the
            ;; initrd.
            (for-each (cut utime <> 0 0 0 0)
@@ -184,8 +210,10 @@ list of Guile module names to be embedded in the initrd."
                     ("modules/compiled" ,compiled)
                     ,@(if linux
                           `(("linux" ,linux))
-                          '())))))
-   (derivation-expression name builder
+                          '())
+                    ,@inputs)))
+       (to-copy  (files-to-copy)))
+   (derivation-expression name (builder to-copy)
                           #:modules '((guix build utils))
                           #:inputs inputs)))
 
@@ -224,22 +252,31 @@ to it are lost."
             '())
       ,@(if (assoc-ref mounts '9p)
             virtio-9p-modules
+            '())
+      ,@(if volatile-root?
+            '("fuse.ko")
             '())))
 
-  (expression->initrd
-   `(begin
-      (use-modules (guix build linux-initrd))
-
-      (boot-system #:mounts ',mounts
-                   #:linux-modules ',linux-modules
-                   #:qemu-guest-networking? #t
-                   #:guile-modules-in-chroot? ',guile-modules-in-chroot?
-                   #:volatile-root? ',volatile-root?))
-   #:name "qemu-initrd"
-   #:modules '((guix build utils)
-               (guix build linux-initrd))
-   #:linux linux-libre
-   #:linux-modules linux-modules))
+  (mlet %store-monad
+      ((unionfs (package-file unionfs-fuse/static "bin/unionfs")))
+    (expression->initrd
+     `(begin
+        (use-modules (guix build linux-initrd))
+
+        (boot-system #:mounts ',mounts
+                     #:linux-modules ',linux-modules
+                     #:qemu-guest-networking? #t
+                     #:guile-modules-in-chroot? ',guile-modules-in-chroot?
+                     #:unionfs ,unionfs
+                     #:volatile-root? ',volatile-root?))
+     #:name "qemu-initrd"
+     #:modules '((guix build utils)
+                 (guix build linux-initrd))
+     #:linux linux-libre
+     #:linux-modules linux-modules
+     #:inputs (if volatile-root?
+                  `(("unionfs" ,unionfs-fuse/static))
+                  '()))))
 
 (define (gnu-system-initrd)
   "Initrd for the GNU system itself, with nothing QEMU-specific."