me
/
guix
Archived
1
0
Fork 0

system: Initialize console keyboard layout in the initrd.

Partially fixes <https://bugs.gnu.org/25453>.

* gnu/system.scm (<operating-system>)[keyboard-layout]: New field.
(operating-system-initrd-file): Pass #:keyboard-layout to MAKE-INITRD.
* gnu/system/linux-initrd.scm (raw-initrd): Add #:keyboard-layout.
Pass #:keymap-file to 'boot-system'.
(base-initrd): Add #:keyboard-layout.
[helper-packages]: Add LOADKEYS-STATIC when KEYBOARD-LAYOUT is true.
Pass #:keyboard-layout to 'raw-initrd'.
* gnu/build/linux-boot.scm (boot-system): Add #:keymap-file and honor
it.
* doc/guix.texi (operating-system Reference): Document the
'keyboard-layout' field.
(Initial RAM Disk): Update 'raw-initrd' and 'base-initrd' documentation.
master
Ludovic Courtès 2019-03-20 12:19:14 +01:00
parent 48e595b7a8
commit ae7a316b9d
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
4 changed files with 75 additions and 7 deletions

View File

@ -10405,6 +10405,24 @@ 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{keyboard-layout} (default: @code{#f})
This field specifies the keyboard layout to use in the console. It can be
either @code{#f}, in which case the default keyboard layout is used (usually
US English), or a @code{<keyboard-layout>} record.
This keyboard layout is in effect as soon as the kernel has booted. For
instance, it is the keyboard layout in effect when you type a passphrase if
your root file system is on a @code{luks-device-mapping} mapped device
(@pxref{Mapped Devices}).
@quotation Note
This does @emph{not} specify the keyboard layout used by the bootloader, nor
that used by the graphical display server. @xref{Bootloader Configuration},
for information on how to specify the bootloader's keyboard layout. @xref{X
Window}, for information on how to specify the keyboard layout used by the X
Window System.
@end quotation
@item @code{initrd-modules} (default: @code{%base-initrd-modules}) @item @code{initrd-modules} (default: @code{%base-initrd-modules})
@cindex initrd @cindex initrd
@cindex initial RAM disk @cindex initial RAM disk
@ -23493,6 +23511,7 @@ here is how to use it and customize it further.
@cindex initial RAM disk @cindex initial RAM disk
@deffn {Scheme Procedure} raw-initrd @var{file-systems} @ @deffn {Scheme Procedure} raw-initrd @var{file-systems} @
[#:linux-modules '()] [#:mapped-devices '()] @ [#:linux-modules '()] [#:mapped-devices '()] @
[#:keyboard-layout #f] @
[#:helper-packages '()] [#:qemu-networking? #f] [#:volatile-root? #f] [#:helper-packages '()] [#:qemu-networking? #f] [#:volatile-root? #f]
Return a derivation that builds a raw initrd. @var{file-systems} is 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 a list of file systems to be mounted by the initrd, possibly in addition to
@ -23504,6 +23523,12 @@ the root file system specified on the kernel command line via @code{--root}.
include @code{e2fsck/static} or other packages needed by the initrd to check include @code{e2fsck/static} or other packages needed by the initrd to check
the root file system. the root file system.
When true, @var{keyboard-layout} is a @code{<keyboard-layout>} record denoting
the desired console keyboard layout. This is done before @var{mapped-devices}
are set up and before @var{file-systems} are mounted such that, should the
user need to enter a passphrase or use the REPL, this happens using the
intended keyboard layout.
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
initrd can be used as a QEMU guest with para-virtualized I/O drivers. initrd can be used as a QEMU guest with para-virtualized I/O drivers.
@ -23513,7 +23538,8 @@ to it are lost.
@end deffn @end deffn
@deffn {Scheme Procedure} base-initrd @var{file-systems} @ @deffn {Scheme Procedure} base-initrd @var{file-systems} @
[#:mapped-devices '()] [#:qemu-networking? #f] [#:volatile-root? #f]@ [#:mapped-devices '()] [#:keyboard-layout #f] @
[#:qemu-networking? #f] [#:volatile-root? #f] @
[#:linux-modules '()] [#:linux-modules '()]
Return as a file-like object a generic initrd, with kernel 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 modules taken from @var{linux}. @var{file-systems} is a list of file-systems to be
@ -23521,6 +23547,12 @@ mounted by the initrd, possibly in addition to the root file system specified
on the kernel command line via @code{--root}. @var{mapped-devices} is a list of device on the kernel command line via @code{--root}. @var{mapped-devices} is a list of device
mappings to realize before @var{file-systems} are mounted. mappings to realize before @var{file-systems} are mounted.
When true, @var{keyboard-layout} is a @code{<keyboard-layout>} record denoting
the desired console keyboard layout. This is done before @var{mapped-devices}
are set up and before @var{file-systems} are mounted such that, should the
user need to enter a passphrase or use the REPL, this happens using the
intended keyboard layout.
@var{qemu-networking?} and @var{volatile-root?} behaves as in @code{raw-initrd}. @var{qemu-networking?} and @var{volatile-root?} behaves as in @code{raw-initrd}.
The initrd is automatically populated with all the kernel modules necessary The initrd is automatically populated with all the kernel modules necessary

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com> ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
@ -437,6 +437,7 @@ bailing out.~%root contents: ~s~%" (scandir "/"))
(define* (boot-system #:key (define* (boot-system #:key
(linux-modules '()) (linux-modules '())
linux-module-directory linux-module-directory
keymap-file
qemu-guest-networking? qemu-guest-networking?
volatile-root? volatile-root?
pre-mount pre-mount
@ -444,7 +445,8 @@ bailing out.~%root contents: ~s~%" (scandir "/"))
(on-error 'debug)) (on-error 'debug))
"This procedure is meant to be called from an initrd. Boot a system by "This procedure is meant to be called from an initrd. Boot a system by
first loading LINUX-MODULES (a list of module names) from first loading LINUX-MODULES (a list of module names) from
LINUX-MODULE-DIRECTORY, then setting up QEMU guest networking if 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 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 specified in MOUNTS, and finally booting into the new root if any. The initrd
supports kernel command-line options '--load', '--root', and '--repl'. supports kernel command-line options '--load', '--root', and '--repl'.
@ -491,6 +493,15 @@ upon error."
#:lookup-module lookup-module) #:lookup-module lookup-module)
(map lookup-module linux-modules)) (map lookup-module linux-modules))
(when keymap-file
(let ((status (system* "loadkeys" keymap-file)))
(unless (zero? status)
;; Emit a warning rather than abort when we cannot load
;; KEYMAP-FILE.
(format (current-error-port)
"warning: 'loadkeys' exited with status ~a~%"
status))))
(when qemu-guest-networking? (when qemu-guest-networking?
(unless (configure-qemu-networking) (unless (configure-qemu-networking)
(display "network interface is DOWN\n"))) (display "network interface is DOWN\n")))

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com> ;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com> ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
@ -157,6 +157,8 @@
(default '())) ; list of gexps/strings (default '())) ; list of gexps/strings
(bootloader operating-system-bootloader) ; <bootloader-configuration> (bootloader operating-system-bootloader) ; <bootloader-configuration>
(keyboard-layout operating-system-keyboard-layout ;#f | <keyboard-layout>
(default #f))
(initrd operating-system-initrd ; (list fs) -> file-like (initrd operating-system-initrd ; (list fs) -> file-like
(default base-initrd)) (default base-initrd))
(initrd-modules operating-system-initrd-modules ; list of strings (initrd-modules operating-system-initrd-modules ; list of strings
@ -878,7 +880,8 @@ hardware-related operations as necessary when booting a Linux container."
#:linux (operating-system-kernel os) #:linux (operating-system-kernel os)
#:linux-modules #:linux-modules
(operating-system-initrd-modules os) (operating-system-initrd-modules os)
#:mapped-devices mapped-devices)) #:mapped-devices mapped-devices
#:keyboard-layout (operating-system-keyboard-layout os)))
(define (locale-name->definition* name) (define (locale-name->definition* name)
"Variant of 'locale-name->definition' that raises an error upon failure." "Variant of 'locale-name->definition' that raises an error upon failure."

View File

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 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> ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
@ -31,10 +31,13 @@
#:use-module (gnu packages disk) #:use-module (gnu packages disk)
#:use-module (gnu packages linux) #:use-module (gnu packages linux)
#:use-module (gnu packages guile) #:use-module (gnu packages guile)
#:use-module ((gnu packages xorg)
#:select (console-setup xkeyboard-config))
#:use-module ((gnu packages make-bootstrap) #:use-module ((gnu packages make-bootstrap)
#:select (%guile-static-stripped)) #:select (%guile-static-stripped))
#:use-module (gnu system file-systems) #:use-module (gnu system file-systems)
#:use-module (gnu system mapped-devices) #:use-module (gnu system mapped-devices)
#:use-module (gnu system keyboard)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (ice-9 regex) #:use-module (ice-9 regex)
#:use-module (ice-9 vlist) #:use-module (ice-9 vlist)
@ -139,6 +142,7 @@ MODULES and taken from LINUX."
(linux linux-libre) (linux linux-libre)
(linux-modules '()) (linux-modules '())
(mapped-devices '()) (mapped-devices '())
(keyboard-layout #f)
(helper-packages '()) (helper-packages '())
qemu-networking? qemu-networking?
volatile-root? volatile-root?
@ -152,6 +156,11 @@ mappings to realize before FILE-SYSTEMS are mounted.
HELPER-PACKAGES is a list of packages to be copied in the initrd. It may include 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. e2fsck/static or other packages needed by the initrd to check root partition.
When true, KEYBOARD-LAYOUT is a <keyboard-layout> record denoting the desired
console keyboard layout. This is done before MAPPED-DEVICES are set up and
before FILE-SYSTEMS are mounted such that, should the user need to enter a
passphrase or use the REPL, this happens using the intended keyboard layout.
When QEMU-NETWORKING? is true, set up networking with the standard QEMU When QEMU-NETWORKING? is true, set up networking with the standard QEMU
parameters. parameters.
@ -206,6 +215,8 @@ upon error."
(and #$@device-mapping-commands)) (and #$@device-mapping-commands))
#:linux-modules '#$linux-modules #:linux-modules '#$linux-modules
#:linux-module-directory '#$kodir #:linux-module-directory '#$kodir
#:keymap-file #+(and=> keyboard-layout
keyboard-layout->console-keymap)
#:qemu-guest-networking? #$qemu-networking? #:qemu-guest-networking? #$qemu-networking?
#:volatile-root? '#$volatile-root? #:volatile-root? '#$volatile-root?
#:on-error '#$on-error))) #:on-error '#$on-error)))
@ -290,6 +301,7 @@ FILE-SYSTEMS."
(linux linux-libre) (linux linux-libre)
(linux-modules '()) (linux-modules '())
(mapped-devices '()) (mapped-devices '())
(keyboard-layout #f)
qemu-networking? qemu-networking?
volatile-root? volatile-root?
(extra-modules '()) ;deprecated (extra-modules '()) ;deprecated
@ -300,6 +312,11 @@ 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 true, KEYBOARD-LAYOUT is a <keyboard-layout> record denoting the desired
console keyboard layout. This is done before MAPPED-DEVICES are set up and
before FILE-SYSTEMS are mounted such that, should the user need to enter a
passphrase or use the REPL, this happens using the intended keyboard layout.
QEMU-NETWORKING? and VOLATILE-ROOT? behaves as in raw-initrd. QEMU-NETWORKING? and VOLATILE-ROOT? behaves as in raw-initrd.
The initrd is automatically populated with all the kernel modules necessary The initrd is automatically populated with all the kernel modules necessary
@ -316,13 +333,18 @@ loaded at boot time in the order in which they appear."
,@extra-modules)) ,@extra-modules))
(define helper-packages (define helper-packages
(file-system-packages file-systems #:volatile-root? volatile-root?)) (append (file-system-packages file-systems
#:volatile-root? volatile-root?)
(if keyboard-layout
(list loadkeys-static)
'())))
(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
#:keyboard-layout keyboard-layout
#:qemu-networking? qemu-networking? #:qemu-networking? qemu-networking?
#:volatile-root? volatile-root? #:volatile-root? volatile-root?
#:on-error on-error)) #:on-error on-error))