[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#26875: Non-graphical (and other types) of GRUB interfaces
From: |
ng0 |
Subject: |
bug#26875: Non-graphical (and other types) of GRUB interfaces |
Date: |
Thu, 11 May 2017 07:46:36 +0000 |
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 <address@hidden>
> 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.
> +
> address@hidden @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
> +
> address@hidden @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.
> +
> address@hidden @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.
> +
> address@hidden @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 <address@hidden>
> ;;; Copyright © 2016 Chris Marusich <address@hidden>
> +;;; Copyright © 2017 Leo Famulari <address@hidden>
> ;;;
> ;;; 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/