unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: Janneke Nieuwenhuizen <janneke@gnu.org>
To: 73927@debbugs.gnu.org
Subject: [bug#73927] [PATCH v4 04/18] bootloader: grub: Remove hardcoded partition number for the Hurd.
Date: Wed, 30 Oct 2024 15:30:33 +0100	[thread overview]
Message-ID: <3952b98b312119adb5456f255a3c6b0bf7294f95.1730296564.git.janneke@gnu.org> (raw)
In-Reply-To: <cover.1730296564.git.janneke@gnu.org>

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
---
 gnu/bootloader/grub.scm    | 19 +++++++++----
 gnu/build/file-systems.scm | 58 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/gnu/bootloader/grub.scm b/gnu/bootloader/grub.scm
index 2723eda5f4..ef516b1e13 100644
--- a/gnu/bootloader/grub.scm
+++ b/gnu/bootloader/grub.scm
@@ -3,7 +3,7 @@
 ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
 ;;; 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 © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2020 Stefan <stefan-guix@vodafonemail.de>
@@ -34,6 +34,7 @@ (define-module (gnu bootloader grub)
   #:use-module (guix gexp)
   #:use-module (gnu artwork)
   #:use-module (gnu bootloader)
+  #:use-module (gnu build file-systems)
   #:use-module (gnu system uuid)
   #:use-module (gnu system file-systems)
   #:use-module (gnu system keyboard)
@@ -45,6 +46,7 @@ (define-module (gnu bootloader grub)
   #:use-module (ice-9 regex)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-2)
+  #:use-module (srfi srfi-26)
   #:export (grub-theme
             grub-theme?
             grub-theme-image
@@ -355,6 +357,11 @@ (define (grub-root-search device file)
         ((or #f (? string?))
          #~(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
                                   #:key
                                   (locale #f)
@@ -413,16 +420,16 @@ (define* (make-grub-configuration grub config entries
                ;; IDE driver ("hdX") and those understood by rumpdisk ("wdX"
                ;; in the "noide" case).
                (disk (if (member "noide" arguments) "w" "h"))
-               (modules (menu-entry-multiboot-modules entry))
-               (root-index 1))          ; XXX EFI will need root-index 2
+               (device-spec (and=> device file-system-device->string))
+               (device-name (and=> device-spec device-spec->device-name))
+               (modules (menu-entry-multiboot-modules entry)))
           #~(format port "
 menuentry ~s {
-  multiboot ~a root=part:~a:device:~ad0~a~a
+  multiboot ~a root=~a~a~a
 }~%"
                     #$label
                     #$kernel
-                    #$root-index
-                    #$disk
+                    #$(device-name->hurd-device-name device-name #:disk disk)
                     (string-join (list #$@arguments) " " 'prefix)
                     (string-join (map string-join '#$modules)
                                  "\n  module " 'prefix))))
diff --git a/gnu/build/file-systems.scm b/gnu/build/file-systems.scm
index 41e1c9e282..6fd9f95093 100644
--- a/gnu/build/file-systems.scm
+++ b/gnu/build/file-systems.scm
@@ -9,6 +9,7 @@
 ;;; Copyright © 2022 Oleg Pykhalov <go.wigust@gmail.com>
 ;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr>
 ;;; Copyright © 2024 Richard Sent <richard@freakingpenguin.com>
+;;; Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -53,6 +54,11 @@ (define-module (gnu build file-systems)
             find-partition-by-luks-uuid
             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-uuid
             read-luks-partition-uuid
@@ -1431,4 +1437,56 @@ (define* (mount-file-system fs #:key (root "/root")
         (or (file-system-mount-may-fail? fs)
             (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
-- 
Janneke Nieuwenhuizen <janneke@gnu.org>  | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com | Avatar® https://AvatarAcademy.com





  parent reply	other threads:[~2024-10-30 14:35 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-21  8:13 [bug#73927] [PATCH 00/16] Installer support for (cross) installing the Hurd Janneke Nieuwenhuizen
2024-10-21  8:16 ` [bug#73927] [PATCH 01/16] system: hurd: Remove qemu networking from %base-services/hurd Janneke Nieuwenhuizen
2024-10-21  8:16 ` [bug#73927] [PATCH 02/16] gnu: hurd: Support system init in /libexec/runsystem Janneke Nieuwenhuizen
2024-10-21  8:16 ` [bug#73927] [PATCH 03/16] hurd-boot: Support system init: Create essential device nodes Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 04/16] system: hurd: Add swap-services to hurd-default-essential-services Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 05/16] gnu: hurd: Support second boot Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 06/16] hurd-boot: " Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 07/16] maint: Add installer dependencies to the manifest Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 08/16] installer: Remove unused (newt) imports Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 09/16] installer: Align comments Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 10/16] installer: Use "partitioning-page" consistently Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 11/16] installer: Fix file-name typos Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 12/16] installer: Use `%' for parameter %run-command-in-installer Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 13/16] installer: Add dry-run? Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 14/16] installer: Add "Kernel" page to select the Hurd Janneke Nieuwenhuizen
2024-10-21 18:14   ` Mathieu Othacehe
2024-10-22  8:53     ` janneke
2024-10-22 14:34       ` janneke
2024-10-22 18:06         ` Mathieu Othacehe
2024-10-22 19:18           ` [bug#73927] [PATCH v2 " janneke
2024-10-21  8:17 ` [bug#73927] [PATCH 15/16] installer: Add static-networking template Janneke Nieuwenhuizen
2024-10-21  8:17 ` [bug#73927] [PATCH 16/16] DRAFT installer: Support dry-run from Guile via store Janneke Nieuwenhuizen
2024-10-21 18:18   ` Mathieu Othacehe
2024-10-22  8:21     ` janneke
2024-10-25  9:39 ` [bug#73927] [PATCH v3 00/17] Installer support for (cross) installing the Hurd Janneke Nieuwenhuizen
2024-10-25  9:39   ` [bug#73927] [PATCH v3 01/17] gnu: guile-fibers: Fix cross-build for " Janneke Nieuwenhuizen
2024-10-25  9:39   ` [bug#73927] [PATCH v3 02/17] guix system: When installing the Hurd, create essential devices Janneke Nieuwenhuizen
2024-10-25  9:39   ` [bug#73927] [PATCH v3 03/17] bootloader: grub: Remove hardcoded partition number for the Hurd Janneke Nieuwenhuizen
2024-10-25  9:39   ` [bug#73927] [PATCH v3 04/17] system: hurd: Remove qemu networking from %base-services/hurd Janneke Nieuwenhuizen
2024-10-25  9:39   ` [bug#73927] [PATCH v3 05/17] system: hurd: Add swap-services to hurd-default-essential-services Janneke Nieuwenhuizen
2024-10-25  9:39   ` [bug#73927] [PATCH v3 06/17] gnu: hurd: Support second boot Janneke Nieuwenhuizen
2024-10-25  9:39   ` [bug#73927] [PATCH v3 07/17] hurd-boot: " Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 08/17] maint: Add installer dependencies to the manifest Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 09/17] installer: Remove unused (newt) imports Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 10/17] installer: Align comments Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 11/17] installer: Use "partitioning-page" consistently Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 12/17] installer: Fix file-name typos Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 13/17] installer: Use `%' for parameter %run-command-in-installer Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 14/17] installer: Add dry-run? Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 15/17] installer: Add "Kernel" page to select the Hurd Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 16/17] installer: Add static-networking template Janneke Nieuwenhuizen
2024-10-25  9:40   ` [bug#73927] [PATCH v3 17/17] installer: Support dry-run from Guile via store Janneke Nieuwenhuizen
2024-10-30 14:30 ` [bug#73927] [PATCH v4 00/18] Installer support for (cross) installing the Hurd Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 01/18] gnu: guile-fibers: Fix cross-build for " Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 02/18] reconfigure: Use native bootloader package for running the installer Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 03/18] guix system: When installing the Hurd, create essential devices Janneke Nieuwenhuizen
2024-10-30 14:30   ` Janneke Nieuwenhuizen [this message]
2024-10-30 14:30   ` [bug#73927] [PATCH v4 05/18] system: hurd: Remove qemu networking from %base-services/hurd Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 06/18] system: hurd: Add swap-services to hurd-default-essential-services Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 07/18] gnu: hurd: Support second boot Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 08/18] hurd-boot: " Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 09/18] maint: Add installer dependencies to the manifest Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 10/18] installer: Remove unused (newt) imports Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 11/18] installer: Align comments Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 12/18] installer: Use "partitioning-page" consistently Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 13/18] installer: Fix file-name typos Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 14/18] installer: Use `%' for parameter %run-command-in-installer Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 15/18] installer: Add dry-run? Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 16/18] installer: Add "Kernel" page to select the Hurd Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 17/18] installer: Add static-networking template Janneke Nieuwenhuizen
2024-10-30 14:30   ` [bug#73927] [PATCH v4 18/18] installer: Support dry-run from Guile via store Janneke Nieuwenhuizen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3952b98b312119adb5456f255a3c6b0bf7294f95.1730296564.git.janneke@gnu.org \
    --to=janneke@gnu.org \
    --cc=73927@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).