gnu: linux-initrd: Recognize 9p file systems.
authorLudovic Courtès <ludo@gnu.org>
Fri, 31 Jan 2014 11:21:10 +0000 (12:21 +0100)
committerLudovic Courtès <ludo@gnu.org>
Fri, 31 Jan 2014 11:52:13 +0000 (12:52 +0100)
* gnu/system/linux-initrd.scm (qemu-initrd)[virtio-9p-modules]: New
  variable.
  [linux-modules]: Append VIRTIO-9P-MODULES when a 9p file system is in
  MOUNTS.
* guix/build/linux-initrd.scm (mount-qemu-9p): New procedure.
  (boot-system): Recognize '9p' in MOUNTS, and use 'mount-qemu-9p'.

gnu/system/linux-initrd.scm
guix/build/linux-initrd.scm

index 408fb9f..1cc1d3b 100644 (file)
@@ -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
index b9fc9b1..7b22354 100644 (file)
@@ -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?