diff mbox series

[bug#59619] grub-configfile

Message ID Y4KBVnUW27vLnYqX@web.de
State New
Headers show
Series [bug#59619] grub-configfile | expand

Commit Message

Stefan Karrmann Nov. 26, 2022, 9:12 p.m. UTC
Dear all,

somehow ~git send-mail~ seems not to work as expected. Therefore, I send
this patch manually.

The patch allows us to use the menuentry configfile for grub. As I'm still
a newbie with regard to guix, I was not able to test it.

My next step will be:
- patch guix, such that grub can work with btrfs subvolumes

Kind regards,
--
Stefan Karrmann
secure communication? GPG: 0x8C3260C01550B612E4C5730D22E42112094CE53F

Comments

\( Nov. 26, 2022, 9:14 p.m. UTC | #1
On Sat Nov 26, 2022 at 9:12 PM GMT, Stefan Karrmann wrote:
> somehow ~git send-mail~ seems not to work as expected. Therefore, I send
> this patch manually.

What's the error? :)

    -- (
Stefan Karrmann Nov. 26, 2022, 9:23 p.m. UTC | #2
Dear paren,

all seems to work, but nothing got through to debbugs.gnu.org. Here is the
output:

====================================================================
$ git send-email --subject='grub configfile' --to='guix-patches@gnu.org' patches/0001-grub-configfile.patch --compose
patches/0001-grub-configfile.patch
E-Mail mit Zusammenfassung ist leer, wird ausgelassen
Die folgenden Dateien sind 8-Bit, aber deklarieren kein
Content-Transfer-Encoding.
    patches/0001-grub-configfile.patch
Welches 8-Bit-Encoding soll deklariert werden [UTF-8]?
(mbox) Füge cc: hinzu: "S.Karrmann" <S.Karrmann@web.de> von Zeile 'From: "S.Karrmann" <S.Karrmann@web.de>'

From: "S.Karrmann" <S.Karrmann@web.de>
To: guix-patches@gnu.org
Cc: "S.Karrmann" <S.Karrmann@web.de>
Subject: [PATCH] grub-configfile
Date: Sat, 26 Nov 2022 22:02:33 +0100
Message-Id: <20221126210233.84924-1-S.Karrmann@web.de>
X-Mailer: git-send-email 2.30.2
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

    Die Cc-Liste oberhalb wurde um zusätzliche Adressen erweitert, die in der
    Commit-Beschreibung des Patches gefunden wurden. Wenn dies passiert, werden
    Sie von send-email zu einer Eingabe aufgefordert. Dieses Verhalten wird
    durch die Konfigurationseinstellung sendemail.confirm gesteuert.

    Für weitere Informationen, führen Sie 'git send-email --help' aus.
    Um das aktuelle Verhalten beizubehalten, aber diese Meldung zu unterdrücken,
    führen Sie 'git config --global sendemail.confirm auto' aus.

Diese E-Mail versenden? (Ja [y]|Nein [n]|Bearbeiten [e]|Beenden [q]|Alle [a]): y
OK. Log enthält:
Sendmail: /usr/sbin/sendmail -i guix-patches@gnu.org S.Karrmann@web.de
From: "S.Karrmann" <S.Karrmann@web.de>
To: guix-patches@gnu.org
Cc: "S.Karrmann" <S.Karrmann@web.de>
Subject: [PATCH] grub-configfile
Date: Sat, 26 Nov 2022 22:02:33 +0100
Message-Id: <20221126210233.84924-1-S.Karrmann@web.de>
X-Mailer: git-send-email 2.30.2
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Ergebnis: OK
====================================================================

Sorry, for LANG=de

Kind regards,
--
Stefan Karrmann
\( Nov. 26, 2022, 9:25 p.m. UTC | #3
On Sat Nov 26, 2022 at 9:23 PM GMT, Stefan Karrmann wrote:
> all seems to work, but nothing got through to debbugs.gnu.org. Here is the
> output:

I'm not really sure what the problem is, but you might have more success following
these instructions:

  <https://guix.gnu.org/manual/devel/en/html_node/Submitting-Patches.html>

    -- (
Julien Lepiller Nov. 26, 2022, 9:32 p.m. UTC | #4
If it's your first submission, it gets delayed for manual review, which might be what's happening with send-email. However this email should also have been delayed, so not sure what's happening.

Regarding your patch, tomething seems to have gone wrong. I don't have the tool right now to figure it out, but you have quite a few lines that seem to be identical but marked as changed. What happened there?

One way to test it is to use pre-inst-env to use that new version of guix and build a system (you wouldn't be able to use sudo, so you can't boot it, but you can build and inspect). Something like:

guix gc -R $(./pre-inst-env guix system build example.scm) | grep grub.cfg

Will give you the name of the config file. For less builds, you could use -n and build the derivation for grub.cfg only, manually.

HTH!

Le 26 novembre 2022 22:12:54 GMT+01:00, Stefan Karrmann <S.Karrmann@web.de> a écrit :
>Dear all,
>
>somehow ~git send-mail~ seems not to work as expected. Therefore, I send
>this patch manually.
>
>The patch allows us to use the menuentry configfile for grub. As I'm still
>a newbie with regard to guix, I was not able to test it.
>
>My next step will be:
>- patch guix, such that grub can work with btrfs subvolumes
>
>Kind regards,
>--
>Stefan Karrmann
>secure communication? GPG: 0x8C3260C01550B612E4C5730D22E42112094CE53F
Stefan Karrmann Jan. 29, 2023, 6:33 p.m. UTC | #5
Dear all,

I managed to run guix directly in my guix git-clone. A peek shows that the
new menu-entry works initially. Later, it runs into an
record-abi-mismatch-error. I suspect, that this happens on the side of the
guix-daemon. Is this really the problem? How can we handle it?

$ ./pre-inst-env ~/guix-clone/scripts/guix system vm /home/sk/guix/system-initial.scm --share=/ --full-boot --root=/home/sk/guix/vm
;;; (#<<menu-entry> label: "Grub config" device: #<<uuid> type: dce bv: #vu8(92 187 154 112 163 200 67 132 160 133 158 104 150 5 131 67)> device-mount-point: #f linux: #f linux-arguments: () initrd: #f multiboot-kernel: #f multiboot-arguments: () multiboot-modules: () config-file: "/boot/grub/grub.cfg" chain-loader: #f>)
Backtrace:
In guix/store.scm:
   1300:8 19 (call-with-build-handler #<procedure 7fc711da4960 at g?> ?)
  2170:25 18 (run-with-store #<store-connection 256.99 7fc711aac4b0> ?)
In guix/scripts/system.scm:
    850:2 17 (_ _)
In guix/gexp.scm:
   1180:2 16 (_ _)
   1046:2 15 (_ _)
    892:4 14 (_ _)
In guix/store.scm:
  2055:12 13 (_ #<store-connection 256.99 7fc711aac4b0>)
  1382:11 12 (map/accumulate-builds #<store-connection 256.99 7fc71?> ?)
   1300:8 11 (call-with-build-handler #<procedure 7fc71026d9f0 at g?> ?)
  2170:25 10 (run-with-store #<store-connection 256.99 7fc711aac4b0> ?)
In guix/gexp.scm:
   897:13  9 (_ _)
In guix/store.scm:
  1998:13  8 (_ #<store-connection 256.99 7fc711aac4b0>)
In guix/gexp.scm:
   299:51  7 (_)
In unknown file:
           6 (with-fluids* (#<fluid 7fc726ac1220>) (#f) #<procedure ?>)
In guix/gexp.scm:
   733:29  5 (_)
In gnu/system/image.scm:
   938:21  4 (_)
In gnu/system.scm:
  1448:26  3 (operating-system-bootcfg #<<operating-system> kernel:?> ?)
    521:4  2 (boot-parameters->menu-entry _)
In ice-9/boot-9.scm:
  1685:16  1 (raise-exception _ #:continuable? _)
  1685:16  0 (raise-exception _ #:continuable? _)

ice-9/boot-9.scm:1685:16: In procedure raise-exception:
Throw to key `record-abi-mismatch-error' with args `(abi-check "~a: record ABI mismatch; recompilation needed" (#<record-type <menu-entry>>) ())'.

---- system-config.scm
;; this is based on znavko's Dual Boot config
;; with the second OS in GRUB on the separate hdd /dev/sda9 ( grub: (hd1,gpt8) )

(use-modules (gnu)
             (gnu system nss)
             (gnu system locale)       ;;for locale-definition
             (gnu services desktop)
             (gnu services networking) ;;for remove ntp
             (gnu services avahi)      ;;for remove avahi - an dns?
             (gnu services xorg)
             (gnu services admin)      ;;for unattended-upgrades
             (gnu packages admin)      ;;for wpa_supplicant
             (gnu packages suckless)
             (gnu packages networking)  ;; iwd
             (srfi srfi-1)             ;;for remove function
             )

(use-modules (system vm inspect)
             (ice-9 pretty-print))      ;; debugging$

(use-modules (gnu packages linux))     ;; free/libre linux

(use-service-modules desktop networking base xorg)
(use-package-modules certs wm suckless)

(define (peek . stuff)
  (newline)
  (display ";;; ")
  (write stuff)
  (newline)
  (car (last-pair stuff)))

(define pk peek)

(define guix-ext-root
  (file-system (device (file-system-label "guix-ext"))
               (mount-point "/")
               (type "btrfs")
               ; (options "subvol=guix-root/work,noatime")
               (needed-for-boot? #t)))
(define guix-ext-boot
  (file-system (device (file-system-label "guix-ext-boot"))
               (mount-point "/boot")
               (options "subvol=boot/work")
               (type "btrfs")
               (needed-for-boot? #f))) ; only by grub upto initrd
(define guix-ext-efi
  (file-system (device (file-system-label "GUIX-EXT-EF"))
               (mount-point "/boot/efi")
               #;(mount-point "/sys/firmware/efi/efivars")
               (type "vfat")))

(operating-system
 (host-name "johann") (timezone "Europe/Berlin") (locale "de_DE.utf8")
 (keyboard-layout (keyboard-layout "de"))
 (initrd-modules (cons*
                  "btrfs"
                  %base-initrd-modules))

 (kernel linux-libre) ; gnu libre
 (firmware (cons* %base-firmware))
 (kernel-arguments (cons*
                    "rootdelay=3"
                    ; now default subvol: "rootflags=subvol=/guix-ext/work"
                    (remove (lambda (option) (string=? option "quiet")) %default-kernel-arguments)))
 (bootloader (bootloader-configuration
              (bootloader
               (bootloader
                (inherit grub-bootloader) (installer #~(const #t))))
              ; (bootloader grub-bootloader)
              (targets (list "/dev/sdb"))
              (keyboard-layout keyboard-layout)
              (menu-entries (list
                             (pk (menu-entry
                              (label "Grub config")
                              (device (uuid "5cbb9a70-a3c8-4384-a085-9e6896058343"))
                              (config-file "/boot/grub/grub.cfg")))
                             (menu-entry
                                   (label "Debian")
                                   (linux "(hd1,gpt8)/boot/vmlinuz") ; generates nonsens: search --file --set /guix-root/work(hd1,gpt8)/boot/vmlinuz
                                   (linux-arguments '("root=/dev/sda9")) ; dito dito
                                   (initrd "(hd1,gpt8)/boot/initrd.img"))))))

 (file-systems (cons*
                guix-ext-root
                guix-ext-boot
                guix-ext-efi
                %base-file-systems))
 (swap-devices
  (list (swap-space (target (uuid "d48bfe0f-9715-4267-81c9-b1503144fab6")))))

 (users (cons* (user-account
                (name "sk") (uid 1000) (group "sk")
                (supplementary-groups '("users" "wheel" "netdev" "audio" "video"))
                (home-directory "/home/sk"))
               %base-user-accounts))

 (groups (cons* (user-group (name "sk") (id 1000))
                %base-groups))

 ;; This is where we specify system-wide packages.
 (packages (cons* nss-certs ;for HTTPS access
                  i3-wm i3status dmenu
                  dwm
                  iwd ; needs dbus...
                  slock st
                  %base-packages))

 (locale-definitions (list (locale-definition (name "de_DE.utf8") (source "de_DE"))
                           (locale-definition (name "en_US.utf8") (source "en_US"))))

 (services (cons*
            (set-xorg-configuration
             (xorg-configuration             ;for Xorg
              (keyboard-layout keyboard-layout)))
            (screen-locker-service slock)
            (modify-services
             ;; removing unnecessary services
             (remove (lambda (service)
                       (member (service-kind service)
                               (list ntp-service-type avahi-service-type
                                     bluetooth-service
                                     gdm-service-type)))
                     %desktop-services) ;end of remove lambda services
             ) ;;end of modify-services
            )) ;;end of services

 ;; Allow resolution of '.local' host names with mDNS.
 (name-service-switch %mdns-host-lookup-nss)

 ;;blacklist ugly sound speaker, blacklist
 #;(kernel-arguments '("modprobe.blacklist=pcspkr,snd_pcsp,bluetooth"))

 ) ;;end of operating-system
----

--
Stefan Karrmann
Sichere Kommunikation? GPG: 0x8C3260C01550B612E4C5730D22E42112094CE53F

An sich ist nichts weder gut noch böse. Erst das Denken mach es dazu.
		-- William Shakespeare (Hamlet)
diff mbox series

Patch

From 34a4849d7023ff7756c048246bc9d7c303170748 Mon Sep 17 00:00:00 2001
From: "S.Karrmann" <S.Karrmann@web.de>
Date: Sun, 20 Nov 2022 21:12:52 +0100
Subject: [PATCH] grub-configfile

---
 doc/guix.texi             | 42 +++++++++++++++++++++++++++++----------
 gnu/bootloader.scm        | 29 +++++++++++++++++++++++----
 gnu/bootloader/grub.scm   | 10 ++++++++++
 tests/boot-parameters.scm | 11 ++++++++++
 4 files changed, 78 insertions(+), 14 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index eaecfd0daa..c30880b8bc 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -109,6 +109,7 @@  Copyright @copyright{} 2022 Reily Siegel@*
 Copyright @copyright{} 2022 Simon Streit@*
 Copyright @copyright{} 2022 (@*
 Copyright @copyright{} 2022 John Kehayias@*
+Copyright @copyright{} 2022 Dr. Stefan Karrmann@*

 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -6127,7 +6128,7 @@  Transformation Options}) so it should be lossless.

 @item --profile=@var{profile}
 @itemx -p @var{profile}
-Create an environment containing the packages installed in @var{profile}.
+Create an environment containing the packages installed in @var{profile}.
 Use @command{guix package} (@pxref{Invoking guix package}) to create
 and manage profiles.

@@ -6573,7 +6574,7 @@  interpreted as packages that will be added to the environment directly.

 @item --profile=@var{profile}
 @itemx -p @var{profile}
-Create an environment containing the packages installed in @var{profile}.
+Create an environment containing the packages installed in @var{profile}.
 Use @command{guix package} (@pxref{Invoking guix package}) to create
 and manage profiles.

@@ -12512,7 +12513,7 @@  candidates, and even to test their impact on packages that depend on
 them:

 @example
-guix build elogind --with-source=@dots{}/shepherd-0.9.0rc1.tar.gz
+guix build elogind --with-source=@dots{}/shepherd-0.9.0rc1.tar.gz
 @end example

 @dots{} or to build from a checkout in a pristine environment:
@@ -23294,7 +23295,7 @@  created for.
 Restricts all controllers to the specified transport. @code{'dual} means both
 BR/EDR and LE are enabled (if supported by the hardware).

-Possible values are:
+Possible values are:

 @itemize @bullet
 @item
@@ -38229,6 +38230,27 @@  The list of commands for loading Multiboot modules.  For example:
              @dots{}))
 @end lisp

+                    (device (uuid "5cbb9a70-a3c8-4384-a085-9e6896058343"))
+                    (configfile "/boot/grub/grub.cfg"))))))
+
+@item @code{configfile} (default: @code{#f})
+A string that can be accepted by @code{grub}'s @code{chainloader}
+directive. This has no effect if either @code{linux} or
+@code{multiboot-kernel} fields are specified. The following is an
+example of switching to a different GNU/GRUB menu.
+
+@lisp
+(bootloader
+ (bootloader-configuration
+  ;; @dots{}
+  (menu-entries
+   (list
+    (menu-entry
+     (label "GNU/Linux")
+     (device (uuid "5cbb9a70-a3c8-4384-a085-9e6896058343"))
+     (configfile "/boot/grub/grub.cfg"))))))
+@end lisp
+
 @item @code{chain-loader} (default: @code{#f})
 A string that can be accepted by @code{grub}'s @code{chainloader}
 directive. This has no effect if either @code{linux} or
@@ -40116,7 +40138,7 @@  A clause can have one of the following forms:
 (@var{field-name}
  (@var{type} @var{default-value})
  @var{documentation})
-
+
 (@var{field-name}
  (@var{type} @var{default-value})
  @var{documentation}
@@ -40165,7 +40187,7 @@  A simple serializer procedure could look like this:
 (define (serialize-boolean field-name value)
   (let ((value (if value "true" "false")))
     #~(string-append #$field-name #$value)))
-@end lisp
+@end lisp

 In some cases multiple different configuration records might be defined
 in the same file, but their serializers for the same type might have to
@@ -40183,7 +40205,7 @@  manually specify a custom @var{serializer} for every field.

 (define (bar-serialize-string field-name value)
   @dots{})
-
+
 (define-configuration foo-configuration
   (label
    (string)
@@ -40215,7 +40237,7 @@  macro which is a shorthand of this.
   (field
    (string "test")
    "Some documentation."))
-@end lisp
+@end lisp
 @end deffn

 @deffn {Scheme Syntax} define-maybe @var{type}
@@ -42708,7 +42730,7 @@  down in its dependency graph.  As it turns out, GLib does not have a
    from /gnu/store/@dots{}-glib-2.62.6/lib/libglib-2.0.so.0
 #1  0x00007ffff608a7d6 in gobject_init_ctor ()
    from /gnu/store/@dots{}-glib-2.62.6/lib/libgobject-2.0.so.0
-#2  0x00007ffff7fe275a in call_init (l=<optimized out>, argc=argc@@entry=1, argv=argv@@entry=0x7fffffffcfd8,
+#2  0x00007ffff7fe275a in call_init (l=<optimized out>, argc=argc@@entry=1, argv=argv@@entry=0x7fffffffcfd8,
     env=env@@entry=0x7fffffffcfe8) at dl-init.c:72
 #3  0x00007ffff7fe2866 in call_init (env=0x7fffffffcfe8, argv=0x7fffffffcfd8, argc=1, l=<optimized out>)
     at dl-init.c:118
@@ -42737,7 +42759,7 @@  Starting program: /gnu/store/@dots{}-profile/bin/sh -c exec\ inkscape
 #0  g_getenv (variable=variable@@entry=0x7ffff60c7a2e "GOBJECT_DEBUG") at ../glib-2.62.6/glib/genviron.c:252
 #1  0x00007ffff608a7d6 in gobject_init () at ../glib-2.62.6/gobject/gtype.c:4380
 #2  gobject_init_ctor () at ../glib-2.62.6/gobject/gtype.c:4493
-#3  0x00007ffff7fe275a in call_init (l=<optimized out>, argc=argc@@entry=3, argv=argv@@entry=0x7fffffffd088,
+#3  0x00007ffff7fe275a in call_init (l=<optimized out>, argc=argc@@entry=3, argv=argv@@entry=0x7fffffffd088,
     env=env@@entry=0x7fffffffd0a8) at dl-init.c:72
 @dots{}
 @end example
diff --git a/gnu/bootloader.scm b/gnu/bootloader.scm
index da65b9d5d5..f34d222f69 100644
--- a/gnu/bootloader.scm
+++ b/gnu/bootloader.scm
@@ -6,6 +6,7 @@ 
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2022 Josselin Poiret <dev@jpoiret.xyz>
 ;;; Copyright © 2022 Reza Alizadeh Majd <r.majd@pantherx.org>
+;;; Copyright © 2022 Dr. Stefan Karrmann <S.Karrmann@web.de>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -49,6 +50,7 @@ 
             menu-entry-multiboot-arguments
             menu-entry-multiboot-modules
             menu-entry-chain-loader
+            menu-entry-configfile

             menu-entry->sexp
             sexp->menu-entry
@@ -109,8 +111,10 @@ 
   (multiboot-modules menu-entry-multiboot-modules
                      (default '()))        ; list of multiboot commands, where
                                            ; a command is a list of <string>
+  (configfile       menu-entry-configfile
+                    (default #f))          ; string, path of grub.cfg file
   (chain-loader     menu-entry-chain-loader
-                    (default #f)))         ; string, path of efi file
+                    (default #f)))          ; string, path of efi file

 (define (report-menu-entry-error menu-entry)
   (raise
@@ -126,6 +130,7 @@ 
 @code{linux-arguments} and @code{linux-modules},
 @item multiboot by specifying fields @code{multiboot-kernel},
 @code{multiboot-arguments} and @code{multiboot-modules},
+@item configfile by specifying field @code{configfile}.
 @item chain-loader by specifying field @code{chain-loader}.
 @end enumerate"))))))

@@ -141,7 +146,7 @@ 
   (match entry
     (($ <menu-entry> label device mount-point
                      (? identity linux) linux-arguments (? identity initrd)
-                     #f () () #f)
+                     #f () () #f #f)
      `(menu-entry (version 0)
                   (label ,label)
                   (device ,(device->sexp device))
@@ -151,7 +156,7 @@ 
                   (initrd ,initrd)))
     (($ <menu-entry> label device mount-point #f () #f
                      (? identity multiboot-kernel) multiboot-arguments
-                     multiboot-modules #f)
+                     multiboot-modules #f #f)
      `(menu-entry (version 0)
                   (label ,label)
                   (device ,(device->sexp device))
@@ -159,13 +164,20 @@ 
                   (multiboot-kernel ,multiboot-kernel)
                   (multiboot-arguments ,multiboot-arguments)
                   (multiboot-modules ,multiboot-modules)))
-    (($ <menu-entry> label device mount-point #f () #f #f () ()
+    (($ <menu-entry> label device mount-point #f () #f #f () () #f
                      (? identity chain-loader))
      `(menu-entry (version 0)
                   (label ,label)
                   (device ,(device->sexp device))
                   (device-mount-point ,mount-point)
                   (chain-loader ,chain-loader)))
+    (($ <menu-entry> label device mount-point #f () #f #f () ()
+                     (? identity configfile) #f)
+     `(menu-entry (version 0)
+                  (label ,label)
+                  (device ,(device->sexp device))
+                  (device-mount-point ,mount-point)
+                  (configfile ,configfile)))
     (_ (report-menu-entry-error entry))))

 (define (sexp->menu-entry sexp)
@@ -204,6 +216,15 @@  record."
       (multiboot-kernel multiboot-kernel)
       (multiboot-arguments multiboot-arguments)
       (multiboot-modules multiboot-modules)))
+    (('menu-entry ('version 0)
+                  ('label label) ('device device)
+                  ('device-mount-point mount-point)
+                  ('configfile configfile) _ ...)
+     (menu-entry
+      (label label)
+      (device (sexp->device device))
+      (device-mount-point mount-point)
+      (configfile configfile)))
     (('menu-entry ('version 0)
                   ('label label) ('device device)
                   ('device-mount-point mount-point)
diff --git a/gnu/bootloader/grub.scm b/gnu/bootloader/grub.scm
index 7283257354..2afc1e0b09 100644
--- a/gnu/bootloader/grub.scm
+++ b/gnu/bootloader/grub.scm
@@ -9,6 +9,7 @@ 
 ;;; Copyright © 2020 Stefan <stefan-guix@vodafonemail.de>
 ;;; Copyright © 2022 Karl Hallsby <karl@hallsby.com>
 ;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
+;;; Copyright © 2022 Dr. Stefan Karrmann <S.Karrmann@web.de>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -416,6 +417,15 @@  menuentry ~s {
                     #$root-index (string-join (list #$@arguments) " " 'prefix)
                     (string-join (map string-join '#$modules)
                                  "\n  module " 'prefix))))
+       (configfile
+        #~(format port "
+menuentry ~s {
+  ~a
+  configfile ~a
+}~%
+                  #$label
+                  #$(grub-root-search device configfile)
+                  #$configfile"))
        (chain-loader
         #~(format port "
 menuentry ~s {
diff --git a/tests/boot-parameters.scm b/tests/boot-parameters.scm
index 03a1d01aff..028cffc73c 100644
--- a/tests/boot-parameters.scm
+++ b/tests/boot-parameters.scm
@@ -1,6 +1,7 @@ 
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2019, 2020 Miguel Ángel Arruga Vivas <rosen644835@gmail.com>
 ;;; Copyright © 2022 Josselin Poiret <dev@jpoiret.xyz>
+;;; Copyright © 2022 Dr. Stefan Karrmann <S.Karrmann@web.de>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -318,6 +319,12 @@ 
    (linux "/boot/bzImage")
    (initrd "/boot/initrd.cpio.gz")))

+(define %configfile-menu-entry
+  (menu-entry
+   (label "test-configfile")
+   (device (uuid "6d5b13d4-6092-46d0-8be4-073dc07413cc"))
+   (configfile "/boot/grub/grub.cfg")))
+
 (test-equal "menu-entry roundtrip, uuid"
   %uuid-menu-entry
   (sexp->menu-entry (menu-entry->sexp %uuid-menu-entry)))
@@ -326,4 +333,8 @@ 
   %file-system-label-menu-entry
   (sexp->menu-entry (menu-entry->sexp %file-system-label-menu-entry)))

+(test-equal "menu-entry roundtrip, configfile"
+  %configfile-menu-entry
+  (sexp->menu-entry (menu-entry->sexp %configfile-menu-entry)))
+
 (test-end "boot-parameters")
--
2.30.2