3
5
Fork 0
mirror of git://git.savannah.gnu.org/guix.git synced 2023-12-14 03:33:07 +01:00

linux-initrd: Add a raw-initrd and use it to define base-initrd.

* gnu/system/linux-initrd.scm (raw-initrd): New exported variable.
(base-initrd): Use raw-initrd to build the initrd.
* doc/guix.texi (Initial RAM Disk): Document it.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Mathieu Othacehe 2017-03-09 19:39:23 +01:00 committed by Ludovic Courtès
parent 4018745a22
commit 47bdc5a173
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 114 additions and 62 deletions

View file

@ -13887,9 +13887,9 @@ kernel modules that may be needed to achieve that.
The @code{initrd} field of an @code{operating-system} declaration allows 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 two 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
@code{expression->initrd} procedure. @code{raw-initrd} and @code{expression->initrd} procedures.
The @code{base-initrd} procedure is intended to cover most common uses. The @code{base-initrd} procedure is intended to cover most common uses.
For example, if you want to add a bunch of kernel modules to be loaded For example, if you want to add a bunch of kernel modules to be loaded
@ -13910,9 +13910,16 @@ The @code{base-initrd} procedure also handles common use cases that
involves using the system as a QEMU guest, or as a ``live'' system with involves using the system as a QEMU guest, or as a ``live'' system with
volatile root file system. volatile root file system.
The initial RAM disk produced by @code{base-initrd} honors several The @code{base-initrd} procedure is built from @code{raw-initrd} procedure.
options passed on the Linux kernel command line (that is, arguments Unlike @code{base-initrd}, @code{raw-initrd} doesn't do anything high-level,
passed @i{via} the @code{linux} command of GRUB, or the such as trying to guess which kernel modules and packages should be included
to the initrd. An example use of @code{raw-initrd} is when a user has
a custom Linux kernel configuration and default kernel modules included by
@code{base-initrd} are not available.
The initial RAM disk produced by @code{base-initrd} or @code{raw-initrd}
honors several options passed on the Linux kernel command line
(that is, arguments passed @i{via} the @code{linux} command of GRUB, or the
@code{-append} option of QEMU), notably: @code{-append} option of QEMU), notably:
@table @code @table @code
@ -13951,19 +13958,23 @@ Manual}, for more information on Guile's REPL.
@end table @end table
Now that you know all the features that initial RAM disks produced by Now that you know all the features that initial RAM disks produced by
@code{base-initrd} provide, here is how to use it and customize it @code{base-initrd} and @code{raw-initrd} provide,
further. here is how to use it and customize it further.
@cindex initrd @cindex initrd
@cindex initial RAM disk @cindex initial RAM disk
@deffn {Monadic Procedure} base-initrd @var{file-systems} @ @deffn {Monadic Procedure} raw-initrd @var{file-systems} @
[#:qemu-networking? #f] [#:virtio? #t] [#:volatile-root? #f] @ [#:linux-modules '()] [#:mapped-devices '()] @
[#:extra-modules '()] [#:mapped-devices '()] [#:helper-packages '()] [#:qemu-networking? #f] [#:volatile-root? #f]
Return a monadic derivation that builds a generic initrd. @var{file-systems} is Return a monadic 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 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 @code{--root}. the root file system specified on the kernel command line via @code{--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{mapped-devices} is a list of device mappings to realize before
@var{file-systems} are mounted (@pxref{Mapped Devices}). @var{file-systems} are mounted (@pxref{Mapped Devices}).
@var{helper-packages} is a list of packages to be copied in the initrd. It may
include @code{e2fsck/static} or other packages needed by the initrd to check
root partition.
When @var{qemu-networking?} is true, set up networking with the standard QEMU When @var{qemu-networking?} is true, set up networking with the standard QEMU
parameters. When @var{virtio?} is true, load additional modules so that the parameters. When @var{virtio?} is true, load additional modules so that the
@ -13971,6 +13982,18 @@ initrd can be used as a QEMU guest with para-virtualized I/O drivers.
When @var{volatile-root?} is true, the root file system is writable but any changes When @var{volatile-root?} is true, the root file system is writable but any changes
to it are lost. to it are lost.
@end deffn
@deffn {Monadic Procedure} base-initrd @var{file-systems} @
[#:mapped-devices '()] [#:qemu-networking? #f] [#:volatile-root? #f]@
[#:virtio? #t] [#:extra-modules '()]
Return a monadic derivation that builds a generic initrd. @var{file-systems} is
a list of file systems to be mounted by the initrd like for @code{raw-initrd}.
@var{mapped-devices}, @var{qemu-networking?} and @var{volatile-root?}
also behaves as in @code{raw-initrd}.
When @var{virtio?} is true, load additional modules so that the
initrd can be used as a QEMU guest with para-virtualized I/O drivers.
The initrd is automatically populated with all the kernel modules necessary The initrd is automatically populated with all the kernel modules necessary
for @var{file-systems} and for the given options. However, additional kernel for @var{file-systems} and for the given options. However, additional kernel

View file

@ -2,6 +2,7 @@
;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2016 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org> ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -41,6 +42,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
raw-initrd
base-initrd)) base-initrd))
@ -131,13 +133,79 @@ MODULES and taken from LINUX."
(gexp->derivation "linux-modules" build-exp)) (gexp->derivation "linux-modules" build-exp))
(define* (raw-initrd file-systems
#:key
(linux linux-libre)
(linux-modules '())
(mapped-devices '())
(helper-packages '())
qemu-networking?
volatile-root?)
"Return a monadic derivation that builds 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
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
e2fsck/static or other packages needed by the initrd to check root partition.
When QEMU-NETWORKING? is true, set up networking with the standard QEMU
parameters.
When VOLATILE-ROOT? is true, the root file system is writable but any changes
to it are lost."
(define device-mapping-commands
;; List of gexps to open the mapped devices.
(map (lambda (md)
(let* ((source (mapped-device-source md))
(target (mapped-device-target md))
(type (mapped-device-type md))
(open (mapped-device-kind-open type)))
(open source target)))
mapped-devices))
(mlet %store-monad ((kodir (flat-linux-module-directory linux
linux-modules)))
(expression->initrd
(with-imported-modules (source-module-closure
'((gnu build linux-boot)
(guix build utils)
(guix build bournish)
(gnu build file-systems)))
#~(begin
(use-modules (gnu build linux-boot)
(guix build utils)
(guix build bournish) ;add the 'bournish' meta-command
(srfi srfi-26)
;; FIXME: The following modules are for
;; LUKS-DEVICE-MAPPING. We should instead propagate
;; this info via gexps.
((gnu build file-systems)
#:select (find-partition-by-luks-uuid))
(rnrs bytevectors))
(with-output-to-port (%make-void-port "w")
(lambda ()
(set-path-environment-variable "PATH" '("bin" "sbin")
'#$helper-packages)))
(boot-system #:mounts '#$(map file-system->spec file-systems)
#:pre-mount (lambda ()
(and #$@device-mapping-commands))
#:linux-modules '#$linux-modules
#:linux-module-directory '#$kodir
#:qemu-guest-networking? #$qemu-networking?
#:volatile-root? '#$volatile-root?)))
#:name "raw-initrd")))
(define* (base-initrd file-systems (define* (base-initrd file-systems
#:key #:key
(linux linux-libre) (linux linux-libre)
(mapped-devices '()) (mapped-devices '())
qemu-networking? qemu-networking?
(virtio? #t)
volatile-root? volatile-root?
(virtio? #t)
(extra-modules '())) (extra-modules '()))
"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
@ -145,14 +213,12 @@ 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. mappings to realize before FILE-SYSTEMS are mounted.
When QEMU-NETWORKING? is true, set up networking with the standard QEMU QEMU-NETWORKING? and VOLATILE-ROOT? behaves as in raw-initrd.
parameters. When VIRTIO? is true, load additional modules so the initrd can
When VIRTIO? is true, load additional modules so the initrd can
be used as a QEMU guest with the root file system on a para-virtualized block be used as a QEMU guest with the root file system on a para-virtualized block
device. device.
When VOLATILE-ROOT? is true, the root file system is writable but any changes
to it are lost.
The initrd is automatically populated with all the kernel modules necessary The initrd is automatically populated with all the kernel modules necessary
for FILE-SYSTEMS and for the given options. However, additional kernel for FILE-SYSTEMS and for the given options. However, additional kernel
modules can be listed in EXTRA-MODULES. They will be added to the initrd, and modules can be listed in EXTRA-MODULES. They will be added to the initrd, and
@ -224,49 +290,12 @@ loaded at boot time in the order in which they appear."
(list unionfs-fuse/static) (list unionfs-fuse/static)
'()))) '())))
(define device-mapping-commands (raw-initrd file-systems
;; List of gexps to open the mapped devices. #:linux linux
(map (lambda (md) #:linux-modules linux-modules
(let* ((source (mapped-device-source md)) #:mapped-devices mapped-devices
(target (mapped-device-target md)) #:helper-packages helper-packages
(type (mapped-device-type md)) #:qemu-networking? qemu-networking?
(open (mapped-device-kind-open type))) #:volatile-root? volatile-root?))
(open source target)))
mapped-devices))
(mlet %store-monad ((kodir (flat-linux-module-directory linux
linux-modules)))
(expression->initrd
(with-imported-modules (source-module-closure
'((gnu build linux-boot)
(guix build utils)
(guix build bournish)
(gnu build file-systems)))
#~(begin
(use-modules (gnu build linux-boot)
(guix build utils)
(guix build bournish) ;add the 'bournish' meta-command
(srfi srfi-26)
;; FIXME: The following modules are for
;; LUKS-DEVICE-MAPPING. We should instead propagate
;; this info via gexps.
((gnu build file-systems)
#:select (find-partition-by-luks-uuid))
(rnrs bytevectors))
(with-output-to-port (%make-void-port "w")
(lambda ()
(set-path-environment-variable "PATH" '("bin" "sbin")
'#$helper-packages)))
(boot-system #:mounts '#$(map file-system->spec file-systems)
#:pre-mount (lambda ()
(and #$@device-mapping-commands))
#:linux-modules '#$linux-modules
#:linux-module-directory '#$kodir
#:qemu-guest-networking? #$qemu-networking?
#:volatile-root? '#$volatile-root?)))
#:name "base-initrd")))
;;; linux-initrd.scm ends here ;;; linux-initrd.scm ends here