Package: guix-patches;
Reported by: Denis 'GNUtoo' Carikli <GNUtoo <at> cyberdimension.org>
Date: Mon, 9 May 2022 23:18:02 UTC
Severity: normal
Done: Mathieu Othacehe <othacehe <at> gnu.org>
Bug is archived. No further changes may be made.
Message #11 received at 55343 <at> debbugs.gnu.org (full text, mbox):
From: Denis 'GNUtoo' Carikli <GNUtoo <at> cyberdimension.org> To: 55343 <at> debbugs.gnu.org Cc: Denis 'GNUtoo' Carikli <GNUtoo <at> cyberdimension.org> Subject: [PATCH 2/2] image: Add new efi32-raw format for 32bit UEFI on 64bit systems Date: Tue, 10 May 2022 01:24:51 +0200
* gnu/bootloader/grub.scm (grub-efi32-bootloader): New variable. (install-grub-efi32): New variable * gnu/build/bootloader.scm (install-efi32-loader): New variable. (install-efi32-loader): New variable. * gnu/build/image.scm (initialize-efi32-partition): New variable * gnu/packages/bootloaders.scm (grub-efi32): New variable. * gnu/system/image.scm (esp32-partition): New variable (efi32-disk-image): New variable (efi32-raw-image-type): New variable. (partition-image): Add partition-image keyword --- gnu/bootloader/grub.scm | 32 +++++++++++++++++++++++++ gnu/build/bootloader.scm | 46 +++++++++++++++++++++++++++++++++++- gnu/build/image.scm | 9 +++++++ gnu/packages/bootloaders.scm | 13 ++++++++++ gnu/system/image.scm | 19 +++++++++++++++ 5 files changed, 118 insertions(+), 1 deletion(-) diff --git a/gnu/bootloader/grub.scm b/gnu/bootloader/grub.scm index 120cd55012..1ea356030f 100644 --- a/gnu/bootloader/grub.scm +++ b/gnu/bootloader/grub.scm @@ -7,6 +7,7 @@ ;;; Copyright © 2019, 2020 Miguel Ángel Arruga Vivas <rosen644835 <at> gmail.com> ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer <at> gmail.com> ;;; Copyright © 2020 Stefan <stefan-guix <at> vodafonemail.de> +;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo <at> cyberdimension.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -54,6 +55,7 @@ (define-module (gnu bootloader grub) grub-bootloader grub-efi-bootloader + grub-efi32-bootloader grub-efi-netboot-bootloader grub-mkrescue-bootloader grub-minimal-bootloader @@ -608,6 +610,29 @@ (define install-grub-efi "--bootloader-id=Guix" "--efi-directory" target-esp))))) +(define install-grub-efi32 + #~(lambda (bootloader efi-dir mount-point) + ;; 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 + "--bootloader-id=Guix" + (cond ((target-x86?) "--target=i386-efi") + ((target-arm?) "--target=arm-efi")) + "--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 +759,13 @@ (define grub-efi-bootloader (name 'grub-efi) (package grub-efi))) +(define grub-efi32-bootloader + (bootloader + (inherit grub-efi-bootloader) + (installer install-grub-efi32) + (name 'grub-efi32) + (package grub-efi32))) + (define grub-efi-netboot-bootloader (bootloader (inherit grub-efi-bootloader) diff --git a/gnu/build/bootloader.scm b/gnu/build/bootloader.scm index 9a89fe55cb..d41143d98e 100644 --- a/gnu/build/bootloader.scm +++ b/gnu/build/bootloader.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe <at> gmail.com> ;;; Copyright © 2019 Ludovic Courtès <ludo <at> gnu.org> +;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo <at> cyberdimension.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -25,7 +26,8 @@ (define-module (gnu build bootloader) #:use-module (rnrs io ports) #:use-module (rnrs io simple) #:export (write-file-on-device - install-efi-loader)) + install-efi-loader + install-efi32-loader)) ;;; @@ -81,6 +83,29 @@ (define (install-efi grub grub-config esp) ;; Graft the configuration file onto the image. (string-append "boot/grub/grub.cfg=" grub-config)))) +(define (install-efi32 grub grub-config esp) + "Write a self-contained GRUB EFI 32bit loader to the mounted ESP using GRUB-CONFIG." + (let* ((system %host-type) + ;; Hard code the output location to a well-known path recognized by + ;; compliant firmware. See "3.5.1.1 Removable Media Boot Behaviour": + ;; http://www.uefi.org/sites/default/files/resources/UEFI%20Spec%202_6.pdf + (grub-mkstandalone (string-append grub "/bin/grub-mkstandalone")) + (efi-directory (string-append esp "/EFI/BOOT")) + ;; Map grub target names to boot file names. + (efi-targets (cond ((target-x86?) + '("i386-efi" . "BOOTIA32.EFI")) + ((target-arm?) + '("arm-efi" . "BOOTARM.EFI"))))) + ;; grub-mkstandalone requires a TMPDIR to prepare the firmware image. + (setenv "TMPDIR" esp) + + (mkdir-p efi-directory) + (invoke grub-mkstandalone "-O" (car efi-targets) + "-o" (string-append efi-directory "/" + (cdr efi-targets)) + ;; Graft the configuration file onto the image. + (string-append "boot/grub/grub.cfg=" grub-config)))) + (define (install-efi-loader grub-efi esp) "Install in ESP directory the given GRUB-EFI bootloader. Configure it to load the Grub bootloader located in the 'Guix_image' root partition." @@ -99,3 +124,22 @@ (define (install-efi-loader grub-efi esp) configfile /boot/grub/grub.cfg~%"))) (install-efi grub-efi grub-config esp) (delete-file grub-config))) + +(define (install-efi32-loader grub-efi32 esp) + "Install in ESP directory the given GRUB-EFI 32bit bootloader. Configure it +to load the Grub bootloader located in the 'Guix_image' root partition." + (let ((grub-config "grub.cfg")) + (call-with-output-file grub-config + (lambda (port) + ;; Create a tiny configuration file telling the embedded grub where to + ;; load the real thing. XXX This is quite fragile, and can prevent + ;; the image from booting when there's more than one volume with this + ;; label present. Reproducible almost-UUIDs could reduce the risk + ;; (not eliminate it). + (format port + "insmod part_msdos~@ + insmod part_gpt~@ + search --set=root --label Guix_image~@ + configfile /boot/grub/grub.cfg~%"))) + (install-efi32 grub-efi32 grub-config esp) + (delete-file grub-config))) diff --git a/gnu/build/image.scm b/gnu/build/image.scm index 81caa424f8..bae747494f 100644 --- a/gnu/build/image.scm +++ b/gnu/build/image.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2017 Marius Bakke <mbakke <at> fastmail.com> ;;; Copyright © 2020, 2022 Tobias Geerinckx-Rice <me <at> tobias.gr> ;;; Copyright © 2020 Mathieu Othacehe <m.othacehe <at> gmail.com> +;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo <at> cyberdimension.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -40,6 +41,7 @@ (define-module (gnu build image) convert-disk-image genimage initialize-efi-partition + initialize-efi32-partition initialize-root-partition make-iso9660-image)) @@ -162,6 +164,13 @@ (define* (initialize-efi-partition root "Install in ROOT directory, an EFI loader using GRUB-EFI." (install-efi-loader grub-efi root)) +(define* (initialize-efi32-partition root + #:key + grub-efi32 + #:allow-other-keys) + "Install in ROOT directory, an EFI 32bit loader using GRUB-EFI32." + (install-efi32-loader grub-efi32 root)) + (define* (initialize-root-partition root #:key bootcfg diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm index 7ea6f5a647..f133d9f604 100644 --- a/gnu/packages/bootloaders.scm +++ b/gnu/packages/bootloaders.scm @@ -15,6 +15,7 @@ ;;; Copyright © 2020, 2021 Pierre Langlois <pierre.langlois <at> gmx.com> ;;; Copyright © 2021 Vincent Legoll <vincent.legoll <at> gmail.com> ;;; Copyright © 2021 Brice Waegeneire <brice <at> waegenei.re> +;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo <at> cyberdimension.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -332,6 +333,18 @@ (define-public grub-efi "/bin/mcopy\""))) #t)))))))))) +(define-public grub-efi32 + (package + (inherit grub-efi) + (name "grub-efi32") + (synopsis "GRand Unified Boot loader (UEFI 32bit version)") + (arguments + `(,@(substitute-keyword-arguments (package-arguments grub-efi) + ((#:configure-flags flags + ''()) `(cons* ,(cond ((target-x86?) "--target=i386") + ((target-arm?) "--target=arm")) + ,flags))))))) + ;; Because grub searches hardcoded paths it's easiest to just build grub ;; again to make it find both grub-pc and grub-efi. There is a command ;; line argument which allows you to specify ONE platform - but diff --git a/gnu/system/image.scm b/gnu/system/image.scm index 42e215f614..e35c54ca50 100644 --- a/gnu/system/image.scm +++ b/gnu/system/image.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020, 2021 Mathieu Othacehe <m.othacehe <at> gmail.com> ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke <at> gnu.org> +;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo <at> cyberdimension.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -65,6 +66,7 @@ (define-module (gnu system image) root-label esp-partition + esp32-partition root-partition efi-disk-image @@ -74,6 +76,7 @@ (define-module (gnu system image) image-with-os efi-raw-image-type + efi32-raw-image-type qcow2-image-type iso-image-type uncompressed-iso-image-type @@ -109,6 +112,11 @@ (define esp-partition (flags '(esp)) (initializer (gexp initialize-efi-partition)))) +(define esp32-partition + (partition + (inherit esp-partition) + (initializer (gexp initialize-efi32-partition)))) + (define root-partition (partition (size 'guess) @@ -122,6 +130,11 @@ (define efi-disk-image (format 'disk-image) (partitions (list esp-partition root-partition)))) +(define efi32-disk-image + (image + (format 'disk-image) + (partitions (list esp32-partition root-partition)))) + (define iso9660-image (image (format 'iso9660) @@ -163,6 +176,11 @@ (define efi-raw-image-type (name 'efi-raw) (constructor (cut image-with-os efi-disk-image <>)))) +(define efi32-raw-image-type + (image-type + (name 'efi32-raw) + (constructor (cut image-with-os efi32-disk-image <>)))) + (define qcow2-image-type (image-type (name 'qcow2) @@ -352,6 +370,7 @@ (define (partition-image partition) #$(image-shared-store? image)) #:system-directory #$os #:grub-efi #+grub-efi + #:grub-efi32 #+grub-efi32 #:bootloader-package #+(bootloader-package bootloader) #:bootloader-installer -- 2.36.0
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.