summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu/system/linux-initrd.scm15
-rw-r--r--guix/build/linux-initrd.scm18
2 files changed, 28 insertions, 5 deletions
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 408fb9f211..1cc1d3b147 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -207,11 +207,20 @@ exception and backtrace!)."
     ;; Modules needed to mount CIFS file systems.
     '("md4.ko" "ecb.ko" "cifs.ko"))
 
+  (define virtio-9p-modules
+    ;; Modules for the 9p paravirtualized file system.
+    '("9pnet.ko" "9p.ko" "9pnet_virtio.ko"))
+
   (define linux-modules
     ;; Modules added to the initrd and loaded from the initrd.
-    (if (assoc-ref mounts 'cifs)
-        cifs-modules
-        '()))
+    `("virtio.ko" "virtio_ring.ko" "virtio_pci.ko"
+      "virtio_balloon.ko" "virtio_blk.ko" "virtio_net.ko"
+      ,@(if (assoc-ref mounts 'cifs)
+            cifs-modules
+            '())
+      ,@(if (assoc-ref mounts '9p)
+            virtio-9p-modules
+            '())))
 
   (expression->initrd
    `(begin
diff --git a/guix/build/linux-initrd.scm b/guix/build/linux-initrd.scm
index b9fc9b1523..7b22354f70 100644
--- a/guix/build/linux-initrd.scm
+++ b/guix/build/linux-initrd.scm
@@ -30,6 +30,7 @@
             make-essential-device-nodes
             configure-qemu-networking
             mount-qemu-smb-share
+            mount-qemu-9p
             bind-mount
             load-linux-module*
             device-number
@@ -145,6 +146,17 @@ Vanilla QEMU's `-smb' option just exports a /qemu share, whereas our
     (mount (string-append "//" server share) mount-point "cifs" 0
            (string->pointer "guest,sec=none"))))
 
+(define (mount-qemu-9p source mount-point)
+  "Mount QEMU's 9p file system from SOURCE at MOUNT-POINT.
+
+This uses the 'virtio' transport, which requires the various virtio Linux
+modules to be loaded."
+
+  (format #t "mounting QEMU's 9p share '~a'...\n" source)
+  (let ((server "10.0.2.4"))
+    (mount source mount-point "9p" 0
+           (string->pointer "trans=virtio"))))
+
 (define (bind-mount source target)
   "Bind-mount SOURCE at TARGET."
   (define MS_BIND 4096)                           ; from libc's <sys/mount.h>
@@ -242,8 +254,10 @@ the new root."
                 (let ((target (string-append "/root/" target)))
                   (mkdir-p target)
                   (mount-qemu-smb-share source target)))
-               ;; TODO: Add 9p.
-               )
+               (('9p source target)
+                (let ((target (string-append "/root/" target)))
+                  (mkdir-p target)
+                  (mount-qemu-9p source target))))
               mounts)
 
     (when guile-modules-in-chroot?