bootloader: grub: Add support for multiboot.

* gnu/bootloader/grub.scm (grub-configuration-file): Add support for
multiboot.
This commit is contained in:
Jan (janneke) Nieuwenhuizen 2020-05-26 18:09:01 +02:00 committed by Jan Nieuwenhuizen
parent 912b857ede
commit 1244491a0d
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273

View file

@ -330,36 +330,58 @@ when booting a root file system on a Btrfs subvolume."
(define all-entries (define all-entries
(append entries (bootloader-configuration-menu-entries config))) (append entries (bootloader-configuration-menu-entries config)))
(define (menu-entry->gexp entry) (define (menu-entry->gexp entry)
(let* ((device (menu-entry-device entry)) (let ((label (menu-entry-label entry))
(device-mount-point (menu-entry-device-mount-point entry)) (linux (menu-entry-linux entry))
(label (menu-entry-label entry)) (device (menu-entry-device entry))
(arguments (menu-entry-linux-arguments entry)) (device-mount-point (menu-entry-device-mount-point entry)))
(kernel (normalize-file (menu-entry-linux entry) (if linux
(let ((arguments (menu-entry-linux-arguments entry))
(linux (normalize-file linux
device-mount-point device-mount-point
store-directory-prefix)) store-directory-prefix))
(initrd (normalize-file (menu-entry-initrd entry) (initrd (normalize-file (menu-entry-initrd entry)
device-mount-point device-mount-point
store-directory-prefix))) store-directory-prefix)))
;; Here DEVICE is the store and DEVICE-MOUNT-POINT is its mount point. ;; Here DEVICE is the store and DEVICE-MOUNT-POINT is its mount point.
;; Use the right file names for KERNEL and INITRD in case ;; Use the right file names for LINUX and INITRD in case
;; DEVICE-MOUNT-POINT is not "/", meaning that the store is on a ;; DEVICE-MOUNT-POINT is not "/", meaning that the store is on a
;; separate partition. ;; separate partition.
;; When BTRFS-SUBVOLUME-FILE-NAME is defined, prepend it the linux and
;; initrd paths, to allow booting from a Btrfs subvolume.
#~(format port "menuentry ~s { #~(format port "menuentry ~s {
~a ~a
linux ~a ~a linux ~a ~a
initrd ~a initrd ~a
}~%" }~%"
#$label #$label
#$(grub-root-search device kernel) #$(grub-root-search device linux)
#$kernel (string-join (list #$@arguments)) #$linux (string-join (list #$@arguments))
#$initrd))) #$initrd))
(define sugar (let ((kernel (menu-entry-multiboot-kernel entry))
(arguments (menu-entry-multiboot-arguments entry))
(modules (menu-entry-multiboot-modules entry))
(root-index 1)) ; XXX EFI will need root-index 2
#~(format port "
menuentry ~s {
multiboot ~a root=device:hd0s~a~a~a
}~%"
#$label
#$kernel
#$root-index (string-join (list #$@arguments) " " 'prefix)
(string-join (map string-join '#$modules)
"\n module " 'prefix))))))
(define (sugar)
(let* ((entry (first all-entries))
(device (menu-entry-device entry))
(mount-point (menu-entry-device-mount-point entry)))
(eye-candy config (eye-candy config
(menu-entry-device (first all-entries)) device
(menu-entry-device-mount-point (first all-entries)) mount-point
#:store-directory-prefix store-directory-prefix #:store-directory-prefix store-directory-prefix
#:system system #:system system
#:port #~port)) #:port #~port)))
(define keyboard-layout-config (define keyboard-layout-config
(let* ((layout (bootloader-configuration-keyboard-layout config)) (let* ((layout (bootloader-configuration-keyboard-layout config))
@ -384,7 +406,7 @@ keymap ~a~%" #$keymap))))
"# This file was generated from your Guix configuration. Any changes "# This file was generated from your Guix configuration. Any changes
# will be lost upon reconfiguration. # will be lost upon reconfiguration.
") ")
#$sugar #$(sugar)
#$keyboard-layout-config #$keyboard-layout-config
(format port " (format port "
set default=~a set default=~a