system: Add 'initrd-modules' field.

* gnu/system.scm (<operating-system>)[initrd-modules]: New field.
(operating-system-initrd-file): Pass #:linux-modules to 'make-initrd'.
* gnu/system/linux-initrd.scm (default-initrd-modules): New procedure.
(%base-initrd-modules): New macro.
(base-initrd): Add #:linux-modules and honor it.
* gnu/system/install.scm (embedded-installation-os): Use
'initrd-modules' instead of 'initrd'.
* gnu/tests/install.scm (%raid-root-os): Likewise.
* doc/guix.texi (operating-system Reference): Add 'initrd-modules'.
(Initial RAM Disk): Document it.  Adjust example to not use
 #:extra-modules.
This commit is contained in:
Ludovic Courtès 2018-02-27 11:42:09 +01:00
parent 615a89e310
commit bc499b113a
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
5 changed files with 68 additions and 31 deletions

View File

@ -8889,11 +8889,16 @@ the command-line of the kernel---e.g., @code{("console=ttyS0")}.
@item @code{bootloader} @item @code{bootloader}
The system bootloader configuration object. @xref{Bootloader Configuration}. The system bootloader configuration object. @xref{Bootloader Configuration}.
@item @code{initrd} (default: @code{base-initrd}) @item @code{initrd-modules} (default: @code{%base-initrd-modules})
@cindex initrd @cindex initrd
@cindex initial RAM disk @cindex initial RAM disk
A two-argument monadic procedure that returns an initial RAM disk for The list of Linux kernel modules that need to be available in the
the Linux kernel. @xref{Initial RAM Disk}. initial RAM disk. @xref{Initial RAM Disk}.
@item @code{initrd} (default: @code{base-initrd})
A monadic procedure that returns an initial RAM disk for the Linux
kernel. This field is provided to support low-level customization and
should rarely be needed for casual use. @xref{Initial RAM Disk}.
@item @code{firmware} (default: @var{%base-firmware}) @item @code{firmware} (default: @var{%base-firmware})
@cindex firmware @cindex firmware
@ -19768,7 +19773,27 @@ root file system as well as an initialization script. The latter is
responsible for mounting the real root file system, and for loading any responsible for mounting the real root file system, and for loading any
kernel modules that may be needed to achieve that. kernel modules that may be needed to achieve that.
The @code{initrd} field of an @code{operating-system} declaration allows The @code{initrd-modules} field of an @code{operating-system}
declaration allows you to specify Linux-libre kernel modules that must
be available in the initrd. In particular, this is where you would list
modules needed to actually drive the hard disk where your root partition
is---although the default value of @code{initrd-modules} should cover
most use cases. For example, assuming you need the @code{megaraid_sas}
module in addition to the default modules to be able to access your root
file system, you would write:
@example
(operating-system
;; @dots{}
(initrd-modules (cons "megaraid_sas" %base-initrd-modules)))
@end example
@defvr {Scheme Variable} %base-initrd-modules
This is the list of kernel modules included in the initrd by default.
@end defvr
Furthermore, if you need lower-level customization, the @code{initrd}
field of an @code{operating-system} declaration allows
you to specify which initrd you would like to use. The @code{(gnu you to specify which initrd you would like to use. The @code{(gnu
system linux-initrd)} module provides three ways to build an initrd: the system linux-initrd)} module provides three ways to build an initrd: the
high-level @code{base-initrd} procedure and the low-level high-level @code{base-initrd} procedure and the low-level
@ -19781,11 +19806,10 @@ system declaration like this:
@example @example
(initrd (lambda (file-systems . rest) (initrd (lambda (file-systems . rest)
;; Create a standard initrd that has modules "foo.ko" ;; Create a standard initrd but set up networking
;; and "bar.ko", as well as their dependencies, in ;; with the parameters QEMU expects by default.
;; addition to the modules available by default.
(apply base-initrd file-systems (apply base-initrd file-systems
#:extra-modules '("foo" "bar") #:qemu-networking? #t
rest))) rest)))
@end example @end example

View File

