initrd: Use non-hyphenated kernel command-line parameter names.
This is to make it less surprising, given the common convention sets forth by the kernel Linux command-line parameters. * gnu/build/linux-boot.scm (boot-system): Rename '--load', '--repl', '--root' and '--system' to 'gnu.load', 'gnu.repl', 'root' and 'gnu.system', respectively. Adjust doc. (find-long-option): Adjust doc. * gnu/installer/parted.scm (installer-root-partition-path): Adjust accordingly. * gnu/system.scm (bootable-kernel-arguments): Add a VERSION argument and update doc. Use VERSION to conditionally return old style vs new style initrd arguments. (%boot-parameters-version): Increment to 1. (operating-system-boot-parameters): Adjust doc. (operating-system-boot-parameters-file): Likewise. * gnu/system/linux-initrd.scm (raw-initrd, base-initrd): Likewise. * doc/guix.texi: Adjust doc. * gnu/build/activation.scm (boot-time-system): Adjust accordingly. * gnu/build/hurd-boot.scm (boot-hurd-system): Likewise. * gnu/packages/commencement.scm (%final-inputs-riscv64): Adjust comment.
This commit is contained in:
		
							parent
							
								
									91755fe6b2
								
							
						
					
					
						commit
						0dc019e19a
					
				
					 9 changed files with 69 additions and 53 deletions
				
			
		|  | @ -34959,7 +34959,7 @@ honors several options passed on the Linux kernel command line | |||
| @code{-append} option of QEMU), notably: | ||||
| 
 | ||||
| @table @code | ||||
| @item --load=@var{boot} | ||||
| @item gnu.load=@var{boot} | ||||
| Tell the initial RAM disk to load @var{boot}, a file containing a Scheme | ||||
| program, once it has mounted the root file system. | ||||
| 
 | ||||
|  | @ -34967,7 +34967,7 @@ Guix uses this option to yield control to a boot program that runs the | |||
| service activation programs and then spawns the GNU@tie{}Shepherd, the | ||||
| initialization system. | ||||
| 
 | ||||
| @item --root=@var{root} | ||||
| @item root=@var{root} | ||||
| Mount @var{root} as the root file system.  @var{root} can be a device | ||||
| name like @code{/dev/sda1}, a file system label, or a file system UUID. | ||||
| When unspecified, the device name from the root file system of the | ||||
|  | @ -34992,7 +34992,7 @@ or @code{preen} to repair problems considered safe to repair automatically. | |||
| @code{preen} is the default if this option is not present or if @var{level} | ||||
| is not one of the above. | ||||
| 
 | ||||
| @item --system=@var{system} | ||||
| @item gnu.system=@var{system} | ||||
| Have @file{/run/booted-system} and @file{/run/current-system} point to | ||||
| @var{system}. | ||||
| 
 | ||||
|  | @ -35004,7 +35004,7 @@ Instruct the initial RAM disk as well as the @command{modprobe} command | |||
| must be a comma-separated list of module names---e.g., | ||||
| @code{usbkbd,9pnet}. | ||||
| 
 | ||||
| @item --repl | ||||
| @item gnu.repl | ||||
| Start a read-eval-print loop (REPL) from the initial RAM disk before it | ||||
| tries to load kernel modules and to mount the root file system.  Our | ||||
| marketing team calls it @dfn{boot-to-Guile}.  The Schemer in you will | ||||
|  | @ -35025,7 +35025,7 @@ here is how to use it and customize it further. | |||
|        [#:helper-packages '()] [#:qemu-networking? #f] [#:volatile-root? #f] | ||||
| Return a derivation that builds a raw initrd.  @var{file-systems} is | ||||
| a list of file systems to be mounted by the initrd, possibly in addition to | ||||
| the root file system specified on the kernel command line via @option{--root}. | ||||
| the root file system specified on the kernel command line via @option{root}. | ||||
| @var{linux-modules} is a list of kernel modules to be loaded at boot time. | ||||
| @var{mapped-devices} is a list of device mappings to realize before | ||||
| @var{file-systems} are mounted (@pxref{Mapped Devices}). | ||||
|  | @ -35055,7 +35055,7 @@ to it are lost. | |||
| Return as a file-like object a generic initrd, with kernel | ||||
| modules taken from @var{linux}.  @var{file-systems} is a list of file-systems to be | ||||
| mounted by the initrd, possibly in addition to the root file system specified | ||||
| on the kernel command line via @option{--root}.  @var{mapped-devices} is a list of device | ||||
| on the kernel command line via @option{root}.  @var{mapped-devices} is a list of device | ||||
| mappings to realize before @var{file-systems} are mounted. | ||||
| 
 | ||||
| When true, @var{keyboard-layout} is a @code{<keyboard-layout>} record denoting | ||||
|  |  | |||
|  | @ -389,8 +389,8 @@ improvement." | |||
|   "/run/current-system") | ||||
| 
 | ||||
