aboutsummaryrefslogtreecommitdiff
path: root/gnu/build/linux-boot.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/build/linux-boot.scm')
-rw-r--r--gnu/build/linux-boot.scm165
1 files changed, 87 insertions, 78 deletions
diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 84a5447977..950a3507f2 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2019 Guillaume Le Vaillant <glv@posteo.net>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -357,15 +358,16 @@ the last argument of `mknod'."
(filter-map string->number (scandir "/proc")))))
(define* (mount-root-file-system root type
- #:key volatile-root?)
+ #:key volatile-root? options)
"Mount the root file system of type TYPE at device ROOT. If VOLATILE-ROOT?
is true, mount ROOT read-only and make it an overlay with a writable tmpfs
-using the kernel built-in overlayfs."
+using the kernel built-in overlayfs. OPTIONS indicates the options to use
+to mount ROOT."
(if volatile-root?
(begin
(mkdir-p "/real-root")
- (mount root "/real-root" type MS_RDONLY)
+ (mount root "/real-root" type MS_RDONLY options)
(mkdir-p "/rw-root")
(mount "none" "/rw-root" "tmpfs")
@@ -382,7 +384,7 @@ using the kernel built-in overlayfs."
"lowerdir=/real-root,upperdir=/rw-root/upper,workdir=/rw-root/work"))
(begin
(check-file-system root type)
- (mount root "/root" type)))
+ (mount root "/root" type 0 options)))
;; Make sure /root/etc/mtab is a symlink to /proc/self/mounts.
(false-if-exception
@@ -472,83 +474,90 @@ upon error."
mounts)
"ext4"))
+ (define root-fs-options
+ (any (lambda (fs)
+ (and (root-mount-point? fs)
+ (file-system-options fs)))
+ mounts))
+
(display "Welcome, this is GNU's early boot Guile.\n")
(display "Use '--repl' for an initrd REPL.\n\n")
(call-with-error-handling
- (lambda ()
- (mount-essential-file-systems)
- (let* ((args (linux-command-line))
- (to-load (find-long-option "--load" args))
- (root (find-long-option "--root" args)))
-
- (when (member "--repl" args)
- (start-repl))
-
- (display "loading kernel modules...\n")
- (load-linux-modules-from-directory linux-modules
- linux-module-directory)
-
- (when keymap-file
- (let ((status (system* "loadkeys" keymap-file)))
- (unless (zero? status)
- ;; Emit a warning rather than abort when we cannot load
- ;; KEYMAP-FILE.
- (format (current-error-port)
- "warning: 'loadkeys' exited with status ~a~%"
- status))))
-
- (when qemu-guest-networking?
- (unless (configure-qemu-networking)
- (display "network interface is DOWN\n")))
-
- ;; Prepare the real root file system under /root.
- (unless (file-exists? "/root")
- (mkdir "/root"))
-
- (when (procedure? pre-mount)
- ;; Do whatever actions are needed before mounting the root file
- ;; system--e.g., installing device mappings. Error out when the
- ;; return value is false.
- (unless (pre-mount)
- (error "pre-mount actions failed")))
-
- (setenv "EXT2FS_NO_MTAB_OK" "1")
-
- (if root
- ;; The "--root=SPEC" kernel command-line option always provides a
- ;; string, but the string can represent a device, a UUID, or a
- ;; label. So check for all three.
- (let ((root (cond ((string-prefix? "/" root) root)
- ((uuid root) => identity)
- (else (file-system-label root)))))
- (mount-root-file-system (canonicalize-device-spec root)
- root-fs-type
- #:volatile-root? volatile-root?))
- (mount "none" "/root" "tmpfs"))
-
- ;; Mount the specified file systems.
- (for-each mount-file-system
- (remove root-mount-point? mounts))
-
- (setenv "EXT2FS_NO_MTAB_OK" #f)
-
- (if to-load
- (begin
- (switch-root "/root")
- (format #t "loading '~a'...\n" to-load)
-
- (primitive-load to-load)
-
- (format (current-error-port)
- "boot program '~a' terminated, rebooting~%"
- to-load)
- (sleep 2)
- (reboot))
- (begin
- (display "no boot file passed via '--load'\n")
- (display "entering a warm and cozy REPL\n")
- (start-repl)))))
- #:on-error on-error))
+ (lambda ()
+ (mount-essential-file-systems)
+ (let* ((args (linux-command-line))
+ (to-load (find-long-option "--load" args))
+ (root (find-long-option "--root" args)))
+
+ (when (member "--repl" args)
+ (start-repl))
+
+ (display "loading kernel modules...\n")
+ (load-linux-modules-from-directory linux-modules
+ linux-module-directory)
+
+ (when keymap-file
+ (let ((status (system* "loadkeys" keymap-file)))
+ (unless (zero? status)
+ ;; Emit a warning rather than abort when we cannot load
+ ;; KEYMAP-FILE.
+ (format (current-error-port)
+ "warning: 'loadkeys' exited with status ~a~%"
+ status))))
+
+ (when qemu-guest-networking?
+ (unless (configure-qemu-networking)
+ (display "network interface is DOWN\n")))
+
+ ;; Prepare the real root file system under /root.
+ (unless (file-exists? "/root")
+ (mkdir "/root"))
+
+ (when (procedure? pre-mount)
+ ;; Do whatever actions are needed before mounting the root file
+ ;; system--e.g., installing device mappings. Error out when the
+ ;; return value is false.
+ (unless (pre-mount)
+ (error "pre-mount actions failed")))
+
+ (setenv "EXT2FS_NO_MTAB_OK" "1")
+
+ (if root
+ ;; The "--root=SPEC" kernel command-line option always provides a
+ ;; string, but the string can represent a device, a UUID, or a
+ ;; label. So check for all three.
+ (let ((root (cond ((string-prefix? "/" root) root)
+ ((uuid root) => identity)
+ (else (file-system-label root)))))
+ (mount-root-file-system (canonicalize-device-spec root)
+ root-fs-type
+ #:volatile-root? volatile-root?
+ #:options root-fs-options))
+ (mount "none" "/root" "tmpfs"))
+
+ ;; Mount the specified file systems.
+ (for-each mount-file-system
+ (remove root-mount-point? mounts))
+
+ (setenv "EXT2FS_NO_MTAB_OK" #f)
+
+ (if to-load
+ (begin
+ (switch-root "/root")
+ (format #t "loading '~a'...\n" to-load)
+
+ (primitive-load to-load)
+
+ (format (current-error-port)
+ "boot program '~a' terminated, rebooting~%"
+ to-load)
+ (sleep 2)
+ (reboot))
+ (begin
+ (display "no boot file passed via '--load'\n")
+ (display "entering a warm and cozy REPL\n")
+ (start-repl)))))
+ #:on-error on-error))
;;; linux-initrd.scm ends here