guix-patches
[Top][All Lists]
Advanced

[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/





reply via email to

[Prev in Thread] Current Thread [Next in Thread]