mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 05:18:07 -05: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:
parent
4018745a22
commit
47bdc5a173
2 changed files with 114 additions and 62 deletions
|
@ -13887,9 +13887,9 @@ kernel modules that may be needed to achieve that.
|
|||
|
||||
The @code{initrd} field of an @code{operating-system} declaration allows
|
||||
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
|
||||
high-level @code{base-initrd} procedure, and the low-level
|
||||
@code{expression->initrd} procedure.
|
||||
system linux-initrd)} module provides three ways to build an initrd: the
|
||||
high-level @code{base-initrd} procedure and the low-level
|
||||
@code{raw-initrd} and @code{expression->initrd} procedures.
|
||||
|
||||
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
|
||||
|
@ -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
|
||||
volatile root file system.
|
||||
|
||||
The initial RAM disk produced by @code{base-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
|
||||
The @code{base-initrd} procedure is built from @code{raw-initrd} procedure.
|
||||
Unlike @code{base-initrd}, @code{raw-initrd} doesn't do anything high-level,
|
||||
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:
|
||||
|
||||
@table @code
|
||||
|
@ -13951,19 +13958,23 @@ Manual}, for more information on Guile's REPL.
|
|||
@end table
|
||||
|
||||
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
|
||||
further.
|
||||
@code{base-initrd} and @code{raw-initrd} provide,
|
||||
here is how to use it and customize it further.
|
||||
|
||||
@cindex initrd
|
||||
@cindex initial RAM disk
|
||||
@deffn {Monadic Procedure} base-initrd @var{file-systems} @
|
||||
[#:qemu-networking? #f] [#:virtio? #t] [#:volatile-root? #f] @
|
||||
[#:extra-modules '()] [#:mapped-devices '()]
|
||||
Return a monadic derivation that builds a generic initrd. @var{file-systems} is
|
||||
@deffn {Monadic Procedure} raw-initrd @var{file-systems} @
|
||||
[#:linux-modules '()] [#:mapped-devices '()] @
|
||||
[#:helper-packages '()] [#:qemu-networking? #f] [#:volatile-root? #f]
|
||||
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
|
||||
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{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
|
||||
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
|
||||
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
|
||||
for @var{file-systems} and for the given options. However, additional kernel
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
|
||||
;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
|
||||
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
|
||||
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
|
@ -41,6 +42,7 @@ (define-module (gnu system linux-initrd)
|
|||
#:use-module (srfi srfi-1)
|
||||
#:use-module (srfi srfi-26)
|
||||
#:export (expression->initrd
|
||||
raw-initrd
|
||||
base-initrd))
|
||||
|
||||
|
||||
|
@ -131,13 +133,79 @@ (define modules
|
|||
|
||||
(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
|
||||
#:key
|
||||
(linux linux-libre)
|
||||
(mapped-devices '())
|
||||
qemu-networking?
|
||||
(virtio? #t)
|
||||
volatile-root?
|
||||
(virtio? #t)
|
||||
(extra-modules '()))
|
||||
"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
|
||||
|
@ -145,14 +213,12 @@ (define* (base-initrd file-systems
|
|||
on the kernel command line via '--root'. MAPPED-DEVICES is a list of device
|
||||
mappings to realize before FILE-SYSTEMS are mounted.
|
||||
|
||||
When QEMU-NETWORKING? is true, set up networking with the standard QEMU
|
||||
parameters. When VIRTIO? is true, load additional modules so the initrd can
|
||||
QEMU-NETWORKING? and VOLATILE-ROOT? behaves as in raw-initrd.
|
||||
|
||||
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
|
||||
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
|
||||
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
|
||||
|
@ -224,49 +290,12 @@ (define helper-packages
|
|||
(list unionfs-fuse/static)
|
||||
'())))
|
||||
|
||||
(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 "base-initrd")))
|
||||
(raw-initrd file-systems
|
||||
#:linux linux
|
||||
#:linux-modules linux-modules
|
||||
#:mapped-devices mapped-devices
|
||||
#:helper-packages helper-packages
|
||||
#:qemu-networking? qemu-networking?
|
||||
#:volatile-root? volatile-root?))
|
||||
|
||||
;;; linux-initrd.scm ends here
|
||||
|
|
Loading…
Reference in a new issue