* bug#26875: Non-graphical (and other types) of GRUB interfaces
@ 2017-05-11 7:36 Leo Famulari
2017-05-11 7:46 ` ng0
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-11 7:36 UTC (permalink / raw)
To: 26875
[-- Attachment #1.1: Type: text/plain, Size: 799 bytes --]
This patch exposes the GRUB configuration options that control where and
how the user interface is presented. Generally, you can use it to put
the GRUB menu on a serial port, get a text-only menu on the kernel
console, or even use Morse code on the PC speaker (untested!).
You can use it like this, for example:
(bootloader (grub-configuration
(device "/dev/sda")
(terminal-outputs '(gfxterm console))
(terminal-inputs '(serial console usb_keyboard))
(serial-speed 115200)
(serial-unit 0)))
Since this offers new ways to break your system, the patch sets up some
input validation. Hopefully it's enough.
The general idea came from this conversation:
https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00053.html
Your feedback?
[-- Attachment #1.2: 0001-system-grub-Expose-GRUB-s-interactive-interface-sett.patch --]
[-- Type: text/plain, Size: 8105 bytes --]
From 21ed0a8f364ce3cb784c0752e28600e8e786e295 Mon Sep 17 00:00:00 2001
From: Leo Famulari <leo@famulari.name>
Date: Thu, 11 May 2017 03:12:44 -0400
Subject: [PATCH] system: grub: Expose GRUB's interactive interface settings.
* gnu/system/grub.scm (<grub-configuration>): Add new fields
terminal-outputs, terminal-inputs, serial-unit, and serial-speed.
(grub-setup-io, setup-gfxterm): New procedures.
* doc/guix.texi (GRUB Configuration): Document the new fields.
---
doc/guix.texi | 20 +++++++++++
gnu/system/grub.scm | 99 ++++++++++++++++++++++++++++++++++++++++++++---------
2 files changed, 102 insertions(+), 17 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index 81aa957c6..a1f7fdee6 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -15223,6 +15223,26 @@ The @code{grub-theme} object describing the theme to use.
@item @code{grub} (default: @code{grub})
The GRUB package to use.
+
+@item @code{terminal-outputs} (default: @code{'gfxterm})
+The output terminals used for the GRUB boot menu, as a list of symbols.
+These values are accepted: console, serial, serial_{0-3}, gfxterm,
+vga_text, mda_text, morse, spkmodem
+
+@item @code{terminal-inputs} (default: @code{'()})
+The input terminals used for the GRUB boot menu, as a list of symbols.
+The default is the native platform terminal as determined by GRUB at
+run-time. These values are accepted: console, serial, serial_{0-3},
+at_keyboard, usb_keyboard.
+
+@item @code{serial-unit} (default: @code{#f})
+The serial unit used by GRUB, as an integer from 0 to 3. The default
+value is chosen by GRUB at run-time; currently GRUB chooses 0, which
+corresponds to COM1.
+
+@item @code{serial-speed} (default: @code{#f})
+The speed of the serial interface, as an integer. The default value is
+chosen by GRUB at run-time; currently GRUB chooses 9600bps.
@end table
@end deftp
diff --git a/gnu/system/grub.scm b/gnu/system/grub.scm
index 58096429f..b5b8c8c8a 100644
--- a/gnu/system/grub.scm
+++ b/gnu/system/grub.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
+;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -108,17 +109,25 @@ denoting a file name."
(define-record-type* <grub-configuration>
grub-configuration make-grub-configuration
grub-configuration?
- (grub grub-configuration-grub ; package
- (default (@ (gnu packages bootloaders) grub)))
- (device grub-configuration-device) ; string
- (menu-entries grub-configuration-menu-entries ; list
- (default '()))
- (default-entry grub-configuration-default-entry ; integer
- (default 0))
- (timeout grub-configuration-timeout ; integer
- (default 5))
- (theme grub-configuration-theme ; <grub-theme>
- (default %default-theme)))
+ (grub grub-configuration-grub ; package
+ (default (@ (gnu packages bootloaders) grub)))
+ (device grub-configuration-device) ; string
+ (menu-entries grub-configuration-menu-entries ; list
+ (default '()))
+ (default-entry grub-configuration-default-entry ; integer
+ (default 0))
+ (timeout grub-configuration-timeout ; integer
+ (default 5))
+ (theme grub-configuration-theme ; <grub-theme>
+ (default %default-theme))
+ (terminal-outputs grub-configuration-terminal-outputs ; list of symbols
+ (default '(gfxterm)))
+ (terminal-inputs grub-configuration-terminal-inputs ; list of symbols
+ (default '()))
+ (serial-unit grub-configuration-serial-unit ; integer | #f
+ (default #f))
+ (serial-speed grub-configuration-serial-speed ; integer | #f
+ (default #f)))
(define-record-type* <menu-entry>
menu-entry make-menu-entry
@@ -199,11 +208,16 @@ system string---e.g., \"x86_64-linux\"."
insmod vbe
insmod vga
fi
-
- terminal_output gfxterm
"
""))
+ (define (setup-gfxterm config font-file)
+ (if (memq 'gfxterm (grub-configuration-terminal-outputs config))
+ #~(format #f "if loadfont ~a; then
+ setup_gfxterm
+fi~%" #$font-file)
+ ""))
+
(define (theme-colors type)
(let* ((theme (grub-configuration-theme config))
(colors (type theme)))
@@ -222,9 +236,8 @@ function setup_gfxterm {~a}
# Set 'root' to the partition that contains /gnu/store.
~a
-if loadfont ~a; then
- setup_gfxterm
-fi
+~a
+~a
insmod png
if background_image ~a; then
@@ -236,7 +249,8 @@ else
fi~%"
#$setup-gfxterm-body
#$(grub-root-search store-device font-file)
- #$font-file
+ #$(grub-setup-io config)
+ #$(setup-gfxterm config font-file)
#$(strip-mount-point store-mount-point image)
#$(theme-colors grub-theme-color-normal)
@@ -247,6 +261,57 @@ fi~%"
;;; Configuration file.
;;;
+(define (grub-setup-io config)
+ "Return GRUB commands to configure the input / output interfaces. The result
+is a string that can be inserted in grub.cfg."
+ (let* ((symbols->string (lambda (list)
+ (string-join (map symbol->string list) " ")))
+ (outputs (grub-configuration-terminal-outputs config))
+ (inputs (grub-configuration-terminal-inputs config))
+ (unit (grub-configuration-serial-unit config))
+ (speed (grub-configuration-serial-speed config))
+
+ ;; Respectively, GRUB_TERMINAL_OUTPUT and GRUB_TERMINAL_INPUT,
+ ;; as documented in GRUB manual section "Simple Configuration
+ ;; Handling".
+ (valid-outputs '(console serial serial_0 serial_1 serial_2 serial_3
+ gfxterm vga_text mda_text morse spkmodem))
+ (valid-inputs '(console serial serial_0 serial_1 serial_2 serial_3
+ at_keyboard usb_keyboard))
+
+ (io (string-append
+ "terminal_output "
+ (symbols->string
+ (map
+ (lambda (output)
+ (if (memq output valid-outputs) output #f)) outputs)) "\n"
+ (if (null? inputs)
+ ""
+ (string-append
+ "terminal_input "
+ (symbols->string
+ (map
+ (lambda (input)
+ (if (memq input valid-inputs) input #f)) inputs)) "\n"))
+ ;; UNIT and SPEED are arguments to the same GRUB command
+ ;; ("serial"), so we process them together.
+ (if (or unit speed)
+ (string-append
+ "serial"
+ (if unit
+ ;; COM ports 0 through 3
+ (if (and (exact-integer? unit) (<= unit 3) (>= unit 0))
+ (string-append " --unit=" (number->string unit))
+ #f)
+ "")
+ (if speed
+ (if (exact-integer? speed)
+ (string-append " --speed=" (number->string speed))
+ #f)
+ ""))
+ ""))))
+ (format #f "~a" io)))
+
(define (grub-root-search device file)
"Return the GRUB 'search' command to look for DEVICE, which contains FILE,
a gexp. The result is a gexp that can be inserted in the grub.cfg-generation
--
2.13.0
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply related [flat|nested] 11+ messages in thread
* bug#26875: Non-graphical (and other types) of GRUB interfaces
2017-05-11 7:36 bug#26875: Non-graphical (and other types) of GRUB interfaces Leo Famulari
@ 2017-05-11 7:46 ` ng0
2017-05-13 5:15 ` Leo Famulari
2017-05-13 5:21 ` bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings Leo Famulari
2017-05-15 9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
2 siblings, 1 reply; 11+ messages in thread
From: ng0 @ 2017-05-11 7:46 UTC (permalink / raw)
To: Leo Famulari; +Cc: 26875
Leo Famulari transcribed 9.9K bytes:
> This patch exposes the GRUB configuration options that control where and
> how the user interface is presented. Generally, you can use it to put
> the GRUB menu on a serial port, get a text-only menu on the kernel
> console, or even use Morse code on the PC speaker (untested!).
>
> You can use it like this, for example:
>
> (bootloader (grub-configuration
> (device "/dev/sda")
> (terminal-outputs '(gfxterm console))
> (terminal-inputs '(serial console usb_keyboard))
> (serial-speed 115200)
> (serial-unit 0)))
>
> Since this offers new ways to break your system, the patch sets up some
> input validation. Hopefully it's enough.
>
> The general idea came from this conversation:
>
> https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00053.html
>
> Your feedback?
Without testing it, this looks like it could fix the use of GuixSD
on IN-Berlin e.V. servers. At least the options are given, like
talked about in a level above this subthread.
> From 21ed0a8f364ce3cb784c0752e28600e8e786e295 Mon Sep 17 00:00:00 2001
> From: Leo Famulari <leo@famulari.name>
> Date: Thu, 11 May 2017 03:12:44 -0400
> Subject: [PATCH] system: grub: Expose GRUB's interactive interface settings.
>
> * gnu/system/grub.scm (<grub-configuration>): Add new fields
> terminal-outputs, terminal-inputs, serial-unit, and serial-speed.
> (grub-setup-io, setup-gfxterm): New procedures.
> * doc/guix.texi (GRUB Configuration): Document the new fields.
> ---
> doc/guix.texi | 20 +++++++++++
> gnu/system/grub.scm | 99 ++++++++++++++++++++++++++++++++++++++++++++---------
> 2 files changed, 102 insertions(+), 17 deletions(-)
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 81aa957c6..a1f7fdee6 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -15223,6 +15223,26 @@ The @code{grub-theme} object describing the theme to use.
>
> @item @code{grub} (default: @code{grub})
> The GRUB package to use.
> +
> +@item @code{terminal-outputs} (default: @code{'gfxterm})
> +The output terminals used for the GRUB boot menu, as a list of symbols.
> +These values are accepted: console, serial, serial_{0-3}, gfxterm,
> +vga_text, mda_text, morse, spkmodem
> +
> +@item @code{terminal-inputs} (default: @code{'()})
> +The input terminals used for the GRUB boot menu, as a list of symbols.
> +The default is the native platform terminal as determined by GRUB at
> +run-time. These values are accepted: console, serial, serial_{0-3},
> +at_keyboard, usb_keyboard.
> +
> +@item @code{serial-unit} (default: @code{#f})
> +The serial unit used by GRUB, as an integer from 0 to 3. The default
> +value is chosen by GRUB at run-time; currently GRUB chooses 0, which
> +corresponds to COM1.
> +
> +@item @code{serial-speed} (default: @code{#f})
> +The speed of the serial interface, as an integer. The default value is
> +chosen by GRUB at run-time; currently GRUB chooses 9600bps.
> @end table
>
> @end deftp
> diff --git a/gnu/system/grub.scm b/gnu/system/grub.scm
> index 58096429f..b5b8c8c8a 100644
> --- a/gnu/system/grub.scm
> +++ b/gnu/system/grub.scm
> @@ -1,6 +1,7 @@
> ;;; GNU Guix --- Functional package management for GNU
> ;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
> ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
> +;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
> ;;;
> ;;; This file is part of GNU Guix.
> ;;;
> @@ -108,17 +109,25 @@ denoting a file name."
> (define-record-type* <grub-configuration>
> grub-configuration make-grub-configuration
> grub-configuration?
> - (grub grub-configuration-grub ; package
> - (default (@ (gnu packages bootloaders) grub)))
> - (device grub-configuration-device) ; string
> - (menu-entries grub-configuration-menu-entries ; list
> - (default '()))
> - (default-entry grub-configuration-default-entry ; integer
> - (default 0))
> - (timeout grub-configuration-timeout ; integer
> - (default 5))
> - (theme grub-configuration-theme ; <grub-theme>
> - (default %default-theme)))
> + (grub grub-configuration-grub ; package
> + (default (@ (gnu packages bootloaders) grub)))
> + (device grub-configuration-device) ; string
> + (menu-entries grub-configuration-menu-entries ; list
> + (default '()))
> + (default-entry grub-configuration-default-entry ; integer
> + (default 0))
> + (timeout grub-configuration-timeout ; integer
> + (default 5))
> + (theme grub-configuration-theme ; <grub-theme>
> + (default %default-theme))
> + (terminal-outputs grub-configuration-terminal-outputs ; list of symbols
> + (default '(gfxterm)))
> + (terminal-inputs grub-configuration-terminal-inputs ; list of symbols
> + (default '()))
> + (serial-unit grub-configuration-serial-unit ; integer | #f
> + (default #f))
> + (serial-speed grub-configuration-serial-speed ; integer | #f
> + (default #f)))
>
> (define-record-type* <menu-entry>
> menu-entry make-menu-entry
> @@ -199,11 +208,16 @@ system string---e.g., \"x86_64-linux\"."
> insmod vbe
> insmod vga
> fi
> -
> - terminal_output gfxterm
> "
> ""))
>
> + (define (setup-gfxterm config font-file)
> + (if (memq 'gfxterm (grub-configuration-terminal-outputs config))
> + #~(format #f "if loadfont ~a; then
> + setup_gfxterm
> +fi~%" #$font-file)
> + ""))
> +
> (define (theme-colors type)
> (let* ((theme (grub-configuration-theme config))
> (colors (type theme)))
> @@ -222,9 +236,8 @@ function setup_gfxterm {~a}
> # Set 'root' to the partition that contains /gnu/store.
> ~a
>
> -if loadfont ~a; then
> - setup_gfxterm
> -fi
> +~a
> +~a
>
> insmod png
> if background_image ~a; then
> @@ -236,7 +249,8 @@ else
> fi~%"
> #$setup-gfxterm-body
> #$(grub-root-search store-device font-file)
> - #$font-file
> + #$(grub-setup-io config)
> + #$(setup-gfxterm config font-file)
>
> #$(strip-mount-point store-mount-point image)
> #$(theme-colors grub-theme-color-normal)
> @@ -247,6 +261,57 @@ fi~%"
> ;;; Configuration file.
> ;;;
>
> +(define (grub-setup-io config)
> + "Return GRUB commands to configure the input / output interfaces. The result
> +is a string that can be inserted in grub.cfg."
> + (let* ((symbols->string (lambda (list)
> + (string-join (map symbol->string list) " ")))
> + (outputs (grub-configuration-terminal-outputs config))
> + (inputs (grub-configuration-terminal-inputs config))
> + (unit (grub-configuration-serial-unit config))
> + (speed (grub-configuration-serial-speed config))
> +
> + ;; Respectively, GRUB_TERMINAL_OUTPUT and GRUB_TERMINAL_INPUT,
> + ;; as documented in GRUB manual section "Simple Configuration
> + ;; Handling".
> + (valid-outputs '(console serial serial_0 serial_1 serial_2 serial_3
> + gfxterm vga_text mda_text morse spkmodem))
> + (valid-inputs '(console serial serial_0 serial_1 serial_2 serial_3
> + at_keyboard usb_keyboard))
> +
> + (io (string-append
> + "terminal_output "
> + (symbols->string
> + (map
> + (lambda (output)
> + (if (memq output valid-outputs) output #f)) outputs)) "\n"
> + (if (null? inputs)
> + ""
> + (string-append
> + "terminal_input "
> + (symbols->string
> + (map
> + (lambda (input)
> + (if (memq input valid-inputs) input #f)) inputs)) "\n"))
> + ;; UNIT and SPEED are arguments to the same GRUB command
> + ;; ("serial"), so we process them together.
> + (if (or unit speed)
> + (string-append
> + "serial"
> + (if unit
> + ;; COM ports 0 through 3
> + (if (and (exact-integer? unit) (<= unit 3) (>= unit 0))
> + (string-append " --unit=" (number->string unit))
> + #f)
> + "")
> + (if speed
> + (if (exact-integer? speed)
> + (string-append " --speed=" (number->string speed))
> + #f)
> + ""))
> + ""))))
> + (format #f "~a" io)))
> +
> (define (grub-root-search device file)
> "Return the GRUB 'search' command to look for DEVICE, which contains FILE,
> a gexp. The result is a gexp that can be inserted in the grub.cfg-generation
> --
> 2.13.0
>
--
https://pragmatique.xyz
PGP: https://people.pragmatique.xyz/ng0/
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#26875: Non-graphical (and other types) of GRUB interfaces
2017-05-11 7:46 ` ng0
@ 2017-05-13 5:15 ` Leo Famulari
0 siblings, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-13 5:15 UTC (permalink / raw)
To: 26875
On Thu, May 11, 2017 at 07:46:36AM +0000, ng0 wrote:
> Without testing it, this looks like it could fix the use of GuixSD
> on IN-Berlin e.V. servers. At least the options are given, like
> talked about in a level above this subthread.
It works in QEMU, so hopefully it will work on VPS providers like
IN-Berlin.
I'm sending version 2 of the patch. It fixes a texinfo syntax error in
the manual that I added just before sending the earlier patch.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
2017-05-11 7:36 bug#26875: Non-graphical (and other types) of GRUB interfaces Leo Famulari
2017-05-11 7:46 ` ng0
@ 2017-05-13 5:21 ` Leo Famulari
2017-05-13 13:51 ` Ludovic Courtès
2017-05-15 9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
2 siblings, 1 reply; 11+ messages in thread
From: Leo Famulari @ 2017-05-13 5:21 UTC (permalink / raw)
To: 26875
* gnu/system/grub.scm (<grub-configuration>): Add new fields
terminal-outputs, terminal-inputs, serial-unit, and serial-speed.
(grub-setup-io, setup-gfxterm): New procedures.
* doc/guix.texi (GRUB Configuration): Document the new fields.
---
doc/guix.texi | 20 +++++++++++
gnu/system/grub.scm | 99 ++++++++++++++++++++++++++++++++++++++++++++---------
2 files changed, 102 insertions(+), 17 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index 5227ad4ba..207045b7b 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -15225,6 +15225,26 @@ The @code{grub-theme} object describing the theme to use.
@item @code{grub} (default: @code{grub})
The GRUB package to use.
+
+@item @code{terminal-outputs} (default: @code{'gfxterm})
+The output terminals used for the GRUB boot menu, as a list of symbols.
+These values are accepted: console, serial, serial_@{0-3@}, gfxterm,
+vga_text, mda_text, morse, spkmodem
+
+@item @code{terminal-inputs} (default: @code{'()})
+The input terminals used for the GRUB boot menu, as a list of symbols.
+The default is the native platform terminal as determined by GRUB at
+run-time. These values are accepted: console, serial, serial_@{0-3@},
+at_keyboard, usb_keyboard.
+
+@item @code{serial-unit} (default: @code{#f})
+The serial unit used by GRUB, as an integer from 0 to 3. The default
+value is chosen by GRUB at run-time; currently GRUB chooses 0, which
+corresponds to COM1.
+
+@item @code{serial-speed} (default: @code{#f})
+The speed of the serial interface, as an integer. The default value is
+chosen by GRUB at run-time; currently GRUB chooses 9600bps.
@end table
@end deftp
diff --git a/gnu/system/grub.scm b/gnu/system/grub.scm
index 58096429f..97081d848 100644
--- a/gnu/system/grub.scm
+++ b/gnu/system/grub.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
+;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -108,17 +109,25 @@ denoting a file name."
(define-record-type* <grub-configuration>
grub-configuration make-grub-configuration
grub-configuration?
- (grub grub-configuration-grub ; package
- (default (@ (gnu packages bootloaders) grub)))
- (device grub-configuration-device) ; string
- (menu-entries grub-configuration-menu-entries ; list
- (default '()))
- (default-entry grub-configuration-default-entry ; integer
- (default 0))
- (timeout grub-configuration-timeout ; integer
- (default 5))
- (theme grub-configuration-theme ; <grub-theme>
- (default %default-theme)))
+ (grub grub-configuration-grub ; package
+ (default (@ (gnu packages bootloaders) grub)))
+ (device grub-configuration-device) ; string
+ (menu-entries grub-configuration-menu-entries ; list
+ (default '()))
+ (default-entry grub-configuration-default-entry ; integer
+ (default 0))
+ (timeout grub-configuration-timeout ; integer
+ (default 5))
+ (theme grub-configuration-theme ; <grub-theme>
+ (default %default-theme))
+ (terminal-outputs grub-configuration-terminal-outputs ; list of symbols
+ (default '(gfxterm)))
+ (terminal-inputs grub-configuration-terminal-inputs ; list of symbols
+ (default '()))
+ (serial-unit grub-configuration-serial-unit ; integer | #f
+ (default #f))
+ (serial-speed grub-configuration-serial-speed ; integer | #f
+ (default #f)))
(define-record-type* <menu-entry>
menu-entry make-menu-entry
@@ -199,11 +208,16 @@ system string---e.g., \"x86_64-linux\"."
insmod vbe
insmod vga
fi
-
- terminal_output gfxterm
"
""))
+ (define (setup-gfxterm config font-file)
+ (if (memq 'gfxterm (grub-configuration-terminal-outputs config))
+ #~(format #f "if loadfont ~a; then
+ setup_gfxterm
+fi~%" #$font-file)
+ ""))
+
(define (theme-colors type)
(let* ((theme (grub-configuration-theme config))
(colors (type theme)))
@@ -222,9 +236,8 @@ function setup_gfxterm {~a}
# Set 'root' to the partition that contains /gnu/store.
~a
-if loadfont ~a; then
- setup_gfxterm
-fi
+~a
+~a
insmod png
if background_image ~a; then
@@ -236,7 +249,8 @@ else
fi~%"
#$setup-gfxterm-body
#$(grub-root-search store-device font-file)
- #$font-file
+ #$(grub-setup-io config)
+ #$(setup-gfxterm config font-file)
#$(strip-mount-point store-mount-point image)
#$(theme-colors grub-theme-color-normal)
@@ -247,6 +261,57 @@ fi~%"
;;; Configuration file.
;;;
+(define (grub-setup-io config)
+ "Return GRUB commands to configure the input / output interfaces. The result
+is a string that can be inserted in grub.cfg."
+ (let* ((symbols->string (lambda (list)
+ (string-join (map symbol->string list) " ")))
+ (outputs (grub-configuration-terminal-outputs config))
+ (inputs (grub-configuration-terminal-inputs config))
+ (unit (grub-configuration-serial-unit config))
+ (speed (grub-configuration-serial-speed config))
+
+ ;; Respectively, GRUB_TERMINAL_OUTPUT and GRUB_TERMINAL_INPUT,
+ ;; as documented in GRUB manual section "Simple Configuration
+ ;; Handling".
+ (valid-outputs '(console serial serial_0 serial_1 serial_2 serial_3
+ gfxterm vga_text mda_text morse spkmodem))
+ (valid-inputs '(console serial serial_0 serial_1 serial_2 serial_3
+ at_keyboard usb_keyboard))
+
+ (io (string-append
+ "terminal_output "
+ (symbols->string
+ (map
+ (lambda (output)
+ (if (memq output valid-outputs) output #f)) outputs)) "\n"
+ (if (null? inputs)
+ ""
+ (string-append
+ "terminal_input "
+ (symbols->string
+ (map
+ (lambda (input)
+ (if (memq input valid-inputs) input #f)) inputs)) "\n"))
+ ;; UNIT and SPEED are arguments to the same GRUB command
+ ;; ("serial"), so we process them together.
+ (if (or unit speed)
+ (string-append
+ "serial"
+ (if unit
+ ;; COM ports 1 through 4
+ (if (and (exact-integer? unit) (<= unit 3) (>= unit 0))
+ (string-append " --unit=" (number->string unit))
+ #f)
+ "")
+ (if speed
+ (if (exact-integer? speed)
+ (string-append " --speed=" (number->string speed))
+ #f)
+ ""))
+ ""))))
+ (format #f "~a" io)))
+
(define (grub-root-search device file)
"Return the GRUB 'search' command to look for DEVICE, which contains FILE,
a gexp. The result is a gexp that can be inserted in the grub.cfg-generation
--
2.13.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
2017-05-13 5:21 ` bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings Leo Famulari
@ 2017-05-13 13:51 ` Ludovic Courtès
2017-05-13 16:40 ` Leo Famulari
2017-05-14 7:38 ` Mathieu Othacehe
0 siblings, 2 replies; 11+ messages in thread
From: Ludovic Courtès @ 2017-05-13 13:51 UTC (permalink / raw)
To: Leo Famulari; +Cc: 26875
Hi Leo,
Leo Famulari <leo@famulari.name> skribis:
> * gnu/system/grub.scm (<grub-configuration>): Add new fields
> terminal-outputs, terminal-inputs, serial-unit, and serial-speed.
> (grub-setup-io, setup-gfxterm): New procedures.
> * doc/guix.texi (GRUB Configuration): Document the new fields.
Overall LGTM. Nice to see it taking shape!
Some minor comments and suggestions:
> +@item @code{terminal-outputs} (default: @code{'gfxterm})
> +The output terminals used for the GRUB boot menu, as a list of symbols.
> +These values are accepted: console, serial, serial_@{0-3@}, gfxterm,
> +vga_text, mda_text, morse, spkmodem
Please use @code for the possible, add a final period, and a
cross-reference to the relevant part of the GRUB manual with
“(@pxref{…})” if possible.
> +@item @code{terminal-inputs} (default: @code{'()})
> +The input terminals used for the GRUB boot menu, as a list of symbols.
> +The default is the native platform terminal as determined by GRUB at
> +run-time. These values are accepted: console, serial, serial_@{0-3@},
> +at_keyboard, usb_keyboard.
> +
> +@item @code{serial-unit} (default: @code{#f})
> +The serial unit used by GRUB, as an integer from 0 to 3. The default
> +value is chosen by GRUB at run-time; currently GRUB chooses 0, which
> +corresponds to COM1.
Likewise.
> +@item @code{serial-speed} (default: @code{#f})
> +The speed of the serial interface, as an integer. The default value is
> +chosen by GRUB at run-time; currently GRUB chooses 9600bps.
9,600@tie{}bps. :-)
Apart from that, as long as “make check-system TESTS=basic” and similar
pass, that’s all good for me!
Mathieu: is it OK to apply this before the patch series on non-GRUB
bootloaders?
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
2017-05-13 13:51 ` Ludovic Courtès
@ 2017-05-13 16:40 ` Leo Famulari
2017-05-14 7:38 ` Mathieu Othacehe
1 sibling, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-13 16:40 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: 26875
[-- Attachment #1: Type: text/plain, Size: 1675 bytes --]
On Sat, May 13, 2017 at 03:51:27PM +0200, Ludovic Courtès wrote:
> > +@item @code{terminal-outputs} (default: @code{'gfxterm})
> > +The output terminals used for the GRUB boot menu, as a list of symbols.
> > +These values are accepted: console, serial, serial_@{0-3@}, gfxterm,
> > +vga_text, mda_text, morse, spkmodem
>
> Please use @code for the possible, add a final period, and a
> cross-reference to the relevant part of the GRUB manual with
> “(@pxref{…})” if possible.
Okay!
>
> > +@item @code{terminal-inputs} (default: @code{'()})
> > +The input terminals used for the GRUB boot menu, as a list of symbols.
> > +The default is the native platform terminal as determined by GRUB at
> > +run-time. These values are accepted: console, serial, serial_@{0-3@},
> > +at_keyboard, usb_keyboard.
> > +
> > +@item @code{serial-unit} (default: @code{#f})
> > +The serial unit used by GRUB, as an integer from 0 to 3. The default
> > +value is chosen by GRUB at run-time; currently GRUB chooses 0, which
> > +corresponds to COM1.
>
> Likewise.
Yes!
>
> > +@item @code{serial-speed} (default: @code{#f})
> > +The speed of the serial interface, as an integer. The default value is
> > +chosen by GRUB at run-time; currently GRUB chooses 9600bps.
>
> 9,600@tie{}bps. :-)
Sure!
> Apart from that, as long as “make check-system TESTS=basic” and similar
> pass, that’s all good for me!
I tried the basic, btrfs-root-os, and encrypted-root-os tests. Testers
should note this is an ABI break.
> Mathieu: is it OK to apply this before the patch series on non-GRUB
> bootloaders?
I'll wait for this response.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
2017-05-13 13:51 ` Ludovic Courtès
2017-05-13 16:40 ` Leo Famulari
@ 2017-05-14 7:38 ` Mathieu Othacehe
2017-05-14 18:17 ` Leo Famulari
1 sibling, 1 reply; 11+ messages in thread
From: Mathieu Othacehe @ 2017-05-14 7:38 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: 26875
> Mathieu: is it OK to apply this before the patch series on non-GRUB
> bootloaders?
Yes no problem ! This doesn't seems to difficult to rebase on top of my
serie. I guess "serial-unit" and "serial-speed" could fit in generic
"bootloader-configuration". I'm not sure for "terminal_inputs/outputs"
that seem grub specific.
Mathieu
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
2017-05-14 7:38 ` Mathieu Othacehe
@ 2017-05-14 18:17 ` Leo Famulari
0 siblings, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-14 18:17 UTC (permalink / raw)
To: Mathieu Othacehe; +Cc: 26875-done
On Sun, May 14, 2017 at 09:38:24AM +0200, Mathieu Othacehe wrote:
>
> > Mathieu: is it OK to apply this before the patch series on non-GRUB
> > bootloaders?
>
> Yes no problem !
Awesome! Pushed as e0b2e93005188ab4d6c7413a27832ba2fb7388e8.
> This doesn't seems to difficult to rebase on top of my
> serie. I guess "serial-unit" and "serial-speed" could fit in generic
> "bootloader-configuration". I'm not sure for "terminal_inputs/outputs"
> that seem grub specific.
Yes, the serial-unit (aka COM port) and serial-speed seem generically
useful on their own, as long you take care to handle the different
numbering between GRUB's serial-unit (zero indexed) and the COM port
numbering (indexed from 1).
The terminal inputs and outputs are generic only at the highest level.
At least, the choice between a graphical and text / curses interface
seeems universal. But of course other bootloader implementations will
support their own set of interfaces, and they may require extra
configuration.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#26875: Non-graphical (and other types) of GRUB interfaces
2017-05-11 7:36 bug#26875: Non-graphical (and other types) of GRUB interfaces Leo Famulari
2017-05-11 7:46 ` ng0
2017-05-13 5:21 ` bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings Leo Famulari
@ 2017-05-15 9:36 ` Brendan Tildesley
2017-05-15 18:04 ` Leo Famulari
2017-05-15 20:25 ` Leo Famulari
2 siblings, 2 replies; 11+ messages in thread
From: Brendan Tildesley @ 2017-05-15 9:36 UTC (permalink / raw)
To: 26875
I just updated to the latest git and rebooted to find the GRUB menu no
longer has the pretty GuixSD logo, but has fallen back to a
ncurses-looking blue box on black. Looks like it may be caused by this.
I haven't done any further investigation yet. What do you think?
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#26875: Non-graphical (and other types) of GRUB interfaces
2017-05-15 9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
@ 2017-05-15 18:04 ` Leo Famulari
2017-05-15 20:25 ` Leo Famulari
1 sibling, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-15 18:04 UTC (permalink / raw)
To: Brendan Tildesley; +Cc: 26875
On Mon, May 15, 2017 at 07:36:01PM +1000, Brendan Tildesley wrote:
> I just updated to the latest git and rebooted to find the GRUB menu no
> longer has the pretty GuixSD logo, but has fallen back to a
> ncurses-looking blue box on black. Looks like it may be caused by this.
> I haven't done any further investigation yet. What do you think?
Hm, that's not supposed to happen unless you tell it to.
Investigating...
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#26875: Non-graphical (and other types) of GRUB interfaces
2017-05-15 9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
2017-05-15 18:04 ` Leo Famulari
@ 2017-05-15 20:25 ` Leo Famulari
1 sibling, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-15 20:25 UTC (permalink / raw)
To: Brendan Tildesley; +Cc: 26875
[-- Attachment #1: Type: text/plain, Size: 896 bytes --]
On Mon, May 15, 2017 at 07:36:01PM +1000, Brendan Tildesley wrote:
> I just updated to the latest git and rebooted to find the GRUB menu no
> longer has the pretty GuixSD logo, but has fallen back to a
> ncurses-looking blue box on black. Looks like it may be caused by this.
> I haven't done any further investigation yet. What do you think?
The problem was that the elements of the generated GRUB configuration
file were in the wrong order. Even when the graphical menu should have
been displayed (it's still the default), various bits of GRUB scripting
failed.
Fixed in c48a145fbb613ac2b623f0a11278848923b312f1
Sorry for this! I tested that the correct menu got displayed in the
default case relatively early in development of this change. Later on I
only checked that the generated GRUB configuration looked correct,
because it's expensive (time and disk space) to test changes like this.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2017-05-15 20:26 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-11 7:36 bug#26875: Non-graphical (and other types) of GRUB interfaces Leo Famulari
2017-05-11 7:46 ` ng0
2017-05-13 5:15 ` Leo Famulari
2017-05-13 5:21 ` bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings Leo Famulari
2017-05-13 13:51 ` Ludovic Courtès
2017-05-13 16:40 ` Leo Famulari
2017-05-14 7:38 ` Mathieu Othacehe
2017-05-14 18:17 ` Leo Famulari
2017-05-15 9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
2017-05-15 18:04 ` Leo Famulari
2017-05-15 20:25 ` Leo Famulari
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).