mirror of
https://codeberg.org/guix/guix.git
synced 2025-10-02 02:15:12 +00:00
bootloader: grub: Remove hardcoded partition number for the Hurd.
This supports using another than the default DISK0 PART1 and using LABEL or UUID as root file-system specifier. It still defaults to DISK0 PART1 if the file-system cannot be found, i.e., lives only at the build side: A virtual machine/childhurd build. * gnu/build/file-systems.scm (%hurd-device-spec-regexp, %device-spec-regexp): New variables. (device-name->hurd-device-name, hurd-device-name->device-name, device-spec->device, device-spec->device-name): Use them in new procedures. * gnu/bootloader/grub.scm (make-grub-configuration): Use them to remove hardcoded partition number (root-index 1). Change-Id: I49fa93dacc09883dfb4d695402c5eac2e0e17286
This commit is contained in:
parent
046d6d9f8e
commit
fdb23d9db8
2 changed files with 71 additions and 6 deletions
|
@ -3,7 +3,7 @@
|
||||||
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
|
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
|
||||||
;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
|
;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
|
||||||
;;; Copyright © 2017, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
;;; Copyright © 2017, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||||
;;; Copyright © 2019, 2020, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
|
;;; Copyright © 2019, 2020, 2023, 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
|
||||||
;;; 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>
|
||||||
|
@ -34,6 +34,7 @@
|
||||||
#:use-module (guix gexp)
|
#:use-module (guix gexp)
|
||||||
#:use-module (gnu artwork)
|
#:use-module (gnu artwork)
|
||||||
#:use-module (gnu bootloader)
|
#:use-module (gnu bootloader)
|
||||||
|
#:use-module (gnu build file-systems)
|
||||||
#:use-module (gnu system uuid)
|
#:use-module (gnu system uuid)
|
||||||
#:use-module (gnu system file-systems)
|
#:use-module (gnu system file-systems)
|
||||||
#:use-module (gnu system keyboard)
|
#:use-module (gnu system keyboard)
|
||||||
|
@ -45,6 +46,7 @@
|
||||||
#:use-module (ice-9 regex)
|
#:use-module (ice-9 regex)
|
||||||
#:use-module (srfi srfi-1)
|
#:use-module (srfi srfi-1)
|
||||||
#:use-module (srfi srfi-2)
|
#:use-module (srfi srfi-2)
|
||||||
|
#:use-module (srfi srfi-26)
|
||||||
#:export (grub-theme
|
#:export (grub-theme
|
||||||
grub-theme?
|
grub-theme?
|
||||||
grub-theme-image
|
grub-theme-image
|
||||||
|
@ -355,6 +357,11 @@ code."
|
||||||
((or #f (? string?))
|
((or #f (? string?))
|
||||||
#~(format #f "search --file --set ~a" #$file)))))
|
#~(format #f "search --file --set ~a" #$file)))))
|
||||||
|
|
||||||
|
(define* (device->hurd-device-name device-spec #:key (disk "w"))
|
||||||
|
"Return DEVICE as a Hurd name spec: part:PART-NUMBER:device:DISKdDISK-INDEX."
|
||||||
|
(let ((device-name (canonicalize-device-spec device-spec)))
|
||||||
|
(device-name->hurd-device-name device-name #:disk disk)))
|
||||||
|
|
||||||
(define* (make-grub-configuration grub config entries
|
(define* (make-grub-configuration grub config entries
|
||||||
#:key
|
#:key
|
||||||
(locale #f)
|
(locale #f)
|
||||||
|
@ -413,16 +420,16 @@ when booting a root file system on a Btrfs subvolume."
|
||||||
;; IDE driver ("hdX") and those understood by rumpdisk ("wdX"
|
;; IDE driver ("hdX") and those understood by rumpdisk ("wdX"
|
||||||
;; in the "noide" case).
|
;; in the "noide" case).
|
||||||
(disk (if (member "noide" arguments) "w" "h"))
|
(disk (if (member "noide" arguments) "w" "h"))
|
||||||
(modules (menu-entry-multiboot-modules entry))
|
(device-spec (and=> device file-system-device->string))
|
||||||
(root-index 1)) ; XXX EFI will need root-index 2
|
(device-name (and=> device-spec device-spec->device-name))
|
||||||
|
(modules (menu-entry-multiboot-modules entry)))
|
||||||
#~(format port "
|
#~(format port "
|
||||||
menuentry ~s {
|
menuentry ~s {
|
||||||
multiboot ~a root=part:~a:device:~ad0~a~a
|
multiboot ~a root=~a~a~a
|
||||||
}~%"
|
}~%"
|
||||||
#$label
|
#$label
|
||||||
#$kernel
|
#$kernel
|
||||||
#$root-index
|
#$(device-name->hurd-device-name device-name #:disk disk)
|
||||||
#$disk
|
|
||||||
(string-join (list #$@arguments) " " 'prefix)
|
(string-join (list #$@arguments) " " 'prefix)
|
||||||
(string-join (map string-join '#$modules)
|
(string-join (map string-join '#$modules)
|
||||||
"\n module " 'prefix))))
|
"\n module " 'prefix))))
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
;;; Copyright © 2022 Oleg Pykhalov <go.wigust@gmail.com>
|
;;; Copyright © 2022 Oleg Pykhalov <go.wigust@gmail.com>
|
||||||
;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr>
|
;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr>
|
||||||
;;; Copyright © 2024 Richard Sent <richard@freakingpenguin.com>
|
;;; Copyright © 2024 Richard Sent <richard@freakingpenguin.com>
|
||||||
|
;;; Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -53,6 +54,11 @@
|
||||||
find-partition-by-luks-uuid
|
find-partition-by-luks-uuid
|
||||||
canonicalize-device-spec
|
canonicalize-device-spec
|
||||||
|
|
||||||
|
device-name->hurd-device-name
|
||||||
|
device-spec->device
|
||||||
|
device-spec->device-name
|
||||||
|
hurd-device-name->device-name
|
||||||
|
|
||||||
read-partition-label
|
read-partition-label
|
||||||
read-partition-uuid
|
read-partition-uuid
|
||||||
read-luks-partition-uuid
|
read-luks-partition-uuid
|
||||||
|
@ -1431,4 +1437,56 @@ corresponds to the symbols listed in FLAGS."
|
||||||
(or (file-system-mount-may-fail? fs)
|
(or (file-system-mount-may-fail? fs)
|
||||||
(apply throw args))))))
|
(apply throw args))))))
|
||||||
|
|
||||||
|
(define %device-name-regexp "/dev/[hsvw]d([abcd])([0-9]*)")
|
||||||
|
(define %hurd-device-name-regexp "part:([0-9]*):device:[hw]d([0-9]*)")
|
||||||
|
|
||||||
|
(define (device-spec->device-name device-spec)
|
||||||
|
"Return DEVICE-SPEC as a Linux /dev/XdYZ device name, also catering for uuid
|
||||||
|
or label."
|
||||||
|
(cond ((string-match %device-name-regexp device-spec)
|
||||||
|
device-spec)
|
||||||
|
((string-match %hurd-device-name-regexp device-spec)
|
||||||
|
(hurd-device-name->device-name device-spec))
|
||||||
|
((string->uuid device-spec)
|
||||||
|
=>
|
||||||
|
(lambda (uuid) (false-if-exception (find-partition-by-uuid uuid))))
|
||||||
|
(else
|
||||||
|
(false-if-exception (find-partition-by-label device-spec)))))
|
||||||
|
|
||||||
|
(define* (device-name->hurd-device-name device-name #:key (disk "w"))
|
||||||
|
"Return DEVICE-NAME as a Hurd device name:
|
||||||
|
part:PART-NUMBER:device:DISKdDISK-INDEX
|
||||||
|
Default to part:1:device:DISKd0 if partition cannot be found."
|
||||||
|
(let* ((m (and=> device-name (cute string-match %device-name-regexp <>)))
|
||||||
|
(disk-char (and m (and=> (match:substring m 1)
|
||||||
|
(compose car string->list))))
|
||||||
|
(disk-index (or (and disk-char
|
||||||
|
(- (char->integer disk-char) (char->integer #\a)))
|
||||||
|
0))
|
||||||
|
(partition-number (or (and m (and=> (match:substring m 2)
|
||||||
|
string->number))
|
||||||
|
1)))
|
||||||
|
(format #f "part:~a:device:~ad~a" partition-number disk disk-index)))
|
||||||
|
|
||||||
|
(define* (hurd-device-name->device-name device-name #:key (disk "s"))
|
||||||
|
(let* ((m (and=> device-name (cute string-match %hurd-device-name-regexp <>)))
|
||||||
|
(disk-index-string (and=> m (cute match:substring <> 2)))
|
||||||
|
(disk-index (or (and=> disk-index-string string->number)
|
||||||
|
0))
|
||||||
|
(disk-index-char (integer->char (+ disk-index (char->integer #\a))))
|
||||||
|
(partition-string (and=> m (cute match:substring <> 1)))
|
||||||
|
(partition-number (or (and=> partition-string string->number)
|
||||||
|
1)))
|
||||||
|
(format #f "/dev/~ad~a~a" disk disk-index-char partition-number)))
|
||||||
|
|
||||||
|
(define (device-spec->device device-spec)
|
||||||
|
"Return DEVICE-SPEC as UUID, FILE-SYSTEM-LABEL, or DEVICE-SPEC."
|
||||||
|
(cond ((and=> (string->uuid device-spec)
|
||||||
|
find-partition-by-uuid)
|
||||||
|
(string->uuid device-spec))
|
||||||
|
((find-partition-by-label device-spec)
|
||||||
|
(file-system-label device-spec))
|
||||||
|
(else
|
||||||
|
device-spec)))
|
||||||
|
|
||||||
;;; file-systems.scm ends here
|
;;; file-systems.scm ends here
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue