1 Introduction to GRUB
**********************

1.1 Overview
============

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 Linux or GNU Mach).
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) (*note Overview-Footnote-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 partition
where the kernel resides.

   When booting with GRUB, you can use either a command-line interface
(*note Command-line interface::), or a menu interface (*note Menu
interface::).  Using the command-line interface, you type the drive
specification and file name of the kernel manually.  In the menu
interface, you just select an OS using the arrow keys.  The menu is
based on a configuration file which you prepare beforehand (*note
Configuration::).  While in the menu, you can switch to the command-line
mode, and vice-versa.  You can even edit menu entries before using them.

   In the following chapters, you will learn how to specify a drive, a
partition, and a file name (*note Naming convention::) to GRUB, how to
install GRUB on your drive (*note Installation::), and how to boot your
OSes (*note Booting::), step by step.

   (1) "chain-load" is the mechanism for loading unsupported operating
systems by loading another boot loader.  It is typically used for
loading DOS or Windows.

1.2 History of GRUB
===================

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 (*note
Multiboot Specification: (multiboot)Top.), 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 Yoshinori K. Okuji adopted GRUB as an
official GNU package, and opened its development by making the latest
sources available via anonymous CVS. *Note Obtaining and Building
GRUB::, for more information.

   Over the next few years, GRUB was extended to meet many needs, but it
quickly became clear that its design was not keeping up with the
extensions being made to it, and we reached the point where it was very
difficult to make any further changes without breaking existing
features.  Around 2002, Yoshinori K. Okuji started work on PUPA
(Preliminary Universal Programming Architecture for GNU GRUB), aiming to
rewrite the core of GRUB to make it cleaner, safer, more robust, and
more powerful.  PUPA was eventually renamed to GRUB 2, and the original
version of GRUB was renamed to GRUB Legacy.  Small amounts of
maintenance continued to be done on GRUB Legacy, but the last release
(0.97) was made in 2005 and at the time of writing it seems unlikely
that there will be another.

   By around 2007, GNU/Linux distributions started to use GRUB 2 to
limited extents, and by the end of 2009 multiple major distributions
were installing it by default.

1.3 Differences from previous versions
======================================

GRUB 2 is a rewrite of GRUB (*note History::), although it shares many
characteristics with the previous version, now known as GRUB Legacy.
Users of GRUB Legacy may need some guidance to find their way around
this new version.

   * The configuration file has a new name ('grub.cfg' rather than
     'menu.lst' or 'grub.conf'), new syntax (*note Configuration::) and
     many new commands (*note Commands::).  Configuration cannot be
     copied over directly, although most GRUB Legacy users should not
     find the syntax too surprising.

   * 'grub.cfg' is typically automatically generated by 'grub-mkconfig'
     (*note Simple configuration::).  This makes it easier to handle
     versioned kernel upgrades.

   * Partition numbers in GRUB device names now start at 1, not 0 (*note
     Naming convention::).

   * The configuration file is now written in something closer to a full
     scripting language: variables, conditionals, and loops are
     available.

   * A small amount of persistent storage is available across reboots,
     using the 'save_env' and 'load_env' commands in GRUB and the
     'grub-editenv' utility.  This is not available in all
     configurations (*note Environment block::).

   * GRUB 2 has more reliable ways to find its own files and those of
     target kernels on multiple-disk systems, and has commands (*note
     search::) to find devices using file system labels or Universally
     Unique Identifiers (UUIDs).

   * GRUB 2 is available for several other types of system in addition
     to the PC BIOS systems supported by GRUB Legacy: PC EFI, PC
     coreboot, PowerPC, SPARC, and MIPS Lemote Yeeloong are all
     supported.

   * Many more file systems are supported, including but not limited to
     ext4, HFS+, and NTFS.

   * GRUB 2 can read files directly from LVM and RAID devices.

   * A graphical terminal and a graphical menu system are available.

   * GRUB 2's interface can be translated, including menu entry names.

   * The image files (*note Images::) that make up GRUB have been
     reorganised; Stage 1, Stage 1.5, and Stage 2 are no more.

   * GRUB 2 puts many facilities in dynamically loaded modules, allowing
     the core image to be smaller, and allowing the core image to be
     built in more flexible ways.

1.4 GRUB features
=================

The primary requirement for GRUB is that it be compliant with the
"Multiboot Specification", which is described in *note Multiboot
Specification: (multiboot)Top.

   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(1) (*note
     Features-Footnote-1::), 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 (*note Commands::) are a superset of those
     supported on the command-line.  An example configuration file is
     provided in *note Configuration::.

Provide a menu interface
     A menu interface listing 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 command-line.

     The list of commands (*note Commands::) are a subset of those
     supported for configuration files.  Editing commands closely
     resembles the Bash command-line (*note Bash: (features)Command Line
     Editing.), 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 "Amiga Fast FileSystem (AFFS)", "AtheOS fs", "BeFS",
     "BtrFS" (including raid0, raid1, raid10, gzip and lzo), "cpio"
     (little- and big-endian bin, odc and newc variants), "Linux
     ext2/ext3/ext4", "DOS FAT12/FAT16/FAT32", "exFAT", "F2FS", "HFS",
     "HFS+", "ISO9660" (including Joliet, Rock-ridge and multi-chunk
     files), "JFS", "Minix fs" (versions 1, 2 and 3), "nilfs2", "NTFS"
     (including compression), "ReiserFS", "ROMFS", "Amiga Smart
     FileSystem (SFS)", "Squash4", "tar", "UDF", "BSD UFS/UFS2", "XFS",
     and "ZFS" (including lzjb, gzip, zle, mirror, stripe, raidz1/2/3
     and encryption in AES-CCM and AES-GCM). *Note Filesystem::, for
     more information.

Support automatic decompression
     Can decompress files which were compressed by 'gzip' or 'xz'(2)
     (*note Features-Footnote-2::).  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 loading time, a particularly great benefit
     for floppies.(3)  (*note Features-Footnote-3::)

     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 floppies 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 (*note
     Multiboot Specification: (multiboot)Top.), 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"
     protocol.

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.

   (1) The NetBSD/i386 kernel is Multiboot-compliant, but lacks support
for Multiboot modules.

   (2) Only CRC32 data integrity check is supported (xz default is CRC64
so one should use -check=crc32 option).  LZMA BCJ filters are supported.

   (3) There are a few pathological cases where loading a very badly
organized ELF kernel might take longer, but in practice this never
happen.

1.5 The role of a boot loader
=============================

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"(1) (*note Role of a
     boot loader-Footnote-1::) or "GRUB" systems.

     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 around... GRUB!

   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
writing it.

   (1) The LInux LOader, a boot loader that everybody uses, but nobody
likes.

