system: grub: Allow arbitrary kernel file names in 'menu-entry'.
Fixes <http://bugs.gnu.org/20067>. Reported by Tomáš Čech <sleep_walker@suse.cz>. * gnu/system.scm (system-linux-image-file-name) (operating-system-kernel-file): New procedures. (operating-system-grub.cfg): Use 'operating-system-kernel-file' for the 'kernel' field of 'menu-entry'. (operating-system-parameters-file): Likewise for the 'kernel' entry. (read-boot-parameters): Adjust 'kernel' field so that it contains the absolute file name of the image. * gnu/system/grub.scm (grub-configuration-file)[linux-image-name]: Remove. [entry->gexp]: Assume LINUX is the absolute file name of the kernel image. * doc/guix.texi (GRUB Configuration): Add an example, and adjust 'kernel' field documentation accordingly.
This commit is contained in:
parent
a9e5e92f94
commit
44d5f54e31
@ -10622,9 +10622,23 @@ The @code{grub-theme} object describing the theme to use.
|
||||
|
||||
@end deftp
|
||||
|
||||
@cindex dual boot
|
||||
@cindex boot menu
|
||||
Should you want to list additional boot menu entries @i{via} the
|
||||
@code{menu-entries} field above, you will need to create them with the
|
||||
@code{menu-entry} form:
|
||||
@code{menu-entry} form. For example, imagine you want to be able to
|
||||
boot another distro (hard to imagine!), you can define a menu entry
|
||||
along these lines:
|
||||
|
||||
@example
|
||||
(menu-entry
|
||||
(label "The Other Distro")
|
||||
(linux "/boot/old/vmlinux-2.6.32")
|
||||
(linux-arguments '("root=/dev/sda2"))
|
||||
(initrd "/boot/old/initrd"))
|
||||
@end example
|
||||
|
||||
Details below.
|
||||
|
||||
@deftp {Data Type} menu-entry
|
||||
The type of an entry in the GRUB boot menu.
|
||||
@ -10635,7 +10649,11 @@ The type of an entry in the GRUB boot menu.
|
||||
The label to show in the menu---e.g., @code{"GNU"}.
|
||||
|
||||
@item @code{linux}
|
||||
The Linux kernel to boot.
|
||||
The Linux kernel image to boot, for example:
|
||||
|
||||
@example
|
||||
(file-append linux-libre "/bzImage")
|
||||
@end example
|
||||
|
||||
@item @code{linux-arguments} (default: @code{()})
|
||||
The list of extra Linux kernel command-line arguments---e.g.,
|
||||
|
@ -69,6 +69,7 @@
|
||||
operating-system-host-name
|
||||
operating-system-hosts-file
|
||||
operating-system-kernel
|
||||
operating-system-kernel-file
|
||||
operating-system-kernel-arguments
|
||||
operating-system-initrd
|
||||
operating-system-users
|
||||
@ -246,6 +247,19 @@ from the initrd."
|
||||
"Return the list of swap services for OS."
|
||||
(map swap-service (operating-system-swap-devices os)))
|
||||
|
||||
(define* (system-linux-image-file-name #:optional (system (%current-system)))
|
||||
"Return the basename of the kernel image file for SYSTEM."
|
||||
;; FIXME: Evaluate the conditional based on the actual current system.
|
||||
(if (string-prefix? "mips" (%current-system))
|
||||
"vmlinuz"
|
||||
"bzImage"))
|
||||
|
||||
(define (operating-system-kernel-file os)
|
||||
"Return an object representing the absolute file name of the kernel image of
|
||||
OS."
|
||||
(file-append (operating-system-kernel os)
|
||||
"/" (system-linux-image-file-name os)))
|
||||
|
||||
(define* (operating-system-directory-base-entries os #:key container?)
|
||||
"Return the basic entries of the 'system' directory of OS for use as the
|
||||
value of the SYSTEM-SERVICE-TYPE service."
|
||||
@ -710,12 +724,13 @@ listed in OS. The C library expects to find it under
|
||||
((system (operating-system-derivation os))
|
||||
(root-fs -> (operating-system-root-file-system os))
|
||||
(store-fs -> (operating-system-store-file-system os))
|
||||
(kernel -> (operating-system-kernel os))
|
||||
(label -> (kernel->grub-label (operating-system-kernel os)))
|
||||
(kernel -> (operating-system-kernel-file os))
|
||||
(root-device -> (if (eq? 'uuid (file-system-title root-fs))
|
||||
(uuid->string (file-system-device root-fs))
|
||||
(file-system-device root-fs)))
|
||||
(entries -> (list (menu-entry
|
||||
(label (kernel->grub-label kernel))
|
||||
(label label)
|
||||
(linux kernel)
|
||||
(linux-arguments
|
||||
(cons* (string-append "--root=" root-device)
|
||||
@ -739,7 +754,7 @@ this file is the reconstruction of GRUB menu entries for old configurations."
|
||||
#~(boot-parameters (version 0)
|
||||
(label #$label)
|
||||
(root-device #$(file-system-device root))
|
||||
(kernel #$(operating-system-kernel os))
|
||||
(kernel #$(operating-system-kernel-file os))
|
||||
(kernel-arguments
|
||||
#$(operating-system-kernel-arguments os))
|
||||
(initrd #$initrd))
|
||||
@ -768,7 +783,14 @@ this file is the reconstruction of GRUB menu entries for old configurations."
|
||||
(boot-parameters
|
||||
(label label)
|
||||
(root-device root)
|
||||
(kernel linux)
|
||||
|
||||
;; In the past, we would store the directory name of the kernel instead
|
||||
;; of the absolute file name of its image. Detect that and correct it.
|
||||
(kernel (if (string=? linux (direct-store-path linux))
|
||||
(string-append linux "/"
|
||||
(system-linux-image-file-name))
|
||||
linux))
|
||||
|
||||
(kernel-arguments
|
||||
(match (assq 'kernel-arguments rest)
|
||||
((_ args) args)
|
||||
|
@ -243,11 +243,6 @@ code."
|
||||
<grub-configuration> object, and where the store is available at STORE-FS, a
|
||||
<file-system> object. OLD-ENTRIES is taken to be a list of menu entries
|
||||
corresponding to old generations of the system."
|
||||
(define linux-image-name
|
||||
(if (string-prefix? "mips" system)
|
||||
"vmlinuz"
|
||||
"bzImage"))
|
||||
|
||||
(define all-entries
|
||||
(append entries (grub-configuration-menu-entries config)))
|
||||
|
||||
@ -256,14 +251,12 @@ corresponding to old generations of the system."
|
||||
(($ <menu-entry> label linux arguments initrd)
|
||||
#~(format port "menuentry ~s {
|
||||
~a
|
||||
linux ~a/~a ~a
|
||||
linux ~a ~a
|
||||
initrd ~a
|
||||
}~%"
|
||||
#$label
|
||||
#$(grub-root-search store-fs
|
||||
#~(string-append #$linux "/"
|
||||
#$linux-image-name))
|
||||
#$linux #$linux-image-name (string-join (list #$@arguments))
|
||||
#$(grub-root-search store-fs linux)
|
||||
#$linux (string-join (list #$@arguments))
|
||||
#$initrd))))
|
||||
|
||||
(mlet %store-monad ((sugar (eye-candy config store-fs system #~port)))
|
||||
|
Loading…
Reference in New Issue
Block a user