From: Leo Famulari <leo@famulari.name>
To: 26875@debbugs.gnu.org
Subject: bug#26875: Non-graphical (and other types) of GRUB interfaces
Date: Thu, 11 May 2017 03:36:26 -0400 [thread overview]
Message-ID: <20170511073626.GA4698@jasmine> (raw)
[-- 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 --]
next reply other threads:[~2017-05-11 7:37 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-11 7:36 Leo Famulari [this message]
2017-05-11 7:46 ` bug#26875: Non-graphical (and other types) of GRUB interfaces 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
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=20170511073626.GA4698@jasmine \
--to=leo@famulari.name \
--cc=26875@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).