mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2025-01-12 06:06:53 -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
|
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
|
||||||
|
|
|
@ -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 @@ (define-module (gnu system linux-initrd)
|
||||||
#: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 @@ (define modules
|
||||||
|
|
||||||
(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 @@ (define* (base-initrd file-systems
|
||||||
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 @@ (define helper-packages
|
||||||
(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
|
||||||
|
|
Loading…
Reference in a new issue