diff --git a/doc/guix.texi b/doc/guix.texi index d069b7f0e6..7bedb8660e 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -103,6 +103,7 @@ Copyright @copyright{} 2021 Josselin Poiret@* Copyright @copyright{} 2022 Remco van 't Veer@* Copyright @copyright{} 2022 Aleksandr Vityazev@* Copyright @copyright{} 2022 Philip M@sup{c}Grath@* +Copyright @copyright{} 2022 Karl Hallsby@* Permission is granted to copy, distribute and/or modify this document 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 The bootloader to use, as a @code{bootloader} object. For now @code{grub-bootloader}, @code{grub-efi-bootloader}, -@code{grub-efi-netboot-bootloader}, @code{extlinux-bootloader} and -@code{u-boot-bootloader} are supported. +@code{grub-efi-netboot-bootloader}, @code{grub-efi-removable-bootloader}, +@code{extlinux-bootloader} and @code{u-boot-bootloader} are supported. @cindex ARM, 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 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} This is a list of strings denoting the targets onto which to install the 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 understood by the bootloader @command{installer} command, such as @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 @code{grub-efi-netboot-bootloader}, @code{targets} should be the mount points corresponding to TFTP root directories served by your TFTP diff --git a/gnu/bootloader/grub.scm b/gnu/bootloader/grub.scm index 120cd55012..65d7171432 100644 --- a/gnu/bootloader/grub.scm +++ b/gnu/bootloader/grub.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2019, 2020 Miguel Ángel Arruga Vivas ;;; Copyright © 2020 Maxim Cournoyer ;;; Copyright © 2020 Stefan +;;; Copyright © 2022 Karl Hallsby ;;; ;;; This file is part of GNU Guix. ;;; @@ -50,10 +51,12 @@ grub-theme-color-highlight grub-theme-gfxmode + install-grub-efi-removable install-grub-efi-netboot grub-bootloader grub-efi-bootloader + grub-efi-removable-bootloader grub-efi-netboot-bootloader grub-mkrescue-bootloader grub-minimal-bootloader @@ -608,6 +611,31 @@ fi~%")))) "--bootloader-id=Guix" "--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 a grub-efi-netboot bootloader installer for installation in SUBDIR, which is usually efi/Guix or efi/boot." @@ -734,6 +762,12 @@ considered for security aspects." (name '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 (bootloader (inherit grub-efi-bootloader)