@ -74,6 +74,7 @@
operating-system-kernel operating-system-kernel
operating-system-kernel-file operating-system-kernel-file
operating-system-kernel-arguments operating-system-kernel-arguments
operating-system-initrd-modules
operating-system-initrd operating-system-initrd
operating-system-users operating-system-users
operating-system-groups operating-system-groups
@ -154,6 +155,10 @@ booted from ROOT-DEVICE"
(initrd operating-system-initrd ; (list fs) -> M derivation (initrd operating-system-initrd ; (list fs) -> M derivation
(default base-initrd)) (default base-initrd))
(initrd-modules operating-system-initrd-modules ; list of strings
(thunked) ; it's system-dependent
(default %base-initrd-modules))
(firmware operating-system-firmware ; list of packages (firmware operating-system-firmware ; list of packages
(default %base-firmware)) (default %base-firmware))
@ -846,6 +851,8 @@ hardware-related operations as necessary when booting a Linux container."
(mlet %store-monad ((initrd (make-initrd boot-file-systems (mlet %store-monad ((initrd (make-initrd boot-file-systems
#:linux (operating-system-kernel os) #:linux (operating-system-kernel os)
#:linux-modules
(operating-system-initrd-modules os)
#:mapped-devices mapped-devices))) #:mapped-devices mapped-devices)))
(return (file-append initrd "/initrd")))) (return (file-append initrd "/initrd"))))

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2016 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2016 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com> ;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
@ -396,10 +396,7 @@ The bootloader BOOTLOADER is installed to BOOTLOADER-TARGET."
(kernel-arguments (kernel-arguments
(cons (string-append "console=" tty) (cons (string-append "console=" tty)
(operating-system-user-kernel-arguments installation-os))) (operating-system-user-kernel-arguments installation-os)))
(initrd (lambda (fs . rest) (initrd-modules (append extra-modules %base-initrd-modules))))
(apply base-initrd fs
#:extra-modules extra-modules
rest)))))
(define beaglebone-black-installation-os (define beaglebone-black-installation-os
(embedded-installation-os u-boot-beaglebone-black-bootloader (embedded-installation-os u-boot-beaglebone-black-bootloader

View File

@ -43,6 +43,7 @@
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:export (expression->initrd #:export (expression->initrd
%base-initrd-modules
raw-initrd raw-initrd
file-system-packages file-system-packages
base-initrd)) base-initrd))
@ -277,14 +278,31 @@ FILE-SYSTEMS."
(append-map (compose file-system-type-modules file-system-type) (append-map (compose file-system-type-modules file-system-type)
file-systems)) file-systems))
(define* (default-initrd-modules #:optional (system (%current-system)))
"Return the list of modules included in the initrd by default."
`("ahci" ;for SATA controllers
"usb-storage" "uas" ;for the installation image etc.
"usbhid" "hid-generic" "hid-apple" ;keyboards during early boot
"dm-crypt" "xts" "serpent_generic" "wp512" ;for encrypted root partitions
"nls_iso8859-1" ;for `mkfs.fat`, et.al
,@(if (string-match "^(x86_64|i[3-6]86)-" system)
'("pata_acpi" "pata_atiixp" ;for ATA controllers
"isci") ;for SAS controllers like Intel C602
'())))
(define-syntax %base-initrd-modules
;; This more closely matches our naming convention.
(identifier-syntax (default-initrd-modules)))
(define* (base-initrd file-systems (define* (base-initrd file-systems
#:key #:key
(linux linux-libre) (linux linux-libre)
(linux-modules '())
(mapped-devices '()) (mapped-devices '())
qemu-networking? qemu-networking?
volatile-root? volatile-root?
(virtio? #t) (virtio? #t)
(extra-modules '()) (extra-modules '()) ;deprecated
(on-error 'debug)) (on-error 'debug))
"Return a monadic derivation that builds a generic initrd, with kernel "Return a monadic derivation that builds a generic initrd, with kernel
modules taken from LINUX. FILE-SYSTEMS is a list of file-systems to be modules taken from LINUX. FILE-SYSTEMS is a list of file-systems to be
@ -307,17 +325,9 @@ loaded at boot time in the order in which they appear."
'("virtio_pci" "virtio_balloon" "virtio_blk" "virtio_net" '("virtio_pci" "virtio_balloon" "virtio_blk" "virtio_net"
"virtio_console")) "virtio_console"))
(define linux-modules (define linux-modules*
;; Modules added to the initrd and loaded from the initrd. ;; Modules added to the initrd and loaded from the initrd.
`("ahci" ;for SATA controllers `(,@linux-modules
"usb-storage" "uas" ;for the installation image etc.
"usbhid" "hid-generic" "hid-apple" ;keyboards during early boot
"dm-crypt" "xts" "serpent_generic" "wp512" ;for encrypted root partitions
"nls_iso8859-1" ;for `mkfs.fat`, et.al
,@(if (string-match "^(x86_64|i[3-6]86)-" (%current-system))
'("pata_acpi" "pata_atiixp" ;for ATA controllers
"isci") ;for SAS controllers like Intel C602
'())
,@(if (or virtio? qemu-networking?) ,@(if (or virtio? qemu-networking?)
virtio-modules virtio-modules
'()) '())
@ -332,7 +342,7 @@ loaded at boot time in the order in which they appear."
(raw-initrd file-systems (raw-initrd file-systems
#:linux linux #:linux linux
#:linux-modules linux-modules #:linux-modules linux-modules*
#:mapped-devices mapped-devices #:mapped-devices mapped-devices
#:helper-packages helper-packages #:helper-packages helper-packages
#:qemu-networking? qemu-networking? #:qemu-networking? qemu-networking?

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
@ -565,11 +565,10 @@ where /gnu lives on a separate partition.")
(bootloader grub-bootloader) (bootloader grub-bootloader)
(target "/dev/vdb"))) (target "/dev/vdb")))
(kernel-arguments '("console=ttyS0")) (kernel-arguments '("console=ttyS0"))
(initrd (lambda (file-systems . rest)
;; Add a kernel module for RAID-0 (aka. "stripe"). ;; Add a kernel module for RAID-0 (aka. "stripe").
(apply base-initrd file-systems (initrd-modules (cons "raid0" %base-initrd-modules))
#:extra-modules '("raid0")
rest)))
(mapped-devices (list (mapped-device (mapped-devices (list (mapped-device
(source (list "/dev/vda2" "/dev/vda3")) (source (list "/dev/vda2" "/dev/vda3"))
(target "/dev/md0") (target "/dev/md0")