| (define (boot-time-system) | ||||
|   "Return the '--system' argument passed on the kernel command line." | ||||
|   (find-long-option "--system" (if (string-contains %host-type "linux-gnu") | ||||
|   "Return the 'gnu.system' argument passed on the kernel command line." | ||||
|   (find-long-option "gnu.system" (if (string-contains %host-type "linux-gnu") | ||||
|                                    (linux-command-line) | ||||
|                                    (command-line)))) | ||||
| 
 | ||||
|  |  | |||
|  | @ -254,7 +254,7 @@ set." | |||
|   "This procedure is meant to be called from an early RC script. | ||||
| 
 | ||||
| Install the relevant passive translators on the first boot.  Then, run system | ||||
| activation by using the kernel command-line options '--system' and '--load'; | ||||
| activation by using the kernel command-line options 'gnu.system' and 'gnu.load'; | ||||
| starting the Shepherd. | ||||
| 
 | ||||
| XXX TODO: see linux-boot.scm:boot-system. | ||||
|  | @ -265,14 +265,14 @@ XXX TODO: use Linux xattr/setxattr to remove (settrans in) /libexec/RUNSYSTEM | |||
| " | ||||
| 
 | ||||
|   (display "Welcome, this is GNU's early boot Guile.\n") | ||||
|   (display "Use '--repl' for an initrd REPL.\n\n") | ||||
|   (display "Use 'gnu.repl' for an initrd REPL.\n\n") | ||||
| 
 | ||||
|   (call-with-error-handling | ||||
|    (lambda () | ||||
| 
 | ||||
|      (let* ((args    (command-line)) | ||||
|             (system  (find-long-option "--system" args)) | ||||
|             (to-load (find-long-option "--load" args))) | ||||
|             (system  (find-long-option "gnu.system" args)) | ||||
|             (to-load (find-long-option "gnu.load" args))) | ||||
| 
 | ||||
|        (format #t "Setting-up essential translators...\n") | ||||
|        (setenv "PATH" (string-append system "/profile/bin")) | ||||
|  | @ -286,7 +286,7 @@ XXX TODO: use Linux xattr/setxattr to remove (settrans in) /libexec/RUNSYSTEM | |||
|        (unless (zero? (system* "/hurd/mach-defpager")) | ||||
|          (format #t "FAILED...Good luck!\n")) | ||||
| 
 | ||||
|        (cond ((member "--repl" args) | ||||
|        (cond ((member "gnu.repl" args) | ||||
|               (format #t "Starting repl...\n") | ||||
|               (start-repl)) | ||||
|              (to-load | ||||
|  | @ -298,7 +298,7 @@ XXX TODO: use Linux xattr/setxattr to remove (settrans in) /libexec/RUNSYSTEM | |||
|               (sleep 2) | ||||
|               (reboot)) | ||||
|              (else | ||||
|               (display "no boot file passed via '--load'\n") | ||||
|               (display "no boot file passed via 'gnu.load'\n") | ||||
|               (display "entering a warm and cozy REPL\n") | ||||
|               (start-repl))))) | ||||
|    #:on-error on-error)) | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| ;;; Copyright © 2016, 2017, 2019–2021 Tobias Geerinckx-Rice <me@tobias.gr> | ||||
| ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com> | ||||
| ;;; Copyright © 2019 Guillaume Le Vaillant <glv@posteo.net> | ||||
| ;;; Copyright © 2020, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com> | ||||
| ;;; | ||||
| ;;; This file is part of GNU Guix. | ||||
| ;;; | ||||
|  | @ -93,7 +94,7 @@ | |||
|      get-string-all))) | ||||
| 
 | ||||
| (define (find-long-option option arguments) | ||||
|   "Find OPTION among ARGUMENTS, where OPTION is something like \"--load\". | ||||
|   "Find OPTION among ARGUMENTS, where OPTION is something like \"gnu.load\". | ||||
| Return the value associated with OPTION, or #f on failure." | ||||
|   (let ((opt (string-append option "="))) | ||||
|     (and=> (find (cut string-prefix? opt <>) | ||||
|  | @ -499,12 +500,12 @@ LINUX-MODULE-DIRECTORY, then installing KEYMAP-FILE with 'loadkeys' (if | |||
| KEYMAP-FILE is true), then setting up QEMU guest networking if | ||||
| QEMU-GUEST-NETWORKING? is true, calling PRE-MOUNT, mounting the file systems | ||||
| specified in MOUNTS, and finally booting into the new root if any.  The initrd | ||||
| supports kernel command-line options '--load', '--root', and '--repl'.  It | ||||
| also honors a subset of the documented Linux kernel command-line parameters | ||||
| such as 'fsck.mode', 'resume' and 'rootdelay'. | ||||
| supports kernel command-line parameters 'gnu.load' and 'gnu.repl'.  It also | ||||
| honors a subset of the Linux kernel command-line parameters such as | ||||
| 'fsck.mode', 'resume', 'root' and 'rootdelay'. | ||||
| 
 | ||||
| Mount the root file system, specified by the '--root' command-line argument, | ||||
| if any. | ||||
| Mount the root file system, specified by the 'root' command-line argument, if | ||||
| any. | ||||
| 
 | ||||
| MOUNTS must be a list of <file-system> objects. | ||||
| 
 | ||||
|  | @ -517,25 +518,25 @@ upon error." | |||
|     (string=? (file-system-mount-point fs) "/")) | ||||
| 
 | ||||
|   (define (device-string->file-system-device device-string) | ||||
|     ;; The "--root=SPEC" kernel command-line option always provides a | ||||
|     ;; string, but the string can represent a device, an nfs-root, a UUID, or a | ||||
|     ;; label.  So check for all four. | ||||
|     ;; The "root=SPEC" kernel command-line option always provides a string, | ||||
|     ;; but the string can represent a device, an nfs-root, a UUID, or a label. | ||||
|     ;; So check for all four. | ||||
|     (cond ((string-prefix? "/" device-string) device-string) | ||||
|           ((string-contains device-string ":/") device-string) ; nfs-root | ||||
|           ((uuid device-string) => identity) | ||||
|           (else (file-system-label device-string)))) | ||||
| 
 | ||||
|   (display "Welcome, this is GNU's early boot Guile.\n") | ||||
|   (display "Use '--repl' for an initrd REPL.\n\n") | ||||
|   (display "Use 'gnu.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)) | ||||
|              ;; If present, ‘--root’ on the kernel command line takes precedence | ||||
|              (to-load (find-long-option "gnu.load" args)) | ||||
|              ;; If present, ‘root’ on the kernel command line takes precedence | ||||
|              ;; over the ‘device’ field of the root <file-system> record. | ||||
|              (root-device (and=> (find-long-option "--root" args) | ||||
|              (root-device (and=> (find-long-option "root" args) | ||||
|                                  device-string->file-system-device)) | ||||
|              (root-fs (or (find root-mount-point? mounts) | ||||
|                           ;; Fall back to fictitious defaults. | ||||
|  | @ -564,7 +565,7 @@ upon error." | |||
|                   (_ 'preen)) | ||||
|                 (file-system-repair fs)))) | ||||
| 
 | ||||
|         (when (member "--repl" args) | ||||
|         (when (member "gnu.repl" args) | ||||
|           (start-repl)) | ||||
| 
 | ||||
|         (display "loading kernel modules...\n") | ||||
|  | @ -652,7 +653,7 @@ the root file system...\n" root-delay) | |||
|               (sleep 2) | ||||
|               (reboot)) | ||||
|             (begin | ||||
|               (display "no boot file passed via '--load'\n") | ||||
|               (display "no boot file passed via 'gnu.load'\n") | ||||
|               (display "entering a warm and cozy REPL\n") | ||||
|               (start-repl))))) | ||||
|     #:on-error on-error)) | ||||
|  |  | |||
|  | @ -348,7 +348,7 @@ fail. See rereadpt function in wipefs.c of util-linux for an explanation." | |||
| (define (installer-root-partition-path) | ||||
|   "Return the root partition path, or #f if it could not be detected." | ||||
|   (let* ((cmdline (linux-command-line)) | ||||
|          (root (find-long-option "--root" cmdline))) | ||||
|          (root (find-long-option "root" cmdline))) | ||||
|     (and root | ||||
|          (or (and (access? root F_OK) root) | ||||
|              (find-partition-by-label root) | ||||
|  |  | |||
|  | @ -422,7 +422,8 @@ of MACHINE's system profile, ordered from most recent to oldest." | |||
|                (let* ((params (call-with-input-string serialized-params | ||||
|                                 read-boot-parameters)) | ||||
|                       (root (boot-parameters-root-device params)) | ||||
|                       (label (boot-parameters-label params))) | ||||
|                       (label (boot-parameters-label params)) | ||||
|                       (version (boot-parameters-version params))) | ||||
|                  (boot-parameters | ||||
|                   (inherit params) | ||||
|                   (label | ||||
|  | @ -433,7 +434,7 @@ of MACHINE's system profile, ordered from most recent to oldest." | |||
|                                                   "~Y-~m-~d ~H:~M")) | ||||
|                                   ")")) | ||||
|                   (kernel-arguments | ||||
|                    (append (bootable-kernel-arguments system-path root) | ||||
|                    (append (bootable-kernel-arguments system-path root version) | ||||
|                            (boot-parameters-kernel-arguments params)))))))) | ||||
|           generations)))) | ||||
| 
 | ||||
|  |  | |||
|  | @ -3740,10 +3740,10 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%" | |||
| (define-public %final-inputs-riscv64 | ||||
|   ;; This is similar to the added (list gcc "lib") elsewhere in this file, but | ||||
|   ;; due to how (%current-system) is re-defined when performing builds with the | ||||
|   ;; '--system' flag, %final-inputs is too early in the evaulation pipeline to | ||||
|   ;; 'gnu.system' flag, %final-inputs is too early in the evaulation pipeline to | ||||
|   ;; correctly identify the system for which a derivation will be built. Thus, | ||||
|   ;; since (%current-system) is re-determined by (guix build-system gnu) after | ||||
|   ;; loading %final-inputs but before taking into account the '--system' flag, | ||||
|   ;; loading %final-inputs but before taking into account the 'gnu.system' flag, | ||||
|   ;; the test for (target-riscv64?) needs to be in (guix build-system gnu), | ||||
|   ;; with %final-inputs-riscv64 already available at the same time that | ||||
|   ;; %final-inputs is available. | ||||
|  |  | |||
|  | @ -187,16 +187,23 @@ | |||
| ;;; | ||||
| ;;; Code: | ||||
| 
 | ||||
| (define (bootable-kernel-arguments system root-device) | ||||
|   "Return a list of kernel arguments (gexps) to boot SYSTEM from ROOT-DEVICE." | ||||
|   (list (string-append "--root=" | ||||
| (define* (bootable-kernel-arguments system root-device version) | ||||
|   "Return a list of kernel arguments (gexps) to boot SYSTEM from ROOT-DEVICE. | ||||
| VERSION is the target version of the boot-parameters record." | ||||
|   ;; If the version is newer than 0, we use the new style initrd parameter | ||||
|   ;; names, otherwise we use the legacy ones.  This is to maintain backward | ||||
|   ;; compatibility when producing bootloader configurations for older | ||||
|   ;; generations. | ||||
|   (define version>0? (> version 0)) | ||||
|   (list (string-append (if version>0? "root=" "--root=") | ||||
|                        ;; Note: Always use the DCE format because that's what | ||||
|                        ;; (gnu build linux-boot) expects for the '--root' | ||||
|                        ;; (gnu build linux-boot) expects for the 'root' | ||||
|                        ;; kernel command-line option. | ||||
|                        (file-system-device->string root-device | ||||
|                                                    #:uuid-type 'dce)) | ||||
|         #~(string-append "--system=" #$system) | ||||
|         #~(string-append "--load=" #$system "/boot"))) | ||||
|         #~(string-append (if #$version>0? "gnu.system=" "--system=") #$system) | ||||
|         #~(string-append (if #$version>0? "gnu.load=" "--load=") | ||||
|                          #$system "/boot"))) | ||||
| 
 | ||||
| ;; System-wide configuration. | ||||
| ;; TODO: Add per-field docstrings/stexi. | ||||
|  | @ -286,10 +293,12 @@ | |||
|                             source-properties->location)) | ||||
|             (innate))) | ||||
| 
 | ||||
| (define (operating-system-kernel-arguments os root-device) | ||||
|   "Return all the kernel arguments, including the ones not specified | ||||
| directly by the user." | ||||
|   (append (bootable-kernel-arguments os root-device) | ||||
| (define* (operating-system-kernel-arguments | ||||
|           os root-device #:key (version %boot-parameters-version)) | ||||
|   "Return all the kernel arguments, including the ones not specified directly | ||||
| by the user.  VERSION should match that of the target <boot-parameter> record | ||||
| object that will contain the kernel parameters." | ||||
|   (append (bootable-kernel-arguments os root-device version) | ||||
|           (operating-system-user-kernel-arguments os))) | ||||
| 
 | ||||
|  | ||||
|  | @ -297,8 +306,12 @@ directly by the user." | |||
| ;;; Boot parameters | ||||
| ;;; | ||||
| 
 | ||||
| ;;; Version 1 was introduced early 2022 to mark the departure from long option | ||||
| ;;; names such as '--load' to the more conventional initrd option names like | ||||
| ;;; 'gnu.load'. | ||||
| ;;; | ||||
| ;;; When bumping the boot-parameters version, increment it by one (1). | ||||
| (define %boot-parameters-version 0) | ||||
| (define %boot-parameters-version 1) | ||||
| 
 | ||||
| (define-record-type* <boot-parameters> | ||||
|   boot-parameters make-boot-parameters boot-parameters? | ||||
|  | @ -479,10 +492,11 @@ format is unrecognized. | |||
| The object has its kernel-arguments extended in order to make it bootable." | ||||
|   (let* ((file (string-append system "/parameters")) | ||||
|          (params (call-with-input-file file read-boot-parameters)) | ||||
|          (root (boot-parameters-root-device params))) | ||||
|          (root (boot-parameters-root-device params)) | ||||
|          (version (boot-parameters-version params))) | ||||
|     (boot-parameters | ||||
|      (inherit params) | ||||
|      (kernel-arguments (append (bootable-kernel-arguments system root) | ||||
|      (kernel-arguments (append (bootable-kernel-arguments system root version) | ||||
|                                (boot-parameters-kernel-arguments params)))))) | ||||
| 
 | ||||
| (define (boot-parameters->menu-entry conf) | ||||
|  | @ -1453,10 +1467,10 @@ a list of <menu-entry>, to populate the \"old entries\" menu." | |||
| (define* (operating-system-boot-parameters os root-device | ||||
|                                            #:key system-kernel-arguments?) | ||||
|   "Return a monadic <boot-parameters> record that describes the boot | ||||
| parameters of OS.  When SYSTEM-KERNEL-ARGUMENTS? is true, add kernel arguments | ||||
| such as '--root' and '--load' to <boot-parameters>.  The | ||||
| SYSTEM-KERNEL-ARGUMENTS? should only be used in necessity, as the '--load' and | ||||
| '--system' values are self-referential (they refer to the system), thus | ||||
| parameters of OS.  When SYSTEM-KERNEL-ARGUMENTS? is true, add the kernel | ||||
| arguments 'root', 'gnu.load' and 'gnu.system' to <boot-parameters>.  The | ||||
| SYSTEM-KERNEL-ARGUMENTS? should only be used in necessity, as the 'gnu.load' | ||||
| and 'gnu.system' values are self-referential (they refer to the system), thus | ||||
| susceptible to introduce a cyclic dependency." | ||||
|   (let* ((initrd          (and (not (operating-system-hurd os)) | ||||
|                                (operating-system-initrd-file os))) | ||||
|  |  | |||
|  | @ -181,7 +181,7 @@ MODULES and taken from LINUX." | |||
|   "Return as a file-like object a raw initrd, with kernel | ||||
| modules taken from LINUX.  FILE-SYSTEMS is a list of file-systems to be | ||||
| mounted by the initrd, possibly in addition to the root file system specified | ||||
| on the kernel command line via '--root'. LINUX-MODULES is a list of kernel | ||||
| on the kernel command line via 'root'.  LINUX-MODULES is a list of kernel | ||||
| modules to be loaded at boot time. MAPPED-DEVICES is a list of device | ||||
| mappings to realize before FILE-SYSTEMS are mounted. | ||||
| HELPER-PACKAGES is a list of packages to be copied in the initrd. It may include | ||||
|  | @ -375,7 +375,7 @@ FILE-SYSTEMS." | |||
|   "Return as a file-like object a generic initrd, with kernel | ||||
| modules taken from LINUX.  FILE-SYSTEMS is a list of file-systems to be | ||||
| mounted by the initrd, possibly in addition to the root file system specified | ||||
| on the kernel command line via '--root'.  MAPPED-DEVICES is a list of device | ||||
| on the kernel command line via 'root'.  MAPPED-DEVICES is a list of device | ||||
| mappings to realize before FILE-SYSTEMS are mounted. | ||||
| 
 | ||||
| When true, KEYBOARD-LAYOUT is a <keyboard-layout> record denoting the desired | ||||
|  |  | |||
		Reference in a new issue