bootloader: grub: Add removable grub-efi bootloader option.

For single-disk installs (external USBs) and for amnesiac UEFIs, Guix is not
found using its default Grub EFI bootloader location of
/boot/efi/EFI/Guix/grubx64.efi means the Guix install will not be found.

To handle this, we can place the bootloader file in the UEFI specification
location, overwriting any other OS that may have placed a file there. This
location is namely /boot/efi/EFI/BOOT/BOOTX64.efi. Grub has explicit support
for this location/situation with the `--removable` flag.

* gnu/bootloader/grub.scm (install-grub-efi-removable)
(grub-efi-removable-bootloader): New variables.
* doc/guix.texi (Bootloader Configuration): Document it.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Karl Hallsby 2022-05-24 23:32:54 -05:00 committed by Ludovic Courtès
parent e614cf2907
commit 618f665a5f
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 53 additions and 3 deletions

View File

@ -103,6 +103,7 @@ Copyright @copyright{} 2021 Josselin Poiret@*
Copyright @copyright{} 2022 Remco van 't Veer@* Copyright @copyright{} 2022 Remco van 't Veer@*
Copyright @copyright{} 2022 Aleksandr Vityazev@* Copyright @copyright{} 2022 Aleksandr Vityazev@*
Copyright @copyright{} 2022 Philip M@sup{c}Grath@* Copyright @copyright{} 2022 Philip M@sup{c}Grath@*
Copyright @copyright{} 2022 Karl Hallsby@*
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or under the terms of the GNU Free Documentation License, Version 1.3 or
@ -36270,8 +36271,8 @@ The type of a bootloader configuration declaration.
@cindex BIOS, bootloader @cindex BIOS, bootloader
The bootloader to use, as a @code{bootloader} object. For now The bootloader to use, as a @code{bootloader} object. For now
@code{grub-bootloader}, @code{grub-efi-bootloader}, @code{grub-bootloader}, @code{grub-efi-bootloader},
@code{grub-efi-netboot-bootloader}, @code{extlinux-bootloader} and @code{grub-efi-netboot-bootloader}, @code{grub-efi-removable-bootloader},
@code{u-boot-bootloader} are supported. @code{extlinux-bootloader} and @code{u-boot-bootloader} are supported.
@cindex ARM, bootloaders @cindex ARM, bootloaders
@cindex AArch64, bootloaders @cindex AArch64, bootloaders
@ -36340,6 +36341,20 @@ NFS servers, you also need a properly configured DHCP server to make the booting
over netboot possible. For all this we can currently only recommend you to look over netboot possible. For all this we can currently only recommend you to look
for instructions about @acronym{PXE, Preboot eXecution Environment}. for instructions about @acronym{PXE, Preboot eXecution Environment}.
@vindex grub-efi-removable-bootloader
@code{grub-efi-removable-bootloader} allows you to boot your system from
removable media by writing the GRUB file to the UEFI-specification location of
@file{/EFI/BOOT/BOOTX64.efi} of the boot directory, usually @file{/boot/efi}.
This is also useful for some UEFI firmwares that ``forget'' their configuration
from their non-volatile storage. Like @code{grub-efi-bootloader}, this can only
be used if the @file{/sys/firmware/efi} directory is available.
@quotation Note
This @emph{will} overwrite the GRUB file from any other operating systems that
also place their GRUB file in the UEFI-specification location; making them
unbootable.
@end quotation
@item @code{targets} @item @code{targets}
This is a list of strings denoting the targets onto which to install the This is a list of strings denoting the targets onto which to install the
bootloader. bootloader.
@ -36348,7 +36363,8 @@ The interpretation of targets depends on the bootloader in question.
For @code{grub-bootloader}, for example, they should be device names For @code{grub-bootloader}, for example, they should be device names
understood by the bootloader @command{installer} command, such as understood by the bootloader @command{installer} command, such as
@code{/dev/sda} or @code{(hd0)} (@pxref{Invoking grub-install,,, grub, @code{/dev/sda} or @code{(hd0)} (@pxref{Invoking grub-install,,, grub,
GNU GRUB Manual}). For @code{grub-efi-bootloader}, they should be mount GNU GRUB Manual}). For @code{grub-efi-bootloader} and
@code{grub-efi-removable-bootloader} they should be mount
points of the EFI file system, usually @file{/boot/efi}. For points of the EFI file system, usually @file{/boot/efi}. For
@code{grub-efi-netboot-bootloader}, @code{targets} should be the mount @code{grub-efi-netboot-bootloader}, @code{targets} should be the mount
points corresponding to TFTP root directories served by your TFTP points corresponding to TFTP root directories served by your TFTP

