GRUB supports preset menu which is always loaded before starting.
The preset menu feature is useful, for example, when your computer has
no console but a serial cable. In this case, it is critical to set up
the serial terminal as soon as possible, since you cannot see any
message until the serial terminal begins to work. So it is nice to run
the commands serial (see section 13.2.11 serial) and terminal
(see section 13.2.13 terminal) sooner than anything else at the start-up time.
It is slightly complicated how the preset menu works:
GRUB checks if the preset menu feature is used, and loads the preset
menu, if available. This includes running commands and reading boot
entries, like an ordinary configuration file.
GRUB checks if the configuration file is available. Note that this check
is performed regardless of the existence of the preset
menu. The configuration file is loaded, even after the preset menu was
loaded.
When the preset menu includes any boot entries, they are cleared when
the configuration file is loaded. It doesn't matter whether the
configuration file has any entries or no entry. The boot entries in the
preset menu are used only when GRUB fails in loading the configuration
file.
To enable the preset menu feature, you must specify a file to the
configure script with the option `--enable-preset-menu'. The file
has the same semantics as normal configuration files
(see section 5. Configuration).
Another point you should take care is that the diskless support
(see section 6.2 Booting from a network) diverts the preset menu. Diskless images embed a
preset menu to execute the command bootp (see section 13.2.1 bootp)
automatically, unless you specify your own preset menu to the configure
script. This means that you must put commands to initialize a network in
the preset menu yourself, because diskless images don't set it up
implicitly, when you use the preset menu explicitly.
Therefore, a typical preset menu used with diskless support would be
like this:
# Set up the serial terminal, first of all.
serial --unit=0 --speed=19200
terminal --timeout=0 serial
# Initialize the network.
dhcp