Briefly, a boot loader is the first software program that runs when
a computer starts. It is responsible for loading and transferring
control to an operating system kernel software (such as the Linux
or GNU Hurd kernel). The kernel, in turn, initializes the rest of the
operating system (e.g. a GNU system).
GNU GRUB is a very powerful boot loader, which can load a wide variety
of free operating systems, as well as proprietary operating systems with
chain-loading(1). GRUB is designed to
address the complexity of booting a personal computer; both the
program and this manual are tightly bound to that computer platform,
although porting to other platforms may be addressed in the future.
One of the important features in GRUB is flexibility; GRUB understands
filesystems and kernel executable formats, so you can load an arbitrary
operating system the way you like, without recording the physical
position of your kernel on the disk.
Thus you can load the kernel just by specifying its file name and the
drive (and the partition) where the kernel resides. To let GRUB know the
drive and the file name, you can either type in them manually via the
command-line interface (see section 12.1 The flexible command-line interface), or use the nice
menu interface (see section 12.2 The simple menu interface) through which you can easily
select which OS it boots. To allow you to customize the menu, GRUB will
load a preexisting configuration file (see section 5. Configuration). Note that
you can not only enter the command-line interface whenever you like, but
also you can edit specific menu entries prior to using them.
In the following chapters, you will learn how to specify a drive or a
partition, and a file name (see section 2. Naming convention) to GRUB, how to
install GRUB on your drive (see section 3. Installation), and how to boot your
OSes (see section 4. Booting), step by step.
GRUB originated in 1995 when Erich Boleyn was trying to boot the GNU
Hurd with the University of Utah's Mach 4 microkernel (now known as GNU
Mach). Erich and Brian Ford designed the Multiboot Specification
(see section `Motivation' in The Multiboot Specification), because they were determined not to add to the large
number of mutually-incompatible PC boot methods.
Erich then began modifying the FreeBSD boot loader so that it would
understand Multiboot. He soon realized that it would be a lot easier
to write his own boot loader from scratch than to keep working on the
FreeBSD boot loader, and so GRUB was born.
Erich added many features to GRUB, but other priorities prevented him
from keeping up with the demands of its quickly-expanding user base. In
1999, Gordon Matzigkeit and OKUJI Yoshinori adopted GRUB as an official
GNU package, and opened its development by making the latest sources
available via anonymous CVS. See section B. How to obtain and build GRUB, for
The primary requirement for GRUB is that it be compliant with the
Multiboot Specification, which is described in section `Motivation' in The Multiboot Specification.
The other goals, listed in approximate order of importance, are:
Basic functions must be straightforward for end-users.
Rich functionality to support kernel experts and designers.
Backward compatibility for booting FreeBSD, NetBSD, OpenBSD, and
Linux. Proprietary kernels (such as DOS, Windows NT, and OS/2) are
supported via a chain-loading function.
Except for specific compatibility modes (chain-loading and the Linux
piggyback format), all kernels will be started in much the same
state as in the Multiboot Specification. Only kernels loaded at 1 megabyte
or above are presently supported. Any attempt to load below that
boundary will simply result in immediate failure and an error message
reporting the problem.
In addition to the requirements above, GRUB has the following features
(note that the Multiboot Specification doesn't require all the features
that GRUB supports):
Recognize multiple executable formats
Support many of the a.out variants plus ELF. Symbol
tables are also loaded.
Support non-Multiboot kernels
Support many of the various free 32-bit kernels that lack Multiboot
compliance (primarily FreeBSD, NetBSD, OpenBSD, and
Linux). Chain-loading of other boot loaders is also supported.
Load multiples modules
Fully support the Multiboot feature of loading multiple modules.
Load a configuration file
Support a human-readable text configuration file with preset boot
commands. You can also load another configuration file dynamically and
embed a preset configuration file in a GRUB image file. The list of
commands (see section 13. The list of available commands) are a superset of those supported on the
command-line. An example configuration file is provided in
Provide a menu interface
A menu interface listing the preset boot commands, with a programmable
timeout, is available. There is no fixed limit on the number of boot
entries, and the current implementation has space for several hundred.
Have a flexible command-line interface
A fairly flexible command-line interface, accessible from the menu,
is available to edit any preset commands, or write a new boot command
set from scratch. If no configuration file is present, GRUB drops to
The list of commands (see section 13. The list of available commands) are a subset of those supported
for configuration files. Editing commands closely resembles the Bash
command-line (see section `Command Line Editing' in Bash Features), with TAB-completion of commands,
devices, partitions, and files in a directory depending on context.
Support multiple filesystem types
Support multiple filesystem types transparently, plus a useful explicit
blocklist notation. The currently supported filesystem types are
BSD FFS, DOS FAT16 and FAT32, Minix fs, Linux
ext2fs, ReiserFS, JFS, XFS, and VSTa
fs. See section 11. Filesystem syntax and semantics, for more information.
Support automatic decompression
Can decompress files which were compressed by gzip. This
function is both automatic and transparent to the user (i.e. all
functions operate upon the uncompressed contents of the specified
files). This greatly reduces a file size and the loading time, a
particularly major benefit for floppies.(2)
It is conceivable that some kernel modules should be loaded in a
compressed state, so a different module-loading command can be specified
to avoid uncompressing the modules.
Access data on any installed device
Support reading data from any or all floppy or hard disk(s) recognized
by the BIOS, independent of the setting of the root device.
Be independent of drive geometry translations
Unlike many other boot loaders, GRUB makes the particular drive
translation irrelevant. A drive installed and running with one
translation may be converted to another translation without any adverse
effects or changes in GRUB's configuration.
Detect all installed RAM
GRUB can generally find all the installed RAM on a PC-compatible
machine. It uses an advanced BIOS query technique for finding all
memory regions. As described on the Multiboot Specification (see section `Motivation' in The Multiboot Specification), not all kernels make use of this information, but GRUB
provides it for those who do.
Support Logical Block Address mode
In traditional disk calls (called CHS mode), there is a geometry
translation problem, that is, the BIOS cannot access over 1024
cylinders, so the accessible space is limited to at least 508 MB and to
at most 8GB. GRUB can't universally solve this problem, as there is no
standard interface used in all machines. However, several newer machines
have the new interface, Logical Block Address (LBA) mode. GRUB
automatically detects if LBA mode is available and uses it if
available. In LBA mode, GRUB can access the entire disk.
Support network booting
GRUB is basically a disk-based boot loader but also has network
support. You can load OS images from a network by using the TFTP
Support remote terminals
To support computers with no console, GRUB provides remote terminal
support, so that you can control GRUB from a remote host. Only serial
terminal support is implemented at the moment.
The following is a quotation from Gordon Matzigkeit, a GRUB fanatic:
Some people like to acknowledge both the operating system and kernel when
they talk about their computers, so they might say they use
"GNU/Linux" or "GNU/Hurd". Other people seem to think that the
kernel is the most important part of the system, so they like to call
their GNU operating systems "Linux systems."
I, personally, believe that this is a grave injustice, because the
boot loader is the most important software of all. I used to
refer to the above systems as either "LILO"(3) or "GRUB"
Unfortunately, nobody ever understood what I was talking about; now I
just use the word "GNU" as a pseudonym for GRUB.
So, if you ever hear people talking about their alleged "GNU" systems,
remember that they are actually paying homage to the best boot loader
We, the GRUB maintainers, do not (usually) encourage Gordon's level of
fanaticism, but it helps to remember that boot loaders deserve
recognition. We hope that you enjoy using GNU GRUB as much as we did