View File

@ -7,6 +7,7 @@
;;; Copyright © 2019, 2020 Miguel Ángel Arruga Vivas <rosen644835@gmail.com> ;;; Copyright © 2019, 2020 Miguel Ángel Arruga Vivas <rosen644835@gmail.com>
;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2020 Stefan <stefan-guix@vodafonemail.de> ;;; Copyright © 2020 Stefan <stefan-guix@vodafonemail.de>
;;; Copyright © 2022 Karl Hallsby <karl@hallsby.com>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -50,10 +51,12 @@
grub-theme-color-highlight grub-theme-color-highlight
grub-theme-gfxmode grub-theme-gfxmode
install-grub-efi-removable
install-grub-efi-netboot install-grub-efi-netboot
grub-bootloader grub-bootloader
grub-efi-bootloader grub-efi-bootloader
grub-efi-removable-bootloader
grub-efi-netboot-bootloader grub-efi-netboot-bootloader
grub-mkrescue-bootloader grub-mkrescue-bootloader
grub-minimal-bootloader grub-minimal-bootloader
@ -608,6 +611,31 @@ fi~%"))))
"--bootloader-id=Guix" "--bootloader-id=Guix"
"--efi-directory" target-esp))))) "--efi-directory" target-esp)))))
(define install-grub-efi-removable
#~(lambda (bootloader efi-dir mount-point)
;; NOTE: mount-point is /mnt in guix system init /etc/config.scm /mnt/point
;; NOTE: efi-dir comes from target list of booloader configuration
;; There is nothing useful to do when called in the context of a disk
;; image generation.
(when efi-dir
;; Install GRUB onto the EFI partition mounted at EFI-DIR, for the
;; system whose root is mounted at MOUNT-POINT.
(let ((grub-install (string-append bootloader "/sbin/grub-install"))
(install-dir (string-append mount-point "/boot"))
;; When installing Guix, it's common to mount EFI-DIR below
;; MOUNT-POINT rather than /boot/efi on the live image.
(target-esp (if (file-exists? (string-append mount-point efi-dir))
(string-append mount-point efi-dir)
efi-dir)))
;; Tell 'grub-install' that there might be a LUKS-encrypted /boot or
;; root partition.
(setenv "GRUB_ENABLE_CRYPTODISK" "y")
(invoke/quiet grub-install "--boot-directory" install-dir
"--removable"
;; "--no-nvram"
"--bootloader-id=Guix"
"--efi-directory" target-esp)))))
(define (install-grub-efi-netboot subdir) (define (install-grub-efi-netboot subdir)
"Define a grub-efi-netboot bootloader installer for installation in SUBDIR, "Define a grub-efi-netboot bootloader installer for installation in SUBDIR,
which is usually efi/Guix or efi/boot." which is usually efi/Guix or efi/boot."
@ -734,6 +762,12 @@ considered for security aspects."
(name 'grub-efi) (name 'grub-efi)
(package grub-efi))) (package grub-efi)))
(define grub-efi-removable-bootloader
(bootloader
(inherit grub-efi-bootloader)
(name 'grub-efi-removable-bootloader)
(installer install-grub-efi-removable)))
(define grub-efi-netboot-bootloader (define grub-efi-netboot-bootloader
(bootloader (bootloader
(inherit grub-efi-bootloader) (inherit grub-efi-bootloader)