grubby/boot/grub/persistent/docs/06_your_own_configuration_file

741 lines
32 KiB
Plaintext

6 Writing your own configuration file
*************************************
GRUB is configured using 'grub.cfg', usually located under '/boot/grub'.
This file is quite flexible, but most users will not need to write the
whole thing by hand.
6.1 Simple configuration handling
=================================
The program 'grub-mkconfig' (*note Invoking grub-mkconfig::) generates
'grub.cfg' files suitable for most cases. It is suitable for use when
upgrading a distribution, and will discover available kernels and
attempt to generate menu entries for them.
'grub-mkconfig' does have some limitations. While adding extra
custom menu entries to the end of the list can be done by editing
'/etc/grub.d/40_custom' or creating '/boot/grub/custom.cfg', changing
the order of menu entries or changing their titles may require making
complex changes to shell scripts stored in '/etc/grub.d/'. This may be
improved in the future. In the meantime, those who feel that it would
be easier to write 'grub.cfg' directly are encouraged to do so (*note
Booting::, and *note Shell-like scripting::), and to disable any system
provided by their distribution to automatically run 'grub-mkconfig'.
The file '/etc/default/grub' controls the operation of
'grub-mkconfig'. It is sourced by a shell script, and so must be valid
POSIX shell input; normally, it will just be a sequence of 'KEY=value'
lines, but if the value contains spaces or other special characters then
it must be quoted. For example:
GRUB_TERMINAL_INPUT="console serial"
Valid keys in '/etc/default/grub' are as follows:
'GRUB_DEFAULT'
The default menu entry. This may be a number, in which case it
identifies the Nth entry in the generated menu counted from zero,
or the title of a menu entry, or the special string 'saved'. Using
the id may be useful if you want to set a menu entry as the default
even though there may be a variable number of entries before it.
For example, if you have:
menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
...
}
then you can make this the default using:
GRUB_DEFAULT=example-gnu-linux
Previously it was documented the way to use entry title. While
this still works it's not recommended since titles often contain
unstable device names and may be translated
If you set this to 'saved', then the default menu entry will be
that saved by 'GRUB_SAVEDEFAULT' or 'grub-set-default'. This
relies on the environment block, which may not be available in all
situations (*note Environment block::).
The default is '0'.
'GRUB_SAVEDEFAULT'
If this option is set to 'true', then, when an entry is selected,
save it as a new default entry for use by future runs of GRUB. This
is only useful if 'GRUB_DEFAULT=saved'; it is a separate option
because 'GRUB_DEFAULT=saved' is useful without this option, in
conjunction with 'grub-set-default'. Unset by default. This
option relies on the environment block, which may not be available
in all situations (*note Environment block::).
'GRUB_TIMEOUT'
Boot the default entry this many seconds after the menu is
displayed, unless a key is pressed. The default is '5'. Set to
'0' to boot immediately without displaying the menu, or to '-1' to
wait indefinitely.
If 'GRUB_TIMEOUT_STYLE' is set to 'countdown' or 'hidden', the
timeout is instead counted before the menu is displayed.
'GRUB_TIMEOUT_STYLE'
If this option is unset or set to 'menu', then GRUB will display
the menu and then wait for the timeout set by 'GRUB_TIMEOUT' to
expire before booting the default entry. Pressing a key interrupts
the timeout.
If this option is set to 'countdown' or 'hidden', then, before
displaying the menu, GRUB will wait for the timeout set by
'GRUB_TIMEOUT' to expire. If <ESC> is pressed during that time, it
will display the menu and wait for input. If a hotkey associated
with a menu entry is pressed, it will boot the associated menu
entry immediately. If the timeout expires before either of these
happens, it will boot the default entry. In the 'countdown' case,
it will show a one-line indication of the remaining time.
'GRUB_DEFAULT_BUTTON'
'GRUB_TIMEOUT_BUTTON'
'GRUB_TIMEOUT_STYLE_BUTTON'
'GRUB_BUTTON_CMOS_ADDRESS'
Variants of the corresponding variables without the '_BUTTON'
suffix, used to support vendor-specific power buttons. *Note
Vendor power-on keys::.
'GRUB_DISTRIBUTOR'
Set by distributors of GRUB to their identifying name. This is
used to generate more informative menu entry titles.
'GRUB_TERMINAL_INPUT'
Select the terminal input device. You may select multiple devices
here, separated by spaces.
Valid terminal input names depend on the platform, but may include
'console' (native platform console), 'serial' (serial terminal),
'serial_<port>' (serial terminal with explicit port selection),
'at_keyboard' (PC AT keyboard), or 'usb_keyboard' (USB keyboard
using the HID Boot Protocol, for cases where the firmware does not
handle this).
The default is to use the platform's native terminal input.
'GRUB_TERMINAL_OUTPUT'
Select the terminal output device. You may select multiple devices
here, separated by spaces.
Valid terminal output names depend on the platform, but may include
'console' (native platform console), 'serial' (serial terminal),
'serial_<port>' (serial terminal with explicit port selection),
'gfxterm' (graphics-mode output), 'vga_text' (VGA text output),
'mda_text' (MDA text output), 'morse' (Morse-coding using system
beeper) or 'spkmodem' (simple data protocol using system speaker).
'spkmodem' is useful when no serial port is available. Connect the
output of sending system (where GRUB is running) to line-in of
receiving system (usually developer machine). On receiving system
compile 'spkmodem-recv' from 'util/spkmodem-recv.c' and run:
parecord --channels=1 --rate=48000 --format=s16le | ./spkmodem-recv
The default is to use the platform's native terminal output.
'GRUB_TERMINAL'
If this option is set, it overrides both 'GRUB_TERMINAL_INPUT' and
'GRUB_TERMINAL_OUTPUT' to the same value.
'GRUB_SERIAL_COMMAND'
A command to configure the serial port when using the serial
console. *Note serial::. Defaults to 'serial'.
'GRUB_CMDLINE_LINUX'
Command-line arguments to add to menu entries for the Linux kernel.
'GRUB_CMDLINE_LINUX_DEFAULT'
Unless 'GRUB_DISABLE_RECOVERY' is set to 'true', two menu entries
will be generated for each Linux kernel: one default entry and one
entry for recovery mode. This option lists command-line arguments
to add only to the default menu entry, after those listed in
'GRUB_CMDLINE_LINUX'.
'GRUB_CMDLINE_NETBSD'
'GRUB_CMDLINE_NETBSD_DEFAULT'
As 'GRUB_CMDLINE_LINUX' and 'GRUB_CMDLINE_LINUX_DEFAULT', but for
NetBSD.
'GRUB_CMDLINE_GNUMACH'
As 'GRUB_CMDLINE_LINUX', but for GNU Mach.
'GRUB_CMDLINE_XEN'
'GRUB_CMDLINE_XEN_DEFAULT'
The values of these options are passed to Xen hypervisor Xen menu
entries, for all respectively normal entries.
'GRUB_CMDLINE_LINUX_XEN_REPLACE'
'GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT'
The values of these options replace the values of
'GRUB_CMDLINE_LINUX' and 'GRUB_CMDLINE_LINUX_DEFAULT' for Linux and
Xen menu entries.
'GRUB_EARLY_INITRD_LINUX_CUSTOM'
'GRUB_EARLY_INITRD_LINUX_STOCK'
List of space-separated early initrd images to be loaded from
'/boot'. This is for loading things like CPU microcode, firmware,
ACPI tables, crypto keys, and so on. These early images will be
loaded in the order declared, and all will be loaded before the
actual functional initrd image.
'GRUB_EARLY_INITRD_LINUX_STOCK' is for your distribution to declare
images that are provided by the distribution. It should not be
modified without understanding the consequences. They will be
loaded first.
'GRUB_EARLY_INITRD_LINUX_CUSTOM' is for your custom created images.
The default stock images are as follows, though they may be
overridden by your distribution:
intel-uc.img intel-ucode.img amd-uc.img amd-ucode.img early_ucode.cpio microcode.cpio
'GRUB_DISABLE_LINUX_UUID'
Normally, 'grub-mkconfig' will generate menu entries that use
universally-unique identifiers (UUIDs) to identify the root
filesystem to the Linux kernel, using a 'root=UUID=...' kernel
parameter. This is usually more reliable, but in some cases it may
not be appropriate. To disable the use of UUIDs, set this option
to 'true'.
'GRUB_DISABLE_LINUX_PARTUUID'
If 'grub-mkconfig' cannot identify the root filesystem via its
universally-unique indentifier (UUID), 'grub-mkconfig' can use the
UUID of the partition containing the filesystem to identify the
root filesystem to the Linux kernel via a 'root=PARTUUID=...'
kernel parameter. This is not as reliable as using the filesystem
UUID, but is more reliable than using the Linux device names. When
'GRUB_DISABLE_LINUX_PARTUUID' is set to 'false', the Linux kernel
version must be 2.6.37 (3.10 for systems using the MSDOS partition
scheme) or newer. This option defaults to 'true'. To enable the
use of partition UUIDs, set this option to 'false'.
'GRUB_DISABLE_RECOVERY'
If this option is set to 'true', disable the generation of recovery
mode menu entries.
'GRUB_VIDEO_BACKEND'
If graphical video support is required, either because the
'gfxterm' graphical terminal is in use or because
'GRUB_GFXPAYLOAD_LINUX' is set, then 'grub-mkconfig' will normally
load all available GRUB video drivers and use the one most
appropriate for your hardware. If you need to override this for
some reason, then you can set this option.
After 'grub-install' has been run, the available video drivers are
listed in '/boot/grub/video.lst'.
'GRUB_GFXMODE'
Set the resolution used on the 'gfxterm' graphical terminal. Note
that you can only use modes which your graphics card supports via
VESA BIOS Extensions (VBE), so for example native LCD panel
resolutions may not be available. The default is 'auto', which
tries to select a preferred resolution. *Note gfxmode::.
'GRUB_BACKGROUND'
Set a background image for use with the 'gfxterm' graphical
terminal. The value of this option must be a file readable by GRUB
at boot time, and it must end with '.png', '.tga', '.jpg', or
'.jpeg'. The image will be scaled if necessary to fit the screen.
'GRUB_THEME'
Set a theme for use with the 'gfxterm' graphical terminal.
'GRUB_GFXPAYLOAD_LINUX'
Set to 'text' to force the Linux kernel to boot in normal text
mode, 'keep' to preserve the graphics mode set using
'GRUB_GFXMODE', 'WIDTHxHEIGHT'['xDEPTH'] to set a particular
graphics mode, or a sequence of these separated by commas or
semicolons to try several modes in sequence. *Note gfxpayload::.
Depending on your kernel, your distribution, your graphics card,
and the phase of the moon, note that using this option may cause
GNU/Linux to suffer from various display problems, particularly
during the early part of the boot sequence. If you have problems,
set this option to 'text' and GRUB will tell Linux to boot in
normal text mode.
'GRUB_DISABLE_OS_PROBER'
Normally, 'grub-mkconfig' will try to use the external 'os-prober'
program, if installed, to discover other operating systems
installed on the same system and generate appropriate menu entries
for them. Set this option to 'true' to disable this.
'GRUB_OS_PROBER_SKIP_LIST'
List of space-separated FS UUIDs of filesystems to be ignored from
os-prober output. For efi chainloaders it's <UUID>@<EFI FILE>
'GRUB_DISABLE_SUBMENU'
Normally, 'grub-mkconfig' will generate top level menu entry for
the kernel with highest version number and put all other found
kernels or alternative menu entries for recovery mode in submenu.
For entries returned by 'os-prober' first entry will be put on top
level and all others in submenu. If this option is set to 'y',
flat menu with all entries on top level will be generated instead.
Changing this option will require changing existing values of
'GRUB_DEFAULT', 'fallback' (*note fallback::) and 'default' (*note
default::) environment variables as well as saved default entry
using 'grub-set-default' and value used with 'grub-reboot'.
'GRUB_ENABLE_CRYPTODISK'
If set to 'y', 'grub-mkconfig' and 'grub-install' will check for
encrypted disks and generate additional commands needed to access
them during boot. Note that in this case unattended boot is not
possible because GRUB will wait for passphrase to unlock encrypted
container.
'GRUB_INIT_TUNE'
Play a tune on the speaker when GRUB starts. This is particularly
useful for users unable to see the screen. The value of this
option is passed directly to *note play::.
'GRUB_BADRAM'
If this option is set, GRUB will issue a *note badram:: command to
filter out specified regions of RAM.
'GRUB_PRELOAD_MODULES'
This option may be set to a list of GRUB module names separated by
spaces. Each module will be loaded as early as possible, at the
start of 'grub.cfg'.
The following options are still accepted for compatibility with
existing configurations, but have better replacements:
'GRUB_HIDDEN_TIMEOUT'
Wait this many seconds before displaying the menu. If <ESC> is
pressed during that time, display the menu and wait for input
according to 'GRUB_TIMEOUT'. If a hotkey associated with a menu
entry is pressed, boot the associated menu entry immediately. If
the timeout expires before either of these happens, display the
menu for the number of seconds specified in 'GRUB_TIMEOUT' before
booting the default entry.
If you set 'GRUB_HIDDEN_TIMEOUT', you should also set
'GRUB_TIMEOUT=0' so that the menu is not displayed at all unless
<ESC> is pressed.
This option is unset by default, and is deprecated in favour of the
less confusing 'GRUB_TIMEOUT_STYLE=countdown' or
'GRUB_TIMEOUT_STYLE=hidden'.
'GRUB_HIDDEN_TIMEOUT_QUIET'
In conjunction with 'GRUB_HIDDEN_TIMEOUT', set this to 'true' to
suppress the verbose countdown while waiting for a key to be
pressed before displaying the menu.
This option is unset by default, and is deprecated in favour of the
less confusing 'GRUB_TIMEOUT_STYLE=countdown'.
'GRUB_HIDDEN_TIMEOUT_BUTTON'
Variant of 'GRUB_HIDDEN_TIMEOUT', used to support vendor-specific
power buttons. *Note Vendor power-on keys::.
This option is unset by default, and is deprecated in favour of the
less confusing 'GRUB_TIMEOUT_STYLE=countdown' or
'GRUB_TIMEOUT_STYLE=hidden'.
For more detailed customisation of 'grub-mkconfig''s output, you may
edit the scripts in '/etc/grub.d' directly. '/etc/grub.d/40_custom' is
particularly useful for adding entire custom menu entries; simply type
the menu entries you want to add at the end of that file, making sure to
leave at least the first two lines intact.
6.2 Root Identifcation Heuristics
=================================
If the target operating system uses the Linux kernel, 'grub-mkconfig'
attempts to identify the root file system via a heuristic algoirthm.
This algorithm selects the identification method of the root file system
by considering three factors. The first is if an initrd for the target
operating system is also present. The second is
'GRUB_DISABLE_LINUX_UUID' and if set to 'true', prevents 'grub-mkconfig'
from identifying the root file system by its UUID. The third is
'GRUB_DISABLE_LINUX_PARTUUID' and if set to 'true', prevents
'grub-mkconfig' from identifying the root file system via the UUID of
its enclosing partition. If the variables are assigned any other value,
that value is considered equivalent to 'false'. The variables are also
considered to be set to 'false' if they are not set.
When booting, the Linux kernel will delegate the task of mounting the
root filesystem to the initrd. Most initrd images determine the root
file system by checking the Linux kernel's command-line for the 'root'
key and use its value as the identification method of the root file
system. To improve the reliability of booting, most initrd images also
allow the root file system to be identified by its UUID. Because of this
behavior, the 'grub-mkconfig' command will set 'root' to 'root=UUID=...'
to provide the initrd with the filesystem UUID of the root file system.
If no initrd is detected or 'GRUB_DISABLE_LINUX_UUID' is set to
'true' then 'grub-command' will identify the root filesystem by setting
the kernel command-line variable 'root' to 'root=PARTUUID=...' unless
'GRUB_DISABLE_LINUX_PARTUUID' is also set to 'true'. If
'GRUB_DISABLE_LINUX_PARTUUID' is also set to 'true', 'grub-command' will
identify by its Linux device name.
The following table summarizes the behavior of the 'grub-mkconfig'
command.
Initrd GRUB_DISABLE_LINUX_PARTUUID GRUB_DISABLE_LINUX_UUID Linux Root
detected Set To Set To ID Method
--------------------------------------------------------------------------------
false false false part UUID
false false true part UUID
false true false dev name
false true true dev name
true false false fs UUID
true false true part UUID
true true false fs UUID
true true true dev name
Remember, 'GRUB_DISABLE_LINUX_PARTUUID' and 'GRUB_DISABLE_LINUX_UUID'
are also considered to be set to 'false' when they are unset.
6.3 Writing full configuration files directly
=============================================
'grub.cfg' is written in GRUB's built-in scripting language, which has a
syntax quite similar to that of GNU Bash and other Bourne shell
derivatives.
Words
=====
A "word" is a sequence of characters considered as a single unit by
GRUB. Words are separated by "metacharacters", which are the following
plus space, tab, and newline:
{ } | & $ ; < >
Quoting may be used to include metacharacters in words; see below.
Reserved words
==============
Reserved words have a special meaning to GRUB. The following words are
recognised as reserved when unquoted and either the first word of a
simple command or the third word of a 'for' command:
! [[ ]] { }
case do done elif else esac fi for function
if in menuentry select then time until while
Not all of these reserved words have a useful purpose yet; some are
reserved for future expansion.
Quoting
=======
Quoting is used to remove the special meaning of certain characters or
words. It can be used to treat metacharacters as part of a word, to
prevent reserved words from being recognised as such, and to prevent
variable expansion.
There are three quoting mechanisms: the escape character, single
quotes, and double quotes.
A non-quoted backslash (\) is the "escape character". It preserves
the literal value of the next character that follows, with the exception
of newline.
Enclosing characters in single quotes preserves the literal value of
each character within the quotes. A single quote may not occur between
single quotes, even when preceded by a backslash.
Enclosing characters in double quotes preserves the literal value of
all characters within the quotes, with the exception of '$' and '\'.
The '$' character retains its special meaning within double quotes. The
backslash retains its special meaning only when followed by one of the
following characters: '$', '"', '\', or newline. A backslash-newline
pair is treated as a line continuation (that is, it is removed from the
input stream and effectively ignored(1) (*note Shell-like
scripting-Footnote-1::)). A double quote may be quoted within double
quotes by preceding it with a backslash.
Variable expansion
==================
The '$' character introduces variable expansion. The variable name to
be expanded may be enclosed in braces, which are optional but serve to
protect the variable to be expanded from characters immediately
following it which could be interpreted as part of the name.
Normal variable names begin with an alphabetic character, followed by
zero or more alphanumeric characters. These names refer to entries in
the GRUB environment (*note Environment::).
Positional variable names consist of one or more digits. They
represent parameters passed to function calls, with '$1' representing
the first parameter, and so on.
The special variable name '?' expands to the exit status of the most
recently executed command. When positional variable names are active,
other special variable names '@', '*' and '#' are defined and they
expand to all positional parameters with necessary quoting, positional
parameters without any quoting, and positional parameter count
respectively.
Comments
========
A word beginning with '#' causes that word and all remaining characters
on that line to be ignored.
Simple commands
===============
A "simple command" is a sequence of words separated by spaces or tabs
and terminated by a semicolon or a newline. The first word specifies
the command to be executed. The remaining words are passed as arguments
to the invoked command.
The return value of a simple command is its exit status. If the
reserved word '!' precedes the command, then the return value is instead
the logical negation of the command's exit status.
Compound commands
=================
A "compound command" is one of the following:
for NAME in WORD ...; do LIST; done
The list of words following 'in' is expanded, generating a list of
items. The variable NAME is set to each element of this list in
turn, and LIST is executed each time. The return value is the exit
status of the last command that executes. If the expansion of the
items following 'in' results in an empty list, no commands are
executed, and the return status is 0.
if LIST; then LIST; [elif LIST; then LIST;] ... [else LIST;] fi
The 'if' LIST is executed. If its exit status is zero, the 'then'
LIST is executed. Otherwise, each 'elif' LIST is executed in turn,
and if its exit status is zero, the corresponding 'then' LIST is
executed and the command completes. Otherwise, the 'else' LIST is
executed, if present. The exit status is the exit status of the
last command executed, or zero if no condition tested true.
while COND; do LIST; done
until COND; do LIST; done
The 'while' command continuously executes the 'do' LIST as long as
the last command in COND returns an exit status of zero. The
'until' command is identical to the 'while' command, except that
the test is negated; the 'do' LIST is executed as long as the last
command in COND returns a non-zero exit status. The exit status of
the 'while' and 'until' commands is the exit status of the last
'do' LIST command executed, or zero if none was executed.
function NAME { COMMAND; ... }
This defines a function named NAME. The "body" of the function is
the list of commands within braces, each of which must be
terminated with a semicolon or a newline. This list of commands
will be executed whenever NAME is specified as the name of a simple
command. Function definitions do not affect the exit status in
'$?'. When executed, the exit status of a function is the exit
status of the last command executed in the body.
menuentry TITLE ['--class=class' ...] ['--users=users'] ['--unrestricted'] ['--hotkey=key'] ['--id=id'] { COMMAND; ... }
*Note menuentry::.
Built-in Commands
=================
Some built-in commands are also provided by GRUB script to help script
writers perform actions that are otherwise not possible. For example,
these include commands to jump out of a loop without fully completing
it, etc.
break ['n']
Exit from within a 'for', 'while', or 'until' loop. If 'n' is
specified, break 'n' levels. 'n' must be greater than or equal to
1. If 'n' is greater than the number of enclosing loops, all
enclosing loops are exited. The return value is 0 unless 'n' is
not greater than or equal to 1.
continue ['n']
Resume the next iteration of the enclosing 'for', 'while' or
'until' loop. If 'n' is specified, resume at the 'n'th enclosing
loop. 'n' must be greater than or equal to 1. If 'n' is greater
than the number of enclosing loops, the last enclosing loop (the
"top-level" loop) is resumed. The return value is 0 unless 'n' is
not greater than or equal to 1.
return ['n']
Causes a function to exit with the return value specified by 'n'.
If 'n' is omitted, the return status is that of the last command
executed in the function body. If used outside a function the
return status is false.
setparams ['arg'] ...
Replace positional parameters starting with '$1' with arguments to
'setparams'.
shift ['n']
The positional parameters from 'n'+1 ... are renamed to '$1'....
Parameters represented by the numbers '$#' down to '$#'-'n'+1 are
unset. 'n' must be a non-negative number less than or equal to
'$#'. If 'n' is 0, no parameters are changed. If 'n' is not
given, it is assumed to be 1. If 'n' is greater than '$#', the
positional parameters are not changed. The return status is
greater than zero if 'n' is greater than '$#' or less than zero;
otherwise 0.
(1) Currently a backslash-newline pair within a variable name is not
handled properly, so use this feature with some care.
6.4 Multi-boot manual config
============================
Currently autogenerating config files for multi-boot environments
depends on os-prober and has several shortcomings. While fixing it is
scheduled for the next release, meanwhile you can make use of the power
of GRUB syntax and do it yourself. A possible configuration is detailed
here, feel free to adjust to your needs.
First create a separate GRUB partition, big enough to hold GRUB. Some
of the following entries show how to load OS installer images from this
same partition, for that you obviously need to make the partition large
enough to hold those images as well. Mount this partition on/mnt/boot
and disable GRUB in all OSes and manually install self-compiled latest
GRUB with:
'grub-install --boot-directory=/mnt/boot /dev/sda'
In all the OSes install GRUB tools but disable installing GRUB in
bootsector, so you'll have menu.lst and grub.cfg available for use.
Also disable os-prober use by setting:
'GRUB_DISABLE_OS_PROBER=true'
in /etc/default/grub
Then write a grub.cfg (/mnt/boot/grub/grub.cfg):
menuentry "OS using grub2" {
insmod xfs
search --set=root --label OS1 --hint hd0,msdos8
configfile /boot/grub/grub.cfg
}
menuentry "OS using grub2-legacy" {
insmod ext2
search --set=root --label OS2 --hint hd0,msdos6
legacy_configfile /boot/grub/menu.lst
}
menuentry "Windows XP" {
insmod ntfs
search --set=root --label WINDOWS_XP --hint hd0,msdos1
ntldr /ntldr
}
menuentry "Windows 7" {
insmod ntfs
search --set=root --label WINDOWS_7 --hint hd0,msdos2
ntldr /bootmgr
}
menuentry "FreeBSD" {
insmod zfs
search --set=root --label freepool --hint hd0,msdos7
kfreebsd /freebsd@/boot/kernel/kernel
kfreebsd_module_elf /freebsd@/boot/kernel/opensolaris.ko
kfreebsd_module_elf /freebsd@/boot/kernel/zfs.ko
kfreebsd_module /freebsd@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
set kFreeBSD.vfs.root.mountfrom=zfs:freepool/freebsd
set kFreeBSD.hw.psm.synaptics_support=1
}
menuentry "experimental GRUB" {
search --set=root --label GRUB --hint hd0,msdos5
multiboot /experimental/grub/i386-pc/core.img
}
menuentry "Fedora 16 installer" {
search --set=root --label GRUB --hint hd0,msdos5
linux /fedora/vmlinuz lang=en_US keymap=sg resolution=1280x800
initrd /fedora/initrd.img
}
menuentry "Fedora rawhide installer" {
search --set=root --label GRUB --hint hd0,msdos5
linux /fedora/vmlinuz repo=ftp://mirror.switch.ch/mirror/fedora/linux/development/rawhide/x86_64 lang=en_US keymap=sg resolution=1280x800
initrd /fedora/initrd.img
}
menuentry "Debian sid installer" {
search --set=root --label GRUB --hint hd0,msdos5
linux /debian/dists/sid/main/installer-amd64/current/images/hd-media/vmlinuz
initrd /debian/dists/sid/main/installer-amd64/current/images/hd-media/initrd.gz
}
Notes:
* Argument to search after -label is FS LABEL. You can also use UUIDs
with -fs-uuid UUID instead of -label LABEL. You could also use
direct 'root=hd0,msdosX' but this is not recommended due to device
name instability.
6.5 Embedding a configuration file into GRUB
============================================
GRUB supports embedding a configuration file directly into the core
image, so that it is loaded before entering normal mode. This is
useful, for example, when it is not straightforward to find the real
configuration file, or when you need to debug problems with loading that
file. 'grub-install' uses this feature when it is not using BIOS disk
functions or when installing to a different disk from the one containing
'/boot/grub', in which case it needs to use the 'search' command (*note
search::) to find '/boot/grub'.
To embed a configuration file, use the '-c' option to 'grub-mkimage'.
The file is copied into the core image, so it may reside anywhere on the
file system, and may be removed after running 'grub-mkimage'.
After the embedded configuration file (if any) is executed, GRUB will
load the 'normal' module (*note normal::), which will then read the real
configuration file from '$prefix/grub.cfg'. By this point, the 'root'
variable will also have been set to the root device name. For example,
'prefix' might be set to '(hd0,1)/boot/grub', and 'root' might be set to
'hd0,1'. Thus, in most cases, the embedded configuration file only
needs to set the 'prefix' and 'root' variables, and then drop through to
GRUB's normal processing. A typical example of this might look like
this:
search.fs_uuid 01234567-89ab-cdef-0123-456789abcdef root
set prefix=($root)/boot/grub
(The 'search_fs_uuid' module must be included in the core image for
this example to work.)
In more complex cases, it may be useful to read other configuration
files directly from the embedded configuration file. This allows such
things as reading files not called 'grub.cfg', or reading files from a
directory other than that where GRUB's loadable modules are installed.
To do this, include the 'configfile' and 'normal' modules in the core
image, and embed a configuration file that uses the 'configfile' command
to load another file. The following example of this also requires the
'echo', 'search_label', and 'test' modules to be included in the core
image:
search.fs_label grub root
if [ -e /boot/grub/example/test1.cfg ]; then
set prefix=($root)/boot/grub
configfile /boot/grub/example/test1.cfg
else
if [ -e /boot/grub/example/test2.cfg ]; then
set prefix=($root)/boot/grub
configfile /boot/grub/example/test2.cfg
else
echo "Could not find an example configuration file!"
fi
fi
The embedded configuration file may not contain menu entries
directly, but may only read them from elsewhere using 'configfile'.