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.
This commit is contained in:
		
							parent
							
								
									48e595b7a8
								
							
						
					
					
						commit
						ae7a316b9d
					
				
					 4 changed files with 75 additions and 7 deletions
				
			
		|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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"))) | ||||||
|  |  | ||||||
|  | @ -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." | ||||||
|  |  | ||||||
|  | @ -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)) | ||||||
|  |  | ||||||
		Reference in a new issue