\input texinfo
@c -*-texinfo-*-
@c %**start of header
@setfilename grub.info
@settitle GRUB Manual
@c %**end of header

@include version.texi

@c Unify all our little indices for now.
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex ky cp
@syncodeindex pg cp
@syncodeindex tp cp

@footnotestyle separate
@paragraphindent 3
@finalout

@dircategory Kernel
@direntry
* GRUB: (grub).                 The GRand Unified Bootloader
* grub-install: (grub)Invoking grub-install.    Install GRUB on your drive
* grub-md5-crypt: (grub)Invoking grub-md5-crypt.        Encrypt a password
                                                        in MD5 format
* grub-terminfo: (grub)Invoking grub-terminfo.  Generate a terminfo
                                                command from a
                                                terminfo name
* grub-set-default: (grub)Invoking grub-set-default.    Set a default boot
                                                        entry
* mbchk: (grub)Invoking mbchk.  Check for the format of a Multiboot kernel
@end direntry

@setchapternewpage odd

@ifinfo
Copyright @copyright{} 1999,2000,2001,2002,2004 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.

@ignore
Permission is granted to process this file through TeX and print the
results, provided the printed document carries a copying permission
notice identical to this one except for the removal of this paragraph
(this paragraph not being relevant to the printed manual).

@end ignore

Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions.
@end ifinfo

@titlepage
@sp 10
@title the GRUB manual
@subtitle The GRand Unified Bootloader, version @value{VERSION}, @value{UPDATED}.
@author Gordon Matzigkeit
@author Yoshinori K. Okuji
@c The following two commands start the copyright page.
@page
@vskip 0pt plus 1filll
Copyright @copyright{} 1999,2000,2001,2002,2004 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation approved
by Free Software Foundation.
@end titlepage

@c Output the table of contents at the beginning.
@contents

@finalout
@headings double

@ifnottex
@node Top
@top GRUB manual

This is the documentation of GNU GRUB, the GRand Unified Bootloader,
a flexible and powerful boot loader program for @sc{pc}s.

This edition documents version @value{VERSION}.
@end ifnottex

@menu
* Introduction::                Capturing the spirit of GRUB
* Naming convention::           Names of your drives in GRUB
* Installation::                Installing GRUB on your drive
* Booting::                     How to boot different operating systems
* Configuration::               Writing your own configuration file
* Network::                     Downloading OS images from a network
* Serial terminal::             Using GRUB via a serial line
* Preset Menu::                 Embedding a configuration file into GRUB
* Security::                    Improving the security
* Images::                      GRUB image files
* Filesystem::                  Filesystem syntax and semantics
* Interface::                   The menu and the command-line
* Commands::                    The list of available builtin commands
* Troubleshooting::             Error messages produced by GRUB
* Invoking the grub shell::     How to use the grub shell
* Invoking grub-install::       How to use the GRUB installer
* Invoking grub-md5-crypt::     How to generate a cryptic password
* Invoking grub-terminfo::      How to generate a terminfo command
* Invoking grub-set-default::   How to set a default boot entry
* Invoking mbchk::              How to use the Multiboot checker
* Obtaining and Building GRUB:: How to obtain and build GRUB
* Reporting bugs::              Where you should send a bug report
* Future::                      Some future plans on GRUB
* Internals::                   Hacking GRUB
* Index::
@end menu


@node Introduction
@chapter Introduction to GRUB

@menu
* Overview::                    What exactly GRUB is and how to use it
* History::                     From maggot to house fly
* Features::                    GRUB features
* Role of a boot loader::       The role of a boot loader
@end menu


@node Overview
@section Overview

Briefly, a @dfn{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 @dfn{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@footnote{@dfn{chain-load} is the mechanism for loading
unsupported operating systems by loading another boot loader. It is
typically used for loading DOS or Windows.}. 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
(@pxref{Command-line interface}), or a menu interface (@pxref{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
(@pxref{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 (@pxref{Naming convention}) to GRUB, how to
install GRUB on your drive (@pxref{Installation}), and how to boot your
OSes (@pxref{Booting}), step by step.

Besides the GRUB boot loader itself, there is a @dfn{grub shell}
@command{grub} (@pxref{Invoking the grub shell}) which can be run when
you are in your operating system. It emulates the boot loader and can
be used for installing the boot loader.


@node History
@section 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
(@pxref{Top, Multiboot Specification, Motivation, multiboot, 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 Yoshinori K. Okuji adopted GRUB as an
official GNU package, and opened its development by making the latest
sources available via anonymous CVS. @xref{Obtaining and Building
GRUB}, for more information.


@node Features
@section GRUB features

The primary requirement for GRUB is that it be compliant with the
@dfn{Multiboot Specification}, which is described in @ref{Top, Multiboot
Specification, Motivation, multiboot, The Multiboot Specification}.

The other goals, listed in approximate order of importance, are:

@itemize @bullet{}
@item
Basic functions must be straightforward for end-users.

@item
Rich functionality to support kernel experts and designers.

@item
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.
@end itemize

Except for specific compatibility modes (chain-loading and the Linux
@dfn{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):

@table @asis
@item Recognize multiple executable formats
Support many of the @dfn{a.out} variants plus @dfn{ELF}. Symbol
tables are also loaded.

@item 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.

@item Load multiples modules
Fully support the Multiboot feature of loading multiple modules.

@item 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 (@pxref{Commands}) are a superset of those supported on the
command-line. An example configuration file is provided in
@ref{Configuration}.

@item 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.

@item 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 (@pxref{Commands}) are a subset of those supported
for configuration files. Editing commands closely resembles the Bash
command-line (@pxref{Command Line Editing, Bash, Command Line Editing,
features, Bash Features}), with @key{TAB}-completion of commands,
devices, partitions, and files in a directory depending on context.

@item Support multiple filesystem types
Support multiple filesystem types transparently, plus a useful explicit
blocklist notation. The currently supported filesystem types are
@dfn{BSD FFS}, @dfn{DOS FAT16 and FAT32}, @dfn{Minix fs}, @dfn{Linux
ext2fs}, @dfn{ReiserFS}, @dfn{JFS}, @dfn{XFS}, and @dfn{VSTa
fs}. @xref{Filesystem}, for more information.

@item Support automatic decompression
Can decompress files which were compressed by @command{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 loading time, a
particularly great benefit for floppies.@footnote{There are a few
pathological cases where loading a very badly organized ELF kernel might
take longer, but in practice this never happen.}

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.

@item 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.

@item 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.

@item Detect all installed @sc{ram}
GRUB can generally find all the installed @sc{ram} on a PC-compatible
machine. It uses an advanced BIOS query technique for finding all
memory regions. As described on the Multiboot Specification (@pxref{Top,
Multiboot Specification, Motivation, multiboot, The Multiboot
Specification}), not all kernels make use of this information, but GRUB
provides it for those who do.

@item Support Logical Block Address mode
In traditional disk calls (called @dfn{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 (@dfn{LBA}) mode. GRUB
automatically detects if LBA mode is available and uses it if
available. In LBA mode, GRUB can access the entire disk.

@item 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 @dfn{TFTP}
protocol.

@item 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.
@end table


@node Role of a boot loader
@section The role of a boot loader

The following is a quotation from Gordon Matzigkeit, a GRUB fanatic:

@quotation
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
@emph{boot loader} is the most important software of all. I used to
refer to the above systems as either ``LILO''@footnote{The LInux LOader,
a boot loader that everybody uses, but nobody likes.} 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@dots{} GRUB!
@end quotation

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.


@node Naming convention
@chapter Naming convention

The device syntax used in GRUB is a wee bit different from what you may
have seen before in your operating system(s), and you need to know it so
that you can specify a drive/partition.

Look at the following examples and explanations:

@example
(fd0)
@end example

First of all, GRUB requires that the device name be enclosed with
@samp{(} and @samp{)}. The @samp{fd} part means that it is a floppy
disk. The number @samp{0} is the drive number, which is counted from
@emph{zero}. This expression means that GRUB will use the whole floppy
disk.

@example
(hd0,1)
@end example

Here, @samp{hd} means it is a hard disk drive. The first integer
@samp{0} indicates the drive number, that is, the first hard disk, while
the second integer, @samp{1}, indicates the partition number (or the
@sc{pc} slice number in the BSD terminology). Once again, please note
that the partition numbers are counted from @emph{zero}, not from
one. This expression means the second partition of the first hard disk
drive. In this case, GRUB uses one partition of the disk, instead of the
whole disk.

@example
(hd0,4)
@end example

This specifies the first @dfn{extended partition} of the first hard disk
drive. Note that the partition numbers for extended partitions are
counted from @samp{4}, regardless of the actual number of primary
partitions on your hard disk.

@example
(hd1,a)
@end example

This means the BSD @samp{a} partition of the second hard disk. If you
need to specify which @sc{pc} slice number should be used, use something
like this: @samp{(hd1,0,a)}. If the @sc{pc} slice number is omitted,
GRUB searches for the first @sc{pc} slice which has a BSD @samp{a}
partition.

Of course, to actually access the disks or partitions with GRUB, you
need to use the device specification in a command, like @samp{root
(fd0)} or @samp{unhide (hd0,2)}. To help you find out which number
specifies a partition you want, the GRUB command-line
(@pxref{Command-line interface}) options have argument
completion. This means that, for example, you only need to type

@example
root (
@end example

followed by a @key{TAB}, and GRUB will display the list of drives,
partitions, or file names. So it should be quite easy to determine the
name of your target partition, even with minimal knowledge of the
syntax.

Note that GRUB does @emph{not} distinguish IDE from SCSI - it simply
counts the drive numbers from zero, regardless of their type. Normally,
any IDE drive number is less than any SCSI drive number, although that
is not true if you change the boot sequence by swapping IDE and SCSI
drives in your BIOS.

Now the question is, how to specify a file? Again, consider an
example:

@example
(hd0,0)/vmlinuz
@end example

This specifies the file named @samp{vmlinuz}, found on the first
partition of the first hard disk drive. Note that the argument
completion works with file names, too.

That was easy, admit it. Now read the next chapter, to find out how to
actually install GRUB on your drive.


@node Installation
@chapter Installation

In order to install GRUB as your boot loader, you need to first
install the GRUB system and utilities under your UNIX-like operating
system (@pxref{Obtaining and Building GRUB}). You can do this either
from the source tarball, or as a package for your OS.

After you have done that, you need to install the boot loader on a
drive (floppy or hard disk). There are two ways of doing that - either
using the utility @command{grub-install} (@pxref{Invoking
grub-install}) on a UNIX-like OS, or by running GRUB itself from a
floppy. These are quite similar, however the utility might probe a
wrong BIOS drive, so you should be careful.

Also, if you install GRUB on a UNIX-like OS, please make sure that you
have an emergency boot disk ready, so that you can rescue your computer
if, by any chance, your hard drive becomes unusable (unbootable).

GRUB comes with boot images, which are normally put in the directory
@file{/usr/lib/grub/i386-pc}. If you do not use grub-install, then
you need to copy the files @file{stage1}, @file{stage2}, and
@file{*stage1_5} to the directory @file{/boot/grub}, and run the
@command{grub-set-default} (@pxref{Invoking grub-set-default}) if you
intend to use @samp{default saved} (@pxref{default}) in your
configuration file. Hereafter, the directory where GRUB images are
initially placed (normally @file{/usr/lib/grub/i386-pc}) will be
called the @dfn{image directory}, and the directory where the boot
loader needs to find them (usually @file{/boot/grub}) will be called
the @dfn{boot directory}.

@menu
* Creating a GRUB boot floppy::
* Installing GRUB natively::
* Installing GRUB using grub-install::
* Making a GRUB bootable CD-ROM::
@end menu


@node Creating a GRUB boot floppy
@section Creating a GRUB boot floppy

To create a GRUB boot floppy, you need to take the files @file{stage1}
and @file{stage2} from the image directory, and write them to the first
and the second block of the floppy disk, respectively.

@strong{Caution:} This procedure will destroy any data currently stored
on the floppy.

On a UNIX-like operating system, that is done with the following
commands:

@example
@group
# @kbd{cd /usr/lib/grub/i386-pc}
# @kbd{dd if=stage1 of=/dev/fd0 bs=512 count=1}
1+0 records in
1+0 records out
# @kbd{dd if=stage2 of=/dev/fd0 bs=512 seek=1}
153+1 records in
153+1 records out
#
@end group
@end example

The device file name may be different. Consult the manual for your OS.


@node Installing GRUB natively
@section Installing GRUB natively

@strong{Caution:} Installing GRUB's stage1 in this manner will erase the
normal boot-sector used by an OS.

GRUB can currently boot GNU Mach, Linux, FreeBSD, NetBSD, and OpenBSD
directly, so using it on a boot sector (the first sector of a
partition) should be okay. But generally, it would be a good idea to
back up the first sector of the partition on which you are installing
GRUB's stage1. This isn't as important if you are installing GRUB on
the first sector of a hard disk, since it's easy to reinitialize it
(e.g. by running @samp{FDISK /MBR} from DOS).

If you decide to install GRUB in the native environment, which is
definitely desirable, you'll need to create a GRUB boot disk, and
reboot your computer with it. Otherwise, see @ref{Installing GRUB using
grub-install}.

Once started, GRUB will show the command-line interface
(@pxref{Command-line interface}). First, set the GRUB's @dfn{root
device}@footnote{Note that GRUB's root device doesn't necessarily mean
your OS's root partition; if you need to specify a root partition for
your OS, add the argument into the command @command{kernel}.} to the
partition containing the boot directory, like this:

@example
grub> @kbd{root (hd0,0)}
@end example

If you are not sure which partition actually holds this directory, use the
command @command{find} (@pxref{find}), like this:

@example
grub> @kbd{find /boot/grub/stage1}
@end example

This will search for the file name @file{/boot/grub/stage1} and show the
devices which contain the file.

Once you've set the root device correctly, run the command
@command{setup} (@pxref{setup}):

@example
grub> @kbd{setup (hd0)}
@end example

This command will install the GRUB boot loader on the Master Boot
Record (MBR) of the first drive. If you want to put GRUB into the boot
sector of a partition instead of putting it in the MBR, specify the
partition into which you want to install GRUB:

@example
grub> @kbd{setup (hd0,0)}
@end example

If you install GRUB into a partition or a drive other than the first
one, you must chain-load GRUB from another boot loader. Refer to the
manual for the boot loader to know how to chain-load GRUB.

After using the setup command, you will boot into GRUB without the
GRUB floppy. See the chapter @ref{Booting} to find out how to boot
your operating systems from GRUB.


@node Installing GRUB using grub-install
@section Installing GRUB using grub-install

@strong{Caution:} This procedure is definitely less safe, because
there are several ways in which your computer can become
unbootable. For example, most operating systems don't tell GRUB how to
map BIOS drives to OS devices correctly---GRUB merely @dfn{guesses}
the mapping. This will succeed in most cases, but not
always. Therefore, GRUB provides you with a map file called the
@dfn{device map}, which you must fix if it is wrong. @xref{Device
map}, for more details.

If you still do want to install GRUB under a UNIX-like OS (such
as @sc{gnu}), invoke the program @command{grub-install} (@pxref{Invoking
grub-install}) as the superuser (@dfn{root}).

The usage is basically very simple. You only need to specify one
argument to the program, namely, where to install the boot loader. The
argument can be either a device file (like @samp{/dev/hda}) or a
partition specified in GRUB's notation. For example, under Linux the
following will install GRUB into the MBR of the first IDE disk:

@example
# @kbd{grub-install /dev/hda}
@end example

Likewise, under GNU/Hurd, this has the same effect:

@example
# @kbd{grub-install /dev/hd0}
@end example

If it is the first BIOS drive, this is the same as well:

@example
# @kbd{grub-install '(hd0)'}
@end example

Or you can omit the parentheses:

@example
# @kbd{grub-install hd0}
@end example

But all the above examples assume that GRUB should use images under
the root directory. If you want GRUB to use images under a directory
other than the root directory, you need to specify the option
@option{--root-directory}. The typical usage is that you create a GRUB
boot floppy with a filesystem. Here is an example:

@example
@group
# @kbd{mke2fs /dev/fd0}
# @kbd{mount -t ext2 /dev/fd0 /mnt}
# @kbd{grub-install --root-directory=/mnt fd0}
# @kbd{umount /mnt}
@end group
@end example

Another example is when you have a separate boot partition
which is mounted at @file{/boot}. Since GRUB is a boot loader, it
doesn't know anything about mountpoints at all. Thus, you need to run
@command{grub-install} like this:

@example
# @kbd{grub-install --root-directory=/boot /dev/hda}
@end example

By the way, as noted above, it is quite difficult to guess BIOS drives
correctly under a UNIX-like OS. Thus, @command{grub-install} will prompt
you to check if it could really guess the correct mappings, after the
installation. The format is defined in @ref{Device map}. Please be
quite careful. If the output is wrong, it is unlikely that your
computer will be able to boot with no problem.

Note that @command{grub-install} is actually just a shell script and the
real task is done by the grub shell @command{grub} (@pxref{Invoking the
grub shell}). Therefore, you may run @command{grub} directly to install
GRUB, without using @command{grub-install}. Don't do that, however,
unless you are very familiar with the internals of GRUB. Installing a
boot loader on a running OS may be extremely dangerous.


@node Making a GRUB bootable CD-ROM
@section Making a GRUB bootable CD-ROM

GRUB supports the @dfn{no emulation mode} in the El Torito
specification@footnote{El Torito is a specification for bootable CD
using BIOS functions.}. This means that you can use the whole CD-ROM
from GRUB and you don't have to make a floppy or hard disk image file,
which can cause compatibility problems.

For booting from a CD-ROM, GRUB uses a special Stage 2 called
@file{stage2_eltorito}. The only GRUB files you need to have in your 
bootable CD-ROM are this @file{stage2_eltorito} and optionally a config file
@file{menu.lst}. You don't need to use @file{stage1} or @file{stage2},
because El Torito is quite different from the standard boot process.

Here is an example of procedures to make a bootable CD-ROM
image. First, make a top directory for the bootable image, say,
@samp{iso}:

@example
$ @kbd{mkdir iso}
@end example

Make a directory for GRUB:

@example
$ @kbd{mkdir -p iso/boot/grub}
@end example

Copy the file @file{stage2_eltorito}:

@example
$ @kbd{cp /usr/lib/grub/i386-pc/stage2_eltorito iso/boot/grub}
@end example

If desired, make the config file @file{menu.lst} under @file{iso/boot/grub}
(@pxref{Configuration}), and copy any files and directories for the disc to the
directory @file{iso/}.

Finally, make a ISO9660 image file like this:

@example
$ @kbd{mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot \
    -boot-load-size 4 -boot-info-table -o grub.iso iso}
@end example

This produces a file named @file{grub.iso}, which then can be burned
into a CD (or a DVD).  @kbd{mkisofs} has already set up the disc to boot
from the @kbd{boot/grub/stage2_eltorito} file, so there is no need to 
setup GRUB on the disc.  (Note that the @kbd{-boot-load-size 4} bit is
required for compatibility with the BIOS on many older machines.)

You can use the device @samp{(cd)} to access a CD-ROM in your
config file. This is not required; GRUB automatically sets the root device 
to @samp{(cd)} when booted from a CD-ROM. It is only necessary to refer to 
@samp{(cd)} if you want to access other drives as well.


@node Booting
@chapter Booting

GRUB can load Multiboot-compliant kernels in a consistent way,
but for some free operating systems you need to use some OS-specific
magic.

@menu
* General boot methods::        How to boot OSes with GRUB generally
* OS-specific notes::           Notes on some operating systems
* Making your system robust::   How to make your system robust
@end menu


@node General boot methods
@section How to boot operating systems

GRUB has two distinct boot methods. One of the two is to load an
operating system directly, and the other is to chain-load another boot
loader which then will load an operating system actually. Generally
speaking, the former is more desirable, because you don't need to
install or maintain other boot loaders and GRUB is flexible enough to
load an operating system from an arbitrary disk/partition. However,
the latter is sometimes required, since GRUB doesn't support all the
existing operating systems natively.

@menu
* Loading an operating system directly::
* Chain-loading::
@end menu


@node Loading an operating system directly
@subsection How to boot an OS directly with GRUB

Multiboot (@pxref{Top, Multiboot Specification, Motivation, multiboot,
The Multiboot Specification}) is the native format supported by GRUB.
For the sake of convenience, there is also support for Linux, FreeBSD,
NetBSD and OpenBSD. If you want to boot other operating systems, you
will have to chain-load them (@pxref{Chain-loading}).

Generally, GRUB can boot any Multiboot-compliant OS in the following
steps:

@enumerate
@item
Set GRUB's root device to the drive where the OS images are stored with
the command @command{root} (@pxref{root}).

@item
Load the kernel image with the command @command{kernel} (@pxref{kernel}).

@item
If you need modules, load them with the command @command{module}
(@pxref{module}) or @command{modulenounzip} (@pxref{modulenounzip}).

@item
Run the command @command{boot} (@pxref{boot}).
@end enumerate

Linux, FreeBSD, NetBSD and OpenBSD can be booted in a similar
manner. You load a kernel image with the command @command{kernel} and
then run the command @command{boot}. If the kernel requires some
parameters, just append the parameters to @command{kernel}, after the
file name of the kernel. Also, please refer to @ref{OS-specific notes},
for information on your OS-specific issues.


@node Chain-loading
@subsection Load another boot loader to boot unsupported operating systems

If you want to boot an unsupported operating system (e.g. Windows 95),
chain-load a boot loader for the operating system. Normally, the boot
loader is embedded in the @dfn{boot sector} of the partition on which
the operating system is installed.

@enumerate
@item
Set GRUB's root device to the partition by the command
@command{rootnoverify} (@pxref{rootnoverify}):

@example
grub> @kbd{rootnoverify (hd0,0)}
@end example

@item
Set the @dfn{active} flag in the partition using the command
@command{makeactive}@footnote{This is not necessary for most of the
modern operating systems.} (@pxref{makeactive}):

@example
grub> @kbd{makeactive}
@end example

@item
Load the boot loader with the command @command{chainloader}
(@pxref{chainloader}):

@example
grub> @kbd{chainloader +1}
@end example

@samp{+1} indicates that GRUB should read one sector from the start of
the partition. The complete description about this syntax can be found
in @ref{Block list syntax}.

@item
Run the command @command{boot} (@pxref{boot}).
@end enumerate

However, DOS and Windows have some deficiencies, so you might have to
use more complicated instructions. @xref{DOS/Windows}, for more
information.


@node OS-specific notes
@section Some caveats on OS-specific issues

Here, we describe some caveats on several operating systems.

@menu
* GNU/Hurd::
* GNU/Linux::
* FreeBSD::
* NetBSD::
* OpenBSD::
* DOS/Windows::
* SCO UnixWare::
* QNX::
@end menu


@node GNU/Hurd
@subsection GNU/Hurd

Since GNU/Hurd is Multiboot-compliant, it is easy to boot it; there is
nothing special about it. But do not forget that you have to specify a
root partition to the kernel.

@enumerate
@item
Set GRUB's root device to the same drive as GNU/Hurd's. Probably the
command @code{find /boot/gnumach} or similar can help you
(@pxref{find}).

@item
Load the kernel and the module, like this:

@example
@group
grub> @kbd{kernel /boot/gnumach root=hd0s1}
grub> @kbd{module /boot/serverboot}
@end group
@end example

@item
Run the command @command{boot} (@pxref{boot}).
@end enumerate


@node GNU/Linux
@subsection GNU/Linux

It is relatively easy to boot GNU/Linux from GRUB, because it somewhat
resembles to boot a Multiboot-compliant OS.

@enumerate
@item
Set GRUB's root device to the same drive as GNU/Linux's. Probably the
command @code{find /vmlinuz} or similar can help you (@pxref{find}).

@item
Load the kernel:

@example
grub> @kbd{kernel /vmlinuz root=/dev/hda1}
@end example

If you need to specify some kernel parameters, just append them to the
command. For example, to set @option{vga} to @samp{ext}, do this:

@example
grub> @kbd{kernel /vmlinuz root=/dev/hda1 vga=ext}
@end example

See the documentation in the Linux source tree for complete
information on the available options.

@item
If you use an initrd, execute the command @command{initrd}
(@pxref{initrd}) after @command{kernel}:

@example
grub> @kbd{initrd /initrd}
@end example

@item
Finally, run the command @command{boot} (@pxref{boot}).
@end enumerate

@strong{Caution:} If you use an initrd and specify the @samp{mem=}
option to the kernel to let it use less than actual memory size, you
will also have to specify the same memory size to GRUB. To let GRUB know
the size, run the command @command{uppermem} @emph{before} loading the
kernel. @xref{uppermem}, for more information.


@node FreeBSD
@subsection FreeBSD

GRUB can load the kernel directly, either in ELF or a.out format. But
this is not recommended, since FreeBSD's bootstrap interface sometimes
changes heavily, so GRUB can't guarantee to pass kernel parameters
correctly.

Thus, we'd recommend loading the very flexible loader
@file{/boot/loader} instead. See this example:

@example
@group
grub> @kbd{root (hd0,a)}
grub> @kbd{kernel /boot/loader}
grub> @kbd{boot}
@end group
@end example


@node NetBSD
@subsection NetBSD

GRUB can load NetBSD a.out and ELF directly, follow these steps:

@enumerate
@item
Set GRUB's root device with @command{root} (@pxref{root}).

@item
Load the kernel with @command{kernel} (@pxref{kernel}). You should
append the ugly option @option{--type=netbsd}, if you want to load an
ELF kernel, like this:

@example
grub> @kbd{kernel --type=netbsd /netbsd-elf}
@end example

@item
Run @command{boot} (@pxref{boot}).
@end enumerate

For now, however, GRUB doesn't allow you to pass kernel parameters, so
it may be better to chain-load it instead. For more information, please
see @ref{Chain-loading}.


@node OpenBSD
@subsection OpenBSD

The booting instruction is exactly the same as for NetBSD
(@pxref{NetBSD}).


@node DOS/Windows
@subsection DOS/Windows

GRUB cannot boot DOS or Windows directly, so you must chain-load them
(@pxref{Chain-loading}). However, their boot loaders have some critical
deficiencies, so it may not work to just chain-load them. To overcome
the problems, GRUB provides you with two helper functions.

If you have installed DOS (or Windows) on a non-first hard disk, you
have to use the disk swapping technique, because that OS cannot boot
from any disks but the first one. The workaround used in GRUB is the
command @command{map} (@pxref{map}), like this:

@example
@group
grub> @kbd{map (hd0) (hd1)}
grub> @kbd{map (hd1) (hd0)}
@end group
@end example

This performs a @dfn{virtual} swap between your first and second hard
drive.

@strong{Caution:} This is effective only if DOS (or Windows) uses BIOS
to access the swapped disks. If that OS uses a special driver for the
disks, this probably won't work.

Another problem arises if you installed more than one set of DOS/Windows
onto one disk, because they could be confused if there are more than one
primary partitions for DOS/Windows. Certainly you should avoid doing
this, but there is a solution if you do want to do so. Use the partition
hiding/unhiding technique.

If GRUB @dfn{hide}s a DOS (or Windows) partition (@pxref{hide}), DOS (or
Windows) will ignore the partition. If GRUB @dfn{unhide}s a DOS (or
Windows) partition (@pxref{unhide}), DOS (or Windows) will detect the
partition. Thus, if you have installed DOS (or Windows) on the first
and the second partition of the first hard disk, and you want to boot
the copy on the first partition, do the following:

@example
@group
grub> @kbd{unhide (hd0,0)}
grub> @kbd{hide (hd0,1)}
grub> @kbd{rootnoverify (hd0,0)}
grub> @kbd{chainloader +1}
grub> @kbd{makeactive}
grub> @kbd{boot}
@end group
@end example


@node SCO UnixWare
@subsection SCO UnixWare

It is known that the signature in the boot loader for SCO UnixWare is
wrong, so you will have to specify the option @option{--force} to
@command{chainloader} (@pxref{chainloader}), like this:

@example
@group
grub> @kbd{rootnoverify (hd1,0)}
grub> @kbd{chainloader --force +1}
grub> @kbd{makeactive}
grub> @kbd{boot}
@end group
@end example


@node QNX
@subsection QNX

QNX seems to use a bigger boot loader, so you need to boot it up, like
this:

@example
@group
grub> @kbd{rootnoverify (hd1,1)}
grub> @kbd{chainloader +4}
grub> @kbd{boot}
@end group
@end example


@node Making your system robust
@section How to make your system robust

When you test a new kernel or a new OS, it is important to make sure
that your computer can boot even if the new system is unbootable. This
is crucial especially if you maintain servers or remote systems. To
accomplish this goal, you need to set up two things:

@enumerate
@item
You must maintain a system which is always bootable. For instance, if
you test a new kernel, you need to keep a working kernel in a
different place. And, it would sometimes be very nice to even have a
complete copy of a working system in a different partition or disk.

@item
You must direct GRUB to boot a working system when the new system
fails. This is possible with the @dfn{fallback} system in GRUB.
@end enumerate

The former requirement is very specific to each OS, so this
documentation does not cover that topic. It is better to consult some
backup tools.

So let's see the GRUB part. There are two possibilities: one of them
is quite simple but not very robust, and the other is a bit complex to
set up but probably the best solution to make sure that your system
can start as long as GRUB itself is bootable.

@menu
* Booting once-only::
* Booting fallback systems::
@end menu


@node Booting once-only
@subsection Booting once-only

You can teach GRUB to boot an entry only at next boot time. Suppose
that your have an old kernel @file{old_kernel} and a new kernel
@file{new_kernel}. You know that @file{old_kernel} can boot
your system correctly, and you want to test @file{new_kernel}.

To ensure that your system will go back to the old kernel even if the
new kernel fails (e.g. it panics), you can specify that GRUB should
try the new kernel only once and boot the old kernel after that.

First, modify your configuration file. Here is an example:

@example
@group
default saved        # This is important!!!
timeout 10

title the old kernel
root (hd0,0)
kernel /old_kernel
savedefault

title the new kernel
root (hd0,0)
kernel /new_kernel
savedefault 0         # This is important!!!
@end group
@end example

Note that this configuration file uses @samp{default saved}
(@pxref{default}) at the head and @samp{savedefault 0}
(@pxref{savedefault}) in the entry for the new kernel. This means
that GRUB boots a saved entry by default, and booting the entry for the
new kernel saves @samp{0} as the saved entry.

With this configuration file, after all, GRUB always tries to boot the
old kernel after it booted the new one, because @samp{0} is the entry
of @code{the old kernel}.

The next step is to tell GRUB to boot the new kernel at next boot
time. For this, execute @command{grub-set-default} (@pxref{Invoking
grub-set-default}):

@example
# @kbd{grub-set-default 1}
@end example

This command sets the saved entry to @samp{1}, that is, to the new
kernel.

This method is useful, but still not very robust, because GRUB stops
booting, if there is any error in the boot entry, such that the new
kernel has an invalid executable format. Thus, it it even better to
use the @dfn{fallback} mechanism of GRUB. Look at next subsection for
this feature.


@node Booting fallback systems
@subsection Booting fallback systems

GRUB supports a fallback mechanism of booting one or more other
entries if a default boot entry fails. You can specify multiple
fallback entries if you wish.

Suppose that you have three systems, @samp{A}, @samp{B} and
@samp{C}. @samp{A} is a system which you want to boot by
default. @samp{B} is a backup system which is supposed to boot
safely. @samp{C} is another backup system which is used in case where
@samp{B} is broken.

Then you may want GRUB to boot the first system which is bootable
among @samp{A}, @samp{B} and @samp{C}. A configuration file can be
written in this way:

@example
@group
default saved        # This is important!!!
timeout 10
fallback 1 2         # This is important!!!

title A
root (hd0,0)
kernel /kernel
savedefault fallback # This is important!!!

title B
root (hd1,0)
kernel /kernel
savedefault fallback # This is important!!!

title C
root (hd2,0)
kernel /kernel
savedefault
@end group
@end example

Note that @samp{default saved} (@pxref{default}), @samp{fallback 1 2}
and @samp{savedefault fallback} are used. GRUB will boot a saved entry
by default and save a fallback entry as next boot entry with this
configuration.

When GRUB tries to boot @samp{A}, GRUB saves @samp{1} as next boot
entry, because the command @command{fallback} specifies that @samp{1}
is the first fallback entry. The entry @samp{1} is @samp{B}, so GRUB
will try to boot @samp{B} at next boot time.

Likewise, when GRUB tries to boot @samp{B}, GRUB saves @samp{2} as
next boot entry, because @command{fallback} specifies @samp{2} as next
fallback entry. This makes sure that GRUB will boot @samp{C} after
booting @samp{B}.

It is noteworthy that GRUB uses fallback entries both when GRUB
itself fails in booting an entry and when @samp{A} or @samp{B} fails
in starting up your system. So this solution ensures that your system
is started even if GRUB cannot find your kernel or if your kernel
panics.

However, you need to run @command{grub-set-default} (@pxref{Invoking
grub-set-default}) when @samp{A} starts correctly or you fix @samp{A}
after it crashes, since GRUB always sets next boot entry to a fallback
entry. You should run this command in a startup script such as
@file{rc.local} to boot @samp{A} by default:

@example
# @kbd{grub-set-default 0}
@end example

where @samp{0} is the number of the boot entry for the system
@samp{A}.

If you want to see what is current default entry, you can look at the
file @file{/boot/grub/default} (or @file{/grub/default} in
some systems). Because this file is plain-text, you can just
@command{cat} this file. But it is strongly recommended @strong{not to
modify this file directly}, because GRUB may fail in saving a default
entry in this file, if you change this file in an unintended
manner. Therefore, you should use @command{grub-set-default} when you
need to change the default entry.


@node Configuration
@chapter Configuration

You've probably noticed that you need to type several commands to boot your
OS. There's a solution to that - GRUB provides a menu interface
(@pxref{Menu interface}) from which you can select an item (using arrow
keys) that will do everything to boot an OS.

To enable the menu, you need a configuration file,
@file{menu.lst} under the boot directory. We'll analyze an example
file.

The file first contains some general settings, the menu interface
related options. You can put these commands (@pxref{Menu-specific
commands}) before any of the items (starting with @command{title}
(@pxref{title})).

@example
@group
#
# Sample boot menu configuration file
#
@end group
@end example

As you may have guessed, these lines are comments. Lines starting with a
hash character (@samp{#}), and blank lines, are ignored by GRUB.

@example
@group
# By default, boot the first entry.
default 0
@end group
@end example

The first entry (here, counting starts with number zero, not one!) will
be the default choice.

@example
@group
# Boot automatically after 30 secs.
timeout 30
@end group
@end example

As the comment says, GRUB will boot automatically in 30 seconds, unless
interrupted with a keypress.

@example
@group
# Fallback to the second entry.
fallback 1
@end group
@end example

If, for any reason, the default entry doesn't work, fall back to the
second one (this is rarely used, for obvious reasons).

Note that the complete descriptions of these commands, which are menu
interface specific, can be found in @ref{Menu-specific
commands}. Other descriptions can be found in @ref{Commands}.

Now, on to the actual OS definitions. You will see that each entry
begins with a special command, @command{title} (@pxref{title}), and the
action is described after it. Note that there is no command
@command{boot} (@pxref{boot}) at the  end of each item. That is because
GRUB automatically executes @command{boot} if it loads other commands
successfully.

The argument for the command @command{title} is used to display a short
title/description of the entry in the menu. Since @command{title}
displays the argument as is, you can write basically anything there.

@example
@group
# For booting GNU/Hurd
title  GNU/Hurd
root   (hd0,0)
kernel /boot/gnumach.gz root=hd0s1
module /boot/serverboot.gz
@end group
@end example

This boots GNU/Hurd from the first hard disk.

@example
@group
# For booting GNU/Linux
title  GNU/Linux
kernel (hd1,0)/vmlinuz root=/dev/hdb1
@end group
@end example

This boots GNU/Linux, but from the second hard disk.

@example
@group
# For booting Mach (getting kernel from floppy)
title  Utah Mach4 multiboot
root   (hd0,2)
pause  Insert the diskette now^G!!
kernel (fd0)/boot/kernel root=hd0s3
module (fd0)/boot/bootstrap
@end group
@end example

This boots Mach with a kernel on a floppy, but the root filesystem at
hd0s3. It also contains a @command{pause} line (@pxref{pause}), which
will cause GRUB to display a prompt and delay, before actually executing
the rest of the commands and booting.

@example
@group
# For booting FreeBSD
title  FreeBSD
root   (hd0,2,a)
kernel /boot/loader
@end group
@end example

This item will boot FreeBSD kernel loaded from the @samp{a} partition of
the third @sc{pc} slice of the first hard disk.

@example
@group
# For booting OS/2
title OS/2
root  (hd0,1)
makeactive
# chainload OS/2 bootloader from the first sector
chainloader +1
# This is similar to "chainload", but loads a specific file
#chainloader /boot/chain.os2
@end group
@end example

This will boot OS/2, using a chain-loader (@pxref{Chain-loading}).

@example
@group
# For booting Windows NT or Windows95
title Windows NT / Windows 95 boot menu
root        (hd0,0)
makeactive
chainloader +1
# For loading DOS if Windows NT is installed
# chainload /bootsect.dos
@end group
@end example

The same as the above, but for Windows.

@example
@group
# For installing GRUB into the hard disk
title Install GRUB into the hard disk
root    (hd0,0)
setup   (hd0)
@end group
@end example

This will just (re)install GRUB onto the hard disk.

@example
# Change the colors.
title Change the colors
color light-green/brown blink-red/blue
@end example

In the last entry, the command @command{color} is used (@pxref{color}),
to change the menu colors (try it!). This command is somewhat special,
because it can be used both in the command-line and in the menu. GRUB
has several such commands, see @ref{General commands}.

We hope that you now understand how to use the basic features of
GRUB. To learn more about GRUB, see the following chapters.


@node Network
@chapter Downloading OS images from a network

Although GRUB is a disk-based boot loader, it does provide network
support. To use the network support, you need to enable at least one
network driver in the GRUB build process. For more information please
see @file{netboot/README.netboot} in the source distribution.

@menu
* General usage of network support::
* Diskless::
@end menu


@node General usage of network support
@section How to set up your network

GRUB requires a file server and optionally a server that will assign an
IP address to the machine on which GRUB is running. For the former, only
TFTP is supported at the moment. The latter is either BOOTP, DHCP or a
RARP server@footnote{RARP is not advised, since it cannot serve much
information}. It is not necessary to run both the servers on one
computer. How to configure these servers is beyond the scope of this
document, so please refer to the manuals specific to those
protocols/servers.

If you decided to use a server to assign an IP address, set up the
server and run @command{bootp} (@pxref{bootp}), @command{dhcp}
(@pxref{dhcp}) or @command{rarp} (@pxref{rarp}) for BOOTP, DHCP or RARP,
respectively. Each command will show an assigned IP address, a netmask,
an IP address for your TFTP server and a gateway. If any of the
addresses is wrong or it causes an error, probably the configuration of
your servers isn't set up properly.

Otherwise, run @command{ifconfig}, like this:

@example
grub> @kbd{ifconfig --address=192.168.110.23 --server=192.168.110.14}
@end example

You can also use @command{ifconfig} in conjuction with @command{bootp},
@command{dhcp} or @command{rarp} (e.g. to reassign the server address
manually). @xref{ifconfig}, for more details.

Finally, download your OS images from your network. The network can be
accessed using the network drive @samp{(nd)}. Everything else is very
similar to the normal instructions (@pxref{Booting}).

Here is an example:

@example
@group
grub> @kbd{bootp}
Probing... [NE*000]
NE2000 base ...
Address: 192.168.110.23    Netmask: 255.255.255.0
Server: 192.168.110.14     Gateway: 192.168.110.1

grub> @kbd{root (nd)}
grub> @kbd{kernel /tftproot/gnumach.gz root=sd0s1}
grub> @kbd{module /tftproot/serverboot.gz}
grub> @kbd{boot}
@end group
@end example


@node Diskless
@section Booting from a network

It is sometimes very useful to boot from a network, especially when you
use a machine which has no local disk. In this case, you need to obtain
a kind of Net Boot @sc{rom}, such as a PXE @sc{rom} or a free software
package like Etherboot. Such a Boot @sc{rom} first boots the machine,
sets up the network card installed into the machine, and downloads a
second stage boot image from the network. Then, the second image will
try to boot an operating system actually from the network.

GRUB provides two second stage images, @file{nbgrub} and
@file{pxegrub} (@pxref{Images}). These images are the same as the
normal Stage 2, except that they set up a network automatically, and try
to load a configuration file from the network, if specified. The usage
is very simple: If the machine has a PXE @sc{rom}, use
@file{pxegrub}. If the machine has an NBI loader such as Etherboot, use
@file{nbgrub}. There is no difference between them except their
formats. Since the way to load a second stage image you want to use
should be described in the manual on your Net Boot @sc{rom}, please
refer to the manual, for more information.

However, there is one thing specific to GRUB. Namely, how to specify a
configuration file in a BOOTP/DHCP server. For now, GRUB uses the tag
@samp{150}, to get the name of a configuration file. The following is an
example with a BOOTP configuration:

@example
@group
.allhost:hd=/tmp:bf=null:\
        :ds=145.71.35.1 145.71.32.1:\
        :sm=255.255.254.0:\
        :gw=145.71.35.1:\
        :sa=145.71.35.5:

foo:ht=1:ha=63655d0334a7:ip=145.71.35.127:\
        :bf=/nbgrub:\
        :tc=.allhost:\
        :T150="(nd)/tftpboot/menu.lst.foo":
@end group
@end example

Note that you should specify the drive name @code{(nd)} in the name of
the configuration file. This is because you might change the root drive
before downloading the configuration from the TFTP server when the
preset menu feature is used (@pxref{Preset Menu}).

See the manual of your BOOTP/DHCP server for more information. The
exact syntax should differ a little from the example.


@node Serial terminal
@chapter Using GRUB via a serial line

This chapter describes how to use the serial terminal support in GRUB.

If you have many computers or computers with no display/keyboard, it
could be very useful to control the computers through serial
communications. To connect one computer with another via a serial line,
you need to prepare a null-modem (cross) serial cable, and you may need
to have multiport serial boards, if your computer doesn't have extra
serial ports. In addition, a terminal emulator is also required, such as
minicom. Refer to a manual of your operating system, for more
information.

As for GRUB, the instruction to set up a serial terminal is quite
simple. First of all, make sure that you haven't specified the option
@option{--disable-serial} to the configure script when you built your
GRUB images. If you get them in binary form, probably they have serial
terminal support already.

Then, initialize your serial terminal after GRUB starts up. Here is an
example:

@example
@group
grub> @kbd{serial --unit=0 --speed=9600}
grub> @kbd{terminal serial}
@end group
@end example

The command @command{serial} initializes the serial unit 0 with the
speed 9600bps. The serial unit 0 is usually called @samp{COM1}, so, if
you want to use COM2, you must specify @samp{--unit=1} instead. This
command accepts many other options, so please refer to @ref{serial},
for more details.

The command @command{terminal} (@pxref{terminal}) chooses which type of
terminal you want to use. In the case above, the terminal will be a
serial terminal, but you can also pass @code{console} to the command,
as @samp{terminal serial console}. In this case, a terminal in which
you press any key will be selected as a GRUB terminal.

However, note that GRUB assumes that your terminal emulator is
compatible with VT100 by default. This is true for most terminal
emulators nowadays, but you should pass the option @option{--dumb} to
the command if your terminal emulator is not VT100-compatible or
implements few VT100 escape sequences. If you specify this option then
GRUB provides you with an alternative menu interface, because the normal
menu requires several fancy features of your terminal.


@node Preset Menu
@chapter Embedding a configuration file into GRUB

GRUB supports a @dfn{preset menu} which is to be 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 good to run the commands @command{serial} (@pxref{serial}) and
@command{terminal} (@pxref{terminal}) before anything else at the
start-up time.

How the preset menu works is slightly complicated:

@enumerate
@item
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.

@item
GRUB checks if the configuration file is available. Note that this check
is performed @strong{regardless of the existence of the preset
menu}. The configuration file is loaded even if the preset menu was
loaded.

@item
If 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.
@end enumerate

To enable the preset menu feature, you must rebuild GRUB specifying a
file to the configure script with the option
@option{--enable-preset-menu}. The file has the same semantics as
normal configuration files (@pxref{Configuration}).

Another point you should take care is that the diskless support
(@pxref{Diskless}) diverts the preset menu. Diskless images embed a
preset menu to execute the command @command{bootp} (@pxref{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:

@example
@group
# Set up the serial terminal, first of all.
serial --unit=0 --speed=19200
terminal --timeout=0 serial

# Initialize the network.
dhcp
@end group
@end example


@node Security
@chapter Protecting your computer from cracking

You may be interested in how to prevent ordinary users from doing
whatever they like, if you share your computer with other people. So
this chapter describes how to improve the security of GRUB.

One thing which could be a security hole is that the user can do too
many things with GRUB, because GRUB allows one to modify its configuration
and run arbitrary commands at run-time. For example, the user can even
read @file{/etc/passwd} in the command-line interface by the command
@command{cat} (@pxref{cat}). So it is necessary to disable all the
interactive operations.

Thus, GRUB provides a @dfn{password} feature, so that only administrators
can start the interactive operations (i.e. editing menu entries and
entering the command-line interface). To use this feature, you need to
run the command @command{password} in your configuration file
(@pxref{password}), like this:

@example
password --md5 PASSWORD
@end example

If this is specified, GRUB disallows any interactive control, until you
press the key @key{p} and enter a correct password.  The option
@option{--md5} tells GRUB that @samp{PASSWORD} is in MD5 format.  If it
is omitted, GRUB assumes the @samp{PASSWORD} is in clear text.

You can encrypt your password with the command @command{md5crypt}
(@pxref{md5crypt}). For example, run the grub shell (@pxref{Invoking the
grub shell}), and enter your password:

@example
@group
grub> md5crypt
Password: **********
Encrypted: $1$U$JK7xFegdxWH6VuppCUSIb.
@end group
@end example

Then, cut and paste the encrypted password to your configuration file.

Also, you can specify an optional argument to @command{password}. See
this example:

@example
password PASSWORD /boot/grub/menu-admin.lst
@end example

In this case, GRUB will load @file{/boot/grub/menu-admin.lst} as a
configuration file when you enter the valid password.

Another thing which may be dangerous is that any user can choose any
menu entry. Usually, this wouldn't be problematic, but you might want to
permit only administrators to run some of your menu entries, such as an
entry for booting an insecure OS like DOS.

GRUB provides the command @command{lock} (@pxref{lock}). This command
always fails until you enter the valid password, so you can use it, like
this:

@example
@group
title Boot DOS
lock
rootnoverify (hd0,1)
makeactive
chainload +1
@end group
@end example

You should insert @command{lock} right after @command{title}, because
any user can execute commands in an entry until GRUB encounters
@command{lock}.

You can also use the command @command{password} instead of
@command{lock}. In this case the boot process will ask for the password
and stop if it was entered incorrectly.  Since the @command{password}
takes its own @var{PASSWORD} argument this is useful if you want
different passwords for different entries.


@node Images
@chapter GRUB image files

GRUB consists of several images: two essential stages, optional stages
called @dfn{Stage 1.5}, one image for bootable CD-ROM, and two network
boot images. Here is a short overview of them. @xref{Internals}, for
more details.

@table @file
@item stage1
This is an essential image used for booting up GRUB. Usually, this is
embedded in an MBR or the boot sector of a partition. Because a PC boot
sector is 512 bytes, the size of this image is exactly 512 bytes.

All @file{stage1} must do is to load Stage 2 or Stage 1.5 from a local
disk. Because of the size restriction, @file{stage1} encodes the
location of Stage 2 (or Stage 1.5) in a block list format, so it never
understand any filesystem structure.

@item stage2
This is the core image of GRUB. It does everything but booting up
itself. Usually, this is put in a filesystem, but that is not required.

@item e2fs_stage1_5
@itemx fat_stage1_5
@itemx ffs_stage1_5
@itemx jfs_stage1_5
@itemx minix_stage1_5
@itemx reiserfs_stage1_5
@itemx vstafs_stage1_5
@itemx xfs_stage1_5

These are called @dfn{Stage 1.5}, because they serve as a bridge
between @file{stage1} and @file{stage2}, that is to say, Stage 1.5 is
loaded by Stage 1 and Stage 1.5 loads Stage 2. The difference between
@file{stage1} and @file{*_stage1_5} is that the former doesn't
understand any filesystem while the latter understands one filesystem
(e.g. @file{e2fs_stage1_5} understands ext2fs). So you can move the
Stage 2 image to another location safely, even after GRUB has been
installed.

While Stage 2 cannot generally be embedded in a fixed area as the size
is so large, Stage 1.5 can be installed into the area right after an MBR,
or the boot loader area of a ReiserFS or a FFS.

@item stage2_eltorito
This is a boot image for CD-ROMs using the @dfn{no emulation mode} in
El Torito specification. This is identical to Stage 2, except that
this boots up without Stage 1 and sets up a special drive @samp{(cd)}.

@item nbgrub
This is a network boot image for the Network Image Proposal used by some
network boot loaders, such as Etherboot. This is mostly the same as
Stage 2, but it also sets up a network and loads a configuration file
from the network.

@item pxegrub
This is another network boot image for the Preboot Execution Environment
used by several Netboot ROMs. This is identical to @file{nbgrub}, except
for the format.
@end table


@node Filesystem
@chapter Filesystem syntax and semantics

GRUB uses a special syntax for specifying disk drives which can be
accessed by BIOS. Because of BIOS limitations, GRUB cannot distinguish
between IDE, ESDI, SCSI, or others. You must know yourself which BIOS
device is equivalent to which OS device. Normally, that will be clear if
you see the files in a device or use the command @command{find}
(@pxref{find}).

@menu
* Device syntax::               How to specify devices
* File name syntax::            How to specify files
* Block list syntax::           How to specify block lists
@end menu


@node Device syntax
@section How to specify devices

The device syntax is like this:

@example
@code{(@var{device}[,@var{part-num}][,@var{bsd-subpart-letter}])}
@end example

@samp{[]} means the parameter is optional. @var{device} should be
either @samp{fd} or @samp{hd} followed by a digit, like @samp{fd0}.
But you can also set @var{device} to a hexadecimal or a decimal number
which is a BIOS drive number, so the following are equivalent:

@example
(hd0)
(0x80)
(128)
@end example

@var{part-num} represents the partition number of @var{device}, starting
from zero for primary partitions and from four for extended partitions,
and @var{bsd-subpart-letter} represents the BSD disklabel subpartition,
such as @samp{a} or @samp{e}.

A shortcut for specifying BSD subpartitions is
@code{(@var{device},@var{bsd-subpart-letter})}, in this case, GRUB
searches for the first PC partition containing a BSD disklabel, then
finds the subpartition @var{bsd-subpart-letter}. Here is an example:

@example
(hd0,a)
@end example

The syntax @samp{(hd0)} represents using the entire disk (or the
MBR when installing GRUB), while the syntax @samp{(hd0,0)}
represents using the first partition of the disk (or the boot sector
of the partition when installing GRUB).

If you enabled the network support, the special drive, @samp{(nd)}, is
also available. Before using the network drive, you must initialize the
network. @xref{Network}, for more information.

If you boot GRUB from a CD-ROM, @samp{(cd)} is available. @xref{Making
a GRUB bootable CD-ROM}, for details.


@node File name syntax
@section How to specify files

There are two ways to specify files, by @dfn{absolute file name} and by
@dfn{block list}.

An absolute file name resembles a Unix absolute file name, using
@samp{/} for the directory separator (not @samp{\} as in DOS). One
example is @samp{(hd0,0)/boot/grub/menu.lst}. This means the file
@file{/boot/grub/menu.lst} in the first partition of the first hard
disk. If you omit the device name in an absolute file name, GRUB uses
GRUB's @dfn{root device} implicitly. So if you set the root device to,
say, @samp{(hd1,0)} by the command @command{root} (@pxref{root}), then
@code{/boot/kernel} is the same as @code{(hd1,0)/boot/kernel}.


@node Block list syntax
@section How to specify block lists

A block list is used for specifying a file that doesn't appear in the
filesystem, like a chainloader. The syntax is
@code{[@var{offset}]+@var{length}[,[@var{offset}]+@var{length}]@dots{}}.
Here is an example:

@example
@code{0+100,200+1,300+300}
@end example

This represents that GRUB should read blocks 0 through 99, block 200,
and blocks 300 through 599. If you omit an offset, then GRUB assumes
the offset is zero.

Like the file name syntax (@pxref{File name syntax}), if a blocklist
does not contain a device name, then GRUB uses GRUB's @dfn{root
device}. So @code{(hd0,1)+1} is the same as @code{+1} when the root
device is @samp{(hd0,1)}.


@node Interface
@chapter GRUB's user interface

GRUB has both a simple menu interface for choosing preset entries from a
configuration file, and a highly flexible command-line for performing
any desired combination of boot commands.

GRUB looks for its configuration file as soon as it is loaded. If one
is found, then the full menu interface is activated using whatever
entries were found in the file. If you choose the @dfn{command-line} menu
option, or if the configuration file was not found, then GRUB drops to
the command-line interface.

@menu
* Command-line interface::      The flexible command-line interface
* Menu interface::              The simple menu interface
* Menu entry editor::           Editing a menu entry
* Hidden menu interface::       The hidden menu interface
@end menu


@node Command-line interface
@section The flexible command-line interface

The command-line interface provides a prompt and after it an editable
text area much like a command-line in Unix or DOS. Each command is
immediately executed after it is entered@footnote{However, this
behavior will be changed in the future version, in a user-invisible
way.}. The commands (@pxref{Command-line and menu entry commands}) are a
subset of those available in the configuration file, used with exactly
the same syntax.

Cursor movement and editing of the text on the line can be done via a
subset of the functions available in the Bash shell:

@table @key
@item C-f
@itemx PC right key
Move forward one character.

@item C-b
@itemx PC left key
Move back one character.

@item C-a
@itemx HOME
Move to the start of the line.

@item C-e
@itemx END
Move the the end of the line.

@item C-d
@itemx DEL
Delete the character underneath the cursor.

@item C-h
@itemx BS
Delete the character to the left of the cursor.

@item C-k
Kill the text from the current cursor position to the end of the line.

@item C-u
Kill backward from the cursor to the beginning of the line.

@item C-y
Yank the killed text back into the buffer at the cursor.

@item C-p
@itemx PC up key
Move up through the history list.

@item C-n
@itemx PC down key
Move down through the history list.
@end table

When typing commands interactively, if the cursor is within or before
the first word in the command-line, pressing the @key{TAB} key (or
@key{C-i}) will display a listing of the available commands, and if the
cursor is after the first word, the @kbd{@key{TAB}} will provide a
completion listing of disks, partitions, and file names depending on the
context. Note that to obtain a list of drives, one must open a
parenthesis, as @command{root (}.

Note that you cannot use the completion functionality in the TFTP
filesystem. This is because TFTP doesn't support file name listing for
the security.


@node Menu interface
@section The simple menu interface

The menu interface is quite easy to use. Its commands are both
reasonably intuitive and described on screen.

Basically, the menu interface provides a list of @dfn{boot entries} to
the user to choose from. Use the arrow keys to select the entry of
choice, then press @key{RET} to run it.  An optional timeout is
available to boot the default entry (the first one if not set), which is
aborted by pressing any key.

Commands are available to enter a bare command-line by pressing @key{c}
(which operates exactly like the non-config-file version of GRUB, but
allows one to return to the menu if desired by pressing @key{ESC}) or to
edit any of the @dfn{boot entries} by pressing @key{e}.

If you protect the menu interface with a password (@pxref{Security}),
all you can do is choose an entry by pressing @key{RET}, or press
@key{p} to enter the password.


@node Menu entry editor
@section Editing a menu entry

The menu entry editor looks much like the main menu interface, but the
lines in the menu are individual commands in the selected entry instead
of entry names.

If an @key{ESC} is pressed in the editor, it aborts all the changes made
to the configuration entry and returns to the main menu interface.

When a particular line is selected, the editor places the user in a
special version of the GRUB command-line to edit that line.  When the
user hits @key{RET}, GRUB replaces the line in question in the boot
entry with the changes (unless it was aborted via @key{ESC},
in which case the changes are thrown away).

If you want to add a new line to the menu entry, press @key{o} if adding
a line after the current line or press @key{O} if before the current
line.

To delete a line, hit the key @key{d}. Although GRUB unfortunately
does not support @dfn{undo}, you can do almost the same thing by just
returning to the main menu.


@node Hidden menu interface
@section The hidden menu interface

When your terminal is dumb or you request GRUB to hide the menu
interface explicitly with the command @command{hiddenmenu}
(@pxref{hiddenmenu}), GRUB doesn't show the menu interface (@pxref{Menu
interface}) and automatically boots the default entry, unless
interrupted by pressing @key{ESC}.

When you interrupt the timeout and your terminal is dumb, GRUB falls
back to the command-line interface (@pxref{Command-line interface}).


@node Commands
@chapter The list of available commands

In this chapter, we list all commands that are available in GRUB.

Commands belong to different groups. A few can only be used in
the global section of the configuration file (or ``menu''); most
of them can be entered on the command-line and can be used either
anywhere in the menu or specifically in the menu entries.

@menu
* Menu-specific commands::
* General commands::
* Command-line and menu entry commands::
@end menu


@node Menu-specific commands
@section The list of commands for the menu only

The semantics used in parsing the configuration file are the following:

@itemize @bullet
@item
The menu-specific commands have to be used before any others.

@item
The files @emph{must} be in plain-text format.

@item
@samp{#} at the beginning of a line in a configuration file means it is
only a comment.

@item
Options are separated by spaces.

@item
All numbers can be either decimal or hexadecimal. A hexadecimal number
must be preceded by @samp{0x}, and is case-insensitive.

@item
Extra options or text at the end of the line are ignored unless otherwise
specified.

@item
Unrecognized commands are added to the current entry, except before entries
start, where they are ignored.
@end itemize

These commands can only be used in the menu:

@menu
* default::                     Set the default entry
* fallback::                    Set the fallback entry
* hiddenmenu::                  Hide the menu interface
* timeout::                     Set the timeout
* title::                       Start a menu entry
@end menu


@node default
@subsection default

@deffn Command default num
Set the default entry to the entry number @var{num}. Numbering starts
from 0, and the entry number 0 is the default if the command is not
used.

You can specify @samp{saved} instead of a number. In this case, the
default entry is the entry saved with the command
@command{savedefault}. @xref{savedefault}, for more information.
@end deffn


@node fallback
@subsection fallback

@deffn Command fallback num...
Go into unattended boot mode: if the default boot entry has any errors,
instead of waiting for the user to do something, immediately start
over using the @var{num} entry (same numbering as the @code{default}
command (@pxref{default})). This obviously won't help if the machine was
rebooted by a kernel that GRUB loaded. You can specify multiple
fallback entry numbers.
@end deffn


@node hiddenmenu
@subsection hiddenmenu

@deffn Command hiddenmenu
Don't display the menu. If the command is used, no menu will be
displayed on the control terminal, and the default entry will be
booted after the timeout expired. The user can still request the
menu to be displayed by pressing @key{ESC} before the timeout
expires. See also @ref{Hidden menu interface}.
@end deffn


@node timeout
@subsection timeout

@deffn Command timeout sec
Set a timeout, in @var{sec} seconds, before automatically booting the
default entry (normally the first entry defined).
@end deffn


@node title
@subsection title

@deffn Command title name @dots{}
Start a new boot entry, and set its name to the contents of the rest of
the line, starting with the first non-space character.
@end deffn


@node General commands
@section The list of general commands

Commands usable anywhere in the menu and in the command-line.

@menu
* bootp::                       Initialize a network device via BOOTP
* color::                       Color the menu interface
* device::                      Specify a file as a drive
* dhcp::                        Initialize a network device via DHCP
* hide::                        Hide a partition
* ifconfig::                    Configure a network device manually
* pager::                       Change the state of the internal pager
* partnew::                     Make a primary partition
* parttype::                    Change the type of a partition
* password::                    Set a password for the menu interface
* rarp::                        Initialize a network device via RARP
* serial::                      Set up a serial device
* setkey::                      Configure the key map
* terminal::                    Choose a terminal
* terminfo::                    Define escape sequences for a terminal
* tftpserver::                  Specify a TFTP server
* unhide::                      Unhide a partition
@end menu


@node bootp
@subsection bootp

@deffn Command bootp [@option{--with-configfile}]
Initialize a network device via the @dfn{BOOTP} protocol. This command
is only available if GRUB is compiled with netboot support. See also
@ref{Network}.

If you specify @option{--with-configfile} to this command, GRUB will
fetch and load a configuration file specified by your BOOTP server
with the vendor tag @samp{150}.
@end deffn


@node color
@subsection color

@deffn Command color normal [highlight]
Change the menu colors. The color @var{normal} is used for most
lines in the menu (@pxref{Menu interface}), and the color
@var{highlight} is used to highlight the line where the cursor
points. If you omit @var{highlight}, then the inverted color of
@var{normal} is used for the highlighted line. The format of a color is
@code{@var{foreground}/@var{background}}. @var{foreground} and
@var{background} are symbolic color names. A symbolic color name must be
one of these:

@itemize @bullet
@item
black

@item
blue

@item
green

@item
cyan

@item
red

@item
magenta

@item
brown

@item
light-gray

@strong{These below can be specified only for the foreground.}

@item
dark-gray

@item
light-blue

@item
light-green

@item
light-cyan

@item
light-red

@item
light-magenta

@item
yellow

@item
white
@end itemize

But only the first eight names can be used for @var{background}. You can
prefix @code{blink-} to @var{foreground} if you want a blinking
foreground color.

This command can be used in the configuration file and on the command
line, so you may write something like this in your configuration file:

@example
@group
# Set default colors.
color light-gray/blue black/light-gray

# Change the colors.
title OS-BS like
color magenta/blue black/magenta
@end group
@end example
@end deffn


@node device
@subsection device

@deffn Command device drive file
In the grub shell, specify the file @var{file} as the actual drive for a
@sc{bios} drive @var{drive}. You can use this command to create a disk
image, and/or to fix the drives guessed by GRUB when GRUB fails to
determine them correctly, like this:

@example
@group
grub> @kbd{device (fd0) /floppy-image}
grub> @kbd{device (hd0) /dev/sd0}
@end group
@end example

This command can be used only in the grub shell (@pxref{Invoking the
grub shell}).
@end deffn


@node dhcp
@subsection dhcp

@deffn Command dhcp [--with-configfile]
Initialize a network device via the @dfn{DHCP} protocol. Currently,
this command is just an alias for @command{bootp}, since the two
protocols are very similar. This command is only available if GRUB is
compiled with netboot support. See also @ref{Network}.

If you specify @option{--with-configfile} to this command, GRUB will
fetch and load a configuration file specified by your DHCP server
with the vendor tag @samp{150}.
@end deffn


@node hide
@subsection hide

@deffn Command hide partition
Hide the partition @var{partition} by setting the @dfn{hidden} bit in
its partition type code. This is useful only when booting DOS or Windows
and multiple primary FAT partitions exist in one disk. See also
@ref{DOS/Windows}.
@end deffn


@node ifconfig
@subsection ifconfig

@deffn Command ifconfig [@option{--server=server}] [@option{--gateway=gateway}] [@option{--mask=mask}] [@option{--address=address}]
Configure the IP address, the netmask, the gateway, and the server
address of a network device manually. The values must be in dotted
decimal format, like @samp{192.168.11.178}. The order of the options is
not important. This command shows current network configuration, if no
option is specified. See also @ref{Network}.
@end deffn


@node pager
@subsection pager

@deffn Command pager [flag]
Toggle or set the state of the internal pager. If @var{flag} is
@samp{on}, the internal pager is enabled. If @var{flag} is @samp{off},
it is disabled. If no argument is given, the state is toggled.
@end deffn


@node partnew
@subsection partnew

@deffn Command partnew part type from len
Create a new primary partition. @var{part} is a partition specification
in GRUB syntax (@pxref{Naming convention}); @var{type} is the partition
type and must be a number in the range @code{0-0xff}; @var{from} is
the starting address and @var{len} is the length, both in sector units.
@end deffn


@node parttype
@subsection parttype

@deffn Command parttype part type
Change the type of an existing partition.  @var{part} is a partition
specification in GRUB syntax (@pxref{Naming convention}); @var{type}
is the new partition type and must be a number in the range 0-0xff.
@end deffn


@node password
@subsection password

@deffn Command password [@option{--md5}] passwd [new-config-file]
If used in the first section of a menu file, disable all interactive
editing control (menu entry editor and command-line) and entries
protected by the command @command{lock}. If the password @var{passwd} is
entered, it loads the @var{new-config-file} as a new config file and
restarts the GRUB Stage 2, if @var{new-config-file} is
specified. Otherwise, GRUB will just unlock the privileged instructions.
You can also use this command in the script section, in which case it
will ask for the password, before continuing.  The option
@option{--md5} tells GRUB that @var{passwd} is encrypted with
@command{md5crypt} (@pxref{md5crypt}).
@end deffn


@node rarp
@subsection rarp

@deffn Command rarp
Initialize a network device via the @dfn{RARP} protocol.  This command
is only available if GRUB is compiled with netboot support. See also
@ref{Network}.
@end deffn


@node serial
@subsection serial

@deffn Command serial [@option{--unit=unit}] [@option{--port=port}] [@option{--speed=speed}] [@option{--word=word}] [@option{--parity=parity}] [@option{--stop=stop}] [@option{--device=dev}]
Initialize a serial device. @var{unit} is a number in the range 0-3
specifying which serial port to use; default is 0, which corresponds to
the port often called COM1. @var{port} is the I/O port where the UART
is to be found; if specified it takes precedence over @var{unit}.
@var{speed} is the transmission speed; default is 9600. @var{word} and
@var{stop} are the number of data bits and stop bits. Data bits must
be in the range 5-8 and stop bits must be 1 or 2. Default is 8 data
bits and one stop bit. @var{parity} is one of @samp{no}, @samp{odd},
@samp{even} and defaults to @samp{no}. The option @option{--device}
can only be used in the grub shell and is used to specify the 
tty device to be used in the host operating system (@pxref{Invoking the
grub shell}).

The serial port is not used as a communication channel unless the
@command{terminal} command is used (@pxref{terminal}).

This command is only available if GRUB is compiled with serial
support. See also @ref{Serial terminal}.
@end deffn


@node setkey
@subsection setkey

@deffn Command setkey [to_key from_key]
Change the keyboard map. The key @var{from_key} is mapped to the key
@var{to_key}. If no argument is specified, reset key mappings. Note that 
this command @emph{does not} exchange the keys. If you want to exchange 
the keys, run this command again with the arguments exchanged, like this:

@example
grub> @kbd{setkey capslock control}
grub> @kbd{setkey control capslock}
@end example

A key must be an alphabet letter, a digit, or one of these symbols:
@samp{escape}, @samp{exclam}, @samp{at}, @samp{numbersign},
@samp{dollar}, @samp{percent}, @samp{caret}, @samp{ampersand},
@samp{asterisk}, @samp{parenleft}, @samp{parenright}, @samp{minus},
@samp{underscore}, @samp{equal}, @samp{plus}, @samp{backspace},
@samp{tab}, @samp{bracketleft}, @samp{braceleft}, @samp{bracketright},
@samp{braceright}, @samp{enter}, @samp{control}, @samp{semicolon},
@samp{colon}, @samp{quote}, @samp{doublequote}, @samp{backquote},
@samp{tilde}, @samp{shift}, @samp{backslash}, @samp{bar}, @samp{comma},
@samp{less}, @samp{period}, @samp{greater}, @samp{slash},
@samp{question}, @samp{alt}, @samp{space}, @samp{capslock}, @samp{FX}
(@samp{X} is a digit), and @samp{delete}. This table describes to which
character each of the symbols corresponds:

@table @samp
@item exclam
@samp{!}

@item at
@samp{@@}

@item numbersign
@samp{#}

@item dollar
@samp{$}

@item percent
@samp{%}

@item caret
@samp{^}

@item ampersand
@samp{&}

@item asterisk
@samp{*}

@item parenleft
@samp{(}

@item parenright
@samp{)}

@item minus
@samp{-}

@item underscore
@samp{_}

@item equal
@samp{=}

@item plus
@samp{+}

@item bracketleft
@samp{[}

@item braceleft
@samp{@{}

@item bracketright
@samp{]}

@item braceright
@samp{@}}

@item semicolon
@samp{;}

@item colon
@samp{:}

@item quote
@samp{'}

@item doublequote
@samp{"}

@item backquote
@samp{`}

@item tilde
@samp{~}

@item backslash
@samp{\}

@item bar
@samp{|}

@item comma
@samp{,}

@item less
@samp{<}

@item period
@samp{.}

@item greater
@samp{>}

@item slash
@samp{/}

@item question
@samp{?}

@item space
@samp{ }
@end table
@end deffn


@node terminal
@subsection terminal

@deffn Command terminal [@option{--dumb}] [@option{--no-echo}] [@option{--no-edit}] [@option{--timeout=secs}] [@option{--lines=lines}] [@option{--silent}] [@option{console}] [@option{serial}] [@option{hercules}]
Select a terminal for user interaction. The terminal is assumed to be
VT100-compatible unless @option{--dumb} is specified. If both
@option{console} and @option{serial} are specified, then GRUB will use
the one where a key is entered first or the first when the timeout
expires. If neither are specified, the current setting is
reported. This command is only available if GRUB is compiled with serial
support. See also @ref{Serial terminal}.

This may not make sense for most users, but GRUB supports Hercules
console as well. Hercules console is usable like the ordinary console,
and the usage is quite similar to that for serial terminals: specify
@option{hercules} as the argument.

The option @option{--lines} defines the number of lines in your
terminal, and it is used for the internal pager function. If you don't
specify this option, the number is assumed as 24.

The option @option{--silent} suppresses the message to prompt you to
hit any key. This might be useful if your system has no terminal
device.

The option @option{--no-echo} has GRUB not to echo back input
characters. This implies the option @option{--no-edit}.

The option @option{--no-edit} disables the BASH-like editing feature.
@end deffn


@node terminfo
@subsection terminfo

@deffn Command terminfo @option{--name=name} @option{--cursor-address=seq} [@option{--clear-screen=seq}] [@option{--enter-standout-mode=seq}] [@option{--exit-standout-mode=seq}]
Define the capabilities of your terminal. Use this command to define
escape sequences, if it is not vt100-compatible. You may use @samp{\e}
for @key{ESC} and @samp{^X} for a control character.

You can use the utility @command{grub-terminfo} to generate
appropriate arguments to this command. @xref{Invoking grub-terminfo}.

If no option is specified, the current settings are printed.
@end deffn


@node tftpserver
@subsection tftpserver

@deffn Command tftpserver ipaddr
@strong{Caution:} This command exists only for backward
compatibility. Use @command{ifconfig} (@pxref{ifconfig}) instead.

Override a TFTP server address returned by a BOOTP/DHCP/RARP server. The
argument @var{ipaddr} must be in dotted decimal format, like
@samp{192.168.0.15}.  This command is only available if GRUB is compiled
with netboot support. See also @ref{Network}.
@end deffn


@node unhide
@subsection unhide

@deffn Command unhide partition
Unhide the partition @var{partition} by clearing the @dfn{hidden} bit in
its partition type code. This is useful only when booting DOS or Windows
and multiple primary partitions exist on one disk. See also
@ref{DOS/Windows}.
@end deffn


@node Command-line and menu entry commands
@section The list of command-line and menu entry commands

These commands are usable in the command-line and in menu entries.  If
you forget a command, you can run the command @command{help}
(@pxref{help}).

@menu
* blocklist::                   Get the block list notation of a file
* boot::                        Start up your operating system
* cat::                         Show the contents of a file
* chainloader::                 Chain-load another boot loader
* cmp::                         Compare two files
* configfile::                  Load a configuration file
* debug::                       Toggle the debug flag
* displayapm::                  Display APM information
* displaymem::                  Display memory configuration
* embed::                       Embed Stage 1.5
* find::                        Find a file
* fstest::                      Test a filesystem
* geometry::                    Manipulate the geometry of a drive
* halt::                        Shut down your computer
* help::                        Show help messages
* impsprobe::                   Probe SMP
* initrd::                      Load an initrd
* install::                     Install GRUB
* ioprobe::                     Probe I/O ports used for a drive
* kernel::                      Load a kernel
* lock::                        Lock a menu entry
* makeactive::                  Make a partition active
* map::                         Map a drive to another
* md5crypt::                    Encrypt a password in MD5 format
* module::                      Load a module
* modulenounzip::               Load a module without decompression
* pause::                       Wait for a key press
* quit::                        Exit from the grub shell
* reboot::                      Reboot your computer
* read::                        Read data from memory
* root::                        Set GRUB's root device
* rootnoverify::                Set GRUB's root device without mounting
* savedefault::                 Save current entry as the default entry
* setup::                       Set up GRUB's installation automatically
* testload::                    Load a file for testing a filesystem
* testvbe::                     Test VESA BIOS EXTENSION
* uppermem::                    Set the upper memory size
* vbeprobe::                    Probe VESA BIOS EXTENSION
@end menu


@node blocklist
@subsection blocklist

@deffn Command blocklist file
Print the block list notation of the file @var{file}. @xref{Block list
syntax}.
@end deffn


@node boot
@subsection boot

@deffn Command boot
Boot the OS or chain-loader which has been loaded. Only necessary if
running the fully interactive command-line (it is implicit at the end of
a menu entry).
@end deffn


@node cat
@subsection cat

@deffn Command cat file
Display the contents of the file @var{file}. This command may be useful
to remind you of your OS's root partition:

@example
grub> @kbd{cat /etc/fstab}
@end example
@end deffn


@node chainloader
@subsection chainloader

@deffn Command chainloader [@option{--force}] file
Load @var{file} as a chain-loader. Like any other file loaded by the
filesystem code, it can use the blocklist notation to grab the first
sector of the current partition with @samp{+1}. If you specify the
option @option{--force}, then load @var{file} forcibly, whether it has a
correct signature or not. This is required when you want to load a
defective boot loader, such as SCO UnixWare 7.1 (@pxref{SCO UnixWare}).
@end deffn


@node cmp
@subsection cmp

@deffn Command cmp file1 file2
Compare the file @var{file1} with the file @var{file2}. If they differ
in size, print the sizes like this:

@example
Differ in size: 0x1234 [foo], 0x4321 [bar]
@end example

If the sizes are equal but the bytes at an offset differ, then print the
bytes like this:

@example
Differ at the offset 777: 0xbe [foo], 0xef [bar]
@end example

If they are completely identical, nothing will be printed.
@end deffn


@node configfile
@subsection configfile

@deffn Command configfile file
Load @var{file} as a configuration file.
@end deffn


@node debug
@subsection debug

@deffn Command debug
Toggle debug mode (by default it is off). When debug mode is on, some
extra messages are printed to show disk activity. This global debug flag
is mainly useful for GRUB developers when testing new code.
@end deffn


@node displayapm
@subsection displayapm

@deffn Command displayapm
Display APM BIOS information.
@end deffn


@node displaymem
@subsection displaymem

@deffn Command displaymem
Display what GRUB thinks the system address space map of the machine is,
including all regions of physical @sc{ram} installed. GRUB's
@dfn{upper/lower memory} display uses the standard BIOS interface for
the available memory in the first megabyte, or @dfn{lower memory}, and a
synthesized number from various BIOS interfaces of the memory starting
at 1MB and going up to the first chipset hole for @dfn{upper memory}
(the standard PC @dfn{upper memory} interface is limited to reporting a
maximum of 64MB).
@end deffn


@node embed
@subsection embed

@deffn Command embed stage1_5 device
Embed the Stage 1.5 @var{stage1_5} in the sectors after the MBR if
@var{device} is a drive, or in the @dfn{boot loader} area if @var{device}
is a FFS partition or a ReiserFS partition.@footnote{The latter feature
has not been implemented yet.} Print the number of sectors which
@var{stage1_5} occupies, if successful.

Usually, you don't need to run this command directly. @xref{setup}.
@end deffn


@node find
@subsection find

@deffn Command find filename
Search for the file name @var{filename} in all mountable partitions
and print the list of the devices which contain the file. The file
name @var{filename} should be an absolute file name like
@code{/boot/grub/stage1}.
@end deffn


@node fstest
@subsection fstest

@deffn Command fstest
Toggle filesystem test mode.
Filesystem test mode, when turned on, prints out data corresponding to
all the device reads and what values are being sent to the low-level
routines. The format is @samp{<@var{partition-offset-sector},
@var{byte-offset}, @var{byte-length}>} for high-level reads inside a
partition, and @samp{[@var{disk-offset-sector}]} for low-level sector
requests from the disk.
Filesystem test mode is turned off by any use of the @command{install}
(@pxref{install}) or @command{testload} (@pxref{testload}) commands.
@end deffn


@node geometry
@subsection geometry

@deffn Command geometry drive [cylinder head sector [total_sector]]
Print the information for the drive @var{drive}. In the grub shell, you
can set the geometry of the drive arbitrarily. The number of
cylinders, the number of heads, the number of sectors and the number of
total sectors are set to CYLINDER, HEAD, SECTOR and TOTAL_SECTOR,
respectively. If you omit TOTAL_SECTOR, then it will be calculated
based on the C/H/S values automatically.
@end deffn


@node halt
@subsection halt

@deffn Command halt @option{--no-apm}
The command halts the computer. If the @option{--no-apm} option
is specified, no APM BIOS call is performed. Otherwise, the computer
is shut down using APM.
@end deffn


@node help
@subsection help

@deffn Command help @option{--all} [pattern @dots{}]
Display helpful information about builtin commands. If you do not
specify @var{pattern}, this command shows short descriptions of most of
available commands. If you specify the option @option{--all} to this
command, short descriptions of rarely used commands (such as
@ref{testload}) are displayed as well.

If you specify any @var{patterns}, it displays longer information
about each of the commands which match those @var{patterns}.
@end deffn


@node impsprobe
@subsection impsprobe

@deffn Command impsprobe
Probe the Intel Multiprocessor Specification 1.1 or 1.4 configuration
table and boot the various CPUs which are found into a tight loop. This
command can be used only in the Stage 2, but not in the grub shell.
@end deffn


@node initrd
@subsection initrd

@deffn Command initrd file @dots{}
Load an initial ramdisk for a Linux format boot image and set the
appropriate parameters in the Linux setup area in memory. See also
@ref{GNU/Linux}.
@end deffn


@node install
@subsection install

@deffn Command install [@option{--force-lba}] [@option{--stage2=os_stage2_file}] stage1_file [@option{d}] dest_dev stage2_file [addr] [@option{p}] [config_file] [real_config_file]
This command is fairly complex, and you should not use this command
unless you are familiar with GRUB. Use @command{setup} (@pxref{setup})
instead.

In short, it will perform a full install presuming the Stage 2 or Stage
1.5@footnote{They're loaded the same way, so we will refer to the Stage
1.5 as a Stage 2 from now on.} is in its final install location.

In slightly more detail, it will load @var{stage1_file}, validate that
it is a GRUB Stage 1 of the right version number, install in it a
blocklist for loading @var{stage2_file} as a Stage 2. If the option
@option{d} is present, the Stage 1 will always look for the actual
disk @var{stage2_file} was installed on, rather than using the booting
drive. The Stage 2 will be loaded at address @var{addr}, which must be
@samp{0x8000} for a true Stage 2, and @samp{0x2000} for a Stage 1.5. If
@var{addr} is not present, GRUB will determine the address
automatically. It then writes the completed Stage 1 to the first block
of the device @var{dest_dev}. If the options @option{p} or
@var{config_file} are present, then it reads the first block of stage2,
modifies it with the values of the partition @var{stage2_file} was found
on (for @option{p}) or places the string @var{config_file} into the area
telling the stage2 where to look for a configuration file at boot
time. Likewise, if @var{real_config_file} is present and
@var{stage2_file} is a Stage 1.5, then the Stage 2 @var{config_file} is
patched with the configuration file name @var{real_config_file}. This
command preserves the DOS BPB (and for hard disks, the partition table)
of the sector the Stage 1 is to be installed into.

@strong{Caution:} Several buggy BIOSes don't pass a booting drive
properly when booting from a hard disk drive. Therefore, you will
unfortunately have to specify the option @option{d}, whether your
Stage2 resides at the booting drive or not, if you have such a
BIOS. We know these are defective in this way:

@table @asis
@item
Fujitsu LifeBook 400 BIOS version 31J0103A

@item
HP Vectra XU 6/200 BIOS version GG.06.11
@end table

@strong{Caution2:} A number of BIOSes don't return a correct LBA support
bitmap even if they do have the support. So GRUB provides a solution to
ignore the wrong bitmap, that is, the option @option{--force-lba}. Don't
use this option if you know that your BIOS doesn't have LBA support.

@strong{Caution3:} You must specify the option @option{--stage2} in the
grub shell, if you cannot unmount the filesystem where your stage2 file
resides. The argument should be the file name in your operating system.
@end deffn


@node ioprobe
@subsection ioprobe

@deffn Command ioprobe drive
Probe I/O ports used for the drive @var{drive}. This command will list
the I/O ports on the screen. For technical information,
@xref{Internals}.
@end deffn


@node kernel
@subsection kernel

@deffn Command kernel [@option{--type=type}] [@option{--no-mem-option}] file @dots{}
Attempt to load the primary boot image (Multiboot a.out or @sc{elf},
Linux zImage or bzImage, FreeBSD a.out, NetBSD a.out, etc.) from
@var{file}. The rest of the line is passed verbatim as the @dfn{kernel
command-line}. Any modules must be reloaded after using this command.

This command also accepts the option @option{--type} so that you can
specify the kernel type of @var{file} explicitly. The argument
@var{type} must be one of these: @samp{netbsd}, @samp{freebsd},
@samp{openbsd}, @samp{linux}, @samp{biglinux}, and
@samp{multiboot}. However, you need to specify it only if you want to
load a NetBSD @sc{elf} kernel, because GRUB can automatically determine
a kernel type in the other cases, quite safely.

The option @option{--no-mem-option} is effective only for Linux. If the
option is specified, GRUB doesn't pass the option @option{mem=} to the
kernel.  This option is implied for Linux kernels 2.4.18 and newer.
@end deffn


@node lock
@subsection lock

@deffn Command lock
Prevent normal users from executing arbitrary menu entries. You must use
the command @command{password} if you really want this command to be
useful (@pxref{password}).

This command is used in a menu, as shown in this example:

@example
@group
title This entry is too dangerous to be executed by normal users
lock
root (hd0,a)
kernel /no-security-os
@end group
@end example

See also @ref{Security}.
@end deffn


@node makeactive
@subsection makeactive

@deffn Command makeactive
Set the active partition on the root disk to GRUB's root device.
This command is limited to @emph{primary} PC partitions on a hard disk.
@end deffn


@node map
@subsection map

@deffn Command map to_drive from_drive
Map the drive @var{from_drive} to the drive @var{to_drive}. This is
necessary when you chain-load some operating systems, such as DOS, if
such an OS resides at a non-first drive. Here is an example:

@example
@group
grub> @kbd{map (hd0) (hd1)}
grub> @kbd{map (hd1) (hd0)}
@end group
@end example

The example exchanges the order between the first hard disk and the
second hard disk. See also @ref{DOS/Windows}.
@end deffn


@node md5crypt
@subsection md5crypt

@deffn Command md5crypt
Prompt to enter a password, and encrypt it in MD5 format. The encrypted
password can be used with the command @command{password}
(@pxref{password}). See also @ref{Security}.
@end deffn


@node module
@subsection module

@deffn Command module file @dots{}
Load a boot module @var{file} for a Multiboot format boot image (no
interpretation of the file contents are made, so the user of this
command must know what the kernel in question expects). The rest of the
line is passed as the @dfn{module command-line}, like the
@command{kernel} command. You must load a Multiboot kernel image before
loading any module. See also @ref{modulenounzip}.
@end deffn


@node modulenounzip
@subsection modulenounzip

@deffn Command modulenounzip file @dots{}
The same as @command{module} (@pxref{module}), except that automatic
decompression is disabled.
@end deffn


@node pause
@subsection pause

@deffn Command pause message @dots{}
Print the @var{message}, then wait until a key is pressed. Note that
placing @key{^G} (ASCII code 7) in the message will cause the speaker to
emit the standard beep sound, which is useful when prompting the user to
change floppies.
@end deffn


@node quit
@subsection quit

@deffn Command quit
Exit from the grub shell @command{grub} (@pxref{Invoking the grub
shell}). This command can be used only in the grub shell.
@end deffn


@node reboot
@subsection reboot

@deffn Command reboot
Reboot the computer.
@end deffn


@node read
@subsection read

@deffn Command read addr
Read a 32-bit value from memory at address @var{addr} and display it in
hex format.
@end deffn


@node root
@subsection root

@deffn Command root device [hdbias]
Set the current @dfn{root device} to the device @var{device}, then
attempt to mount it to get the partition size (for passing the partition
descriptor in @code{ES:ESI}, used by some chain-loaded boot loaders), the
BSD drive-type (for booting BSD kernels using their native boot format),
and correctly determine the PC partition where a BSD sub-partition is
located. The optional @var{hdbias} parameter is a number to tell a BSD
kernel how many BIOS drive numbers are on controllers before the current
one. For example, if there is an IDE disk and a SCSI disk, and your
FreeBSD root partition is on the SCSI disk, then use a @samp{1} for
@var{hdbias}.

See also @ref{rootnoverify}.
@end deffn


@node rootnoverify
@subsection rootnoverify

@deffn Command rootnoverify device [hdbias]
Similar to @command{root} (@pxref{root}), but don't attempt to mount the
partition. This is useful for when an OS is outside of the area of the
disk that GRUB can read, but setting the correct root device is still
desired. Note that the items mentioned in @command{root} above which
derived from attempting the mount will @emph{not} work correctly.
@end deffn


@node savedefault
@subsection savedefault

@deffn Command savedefault num
Save the current menu entry or @var{num} if specified as a default
entry. Here is an example:

@example
@group
default saved
timeout 10

title GNU/Linux
root (hd0,0)
kernel /boot/vmlinuz root=/dev/sda1 vga=ext
initrd /boot/initrd
savedefault

title FreeBSD
root (hd0,a)
kernel /boot/loader
savedefault
@end group
@end example

With this configuration, GRUB will choose the entry booted previously as
the default entry.

You can specify @samp{fallback} instead of a number. Then, next
fallback entry is saved. Next fallback entry is chosen from fallback
entries. Normally, this will be the first entry in fallback ones.

See also @ref{default} and @ref{Invoking grub-set-default}.
@end deffn


@node setup
@subsection setup

@deffn Command setup [@option{--force-lba}] [@option{--stage2=os_stage2_file}] [@option{--prefix=dir}] install_device [image_device]
Set up the installation of GRUB automatically. This command uses the
more flexible command @command{install} (@pxref{install}) in the backend
and installs GRUB into the device @var{install_device}. If
@var{image_device} is specified, then find the GRUB images
(@pxref{Images}) in the device @var{image_device}, otherwise use the
current @dfn{root device}, which can be set by the command
@command{root}. If @var{install_device} is a hard disk, then embed a
Stage 1.5 in the disk if possible.

The option @option{--prefix} specifies the directory under which GRUB
images are put. If it is not specified, GRUB automatically searches them
in @file{/boot/grub} and @file{/grub}.

The options @option{--force-lba} and @option{--stage2} are just passed
to @command{install} if specified. @xref{install}, for more
information.
@end deffn


@node testload
@subsection testload

@deffn Command testload file
Read the entire contents of @var{file} in several different ways and
compare them, to test the filesystem code. The output is somewhat
cryptic, but if no errors are reported and the final @samp{i=@var{X},
filepos=@var{Y}} reading has @var{X} and @var{Y} equal, then it is
definitely consistent, and very likely works correctly subject to a
consistent offset error. If this test succeeds, then a good next step is
to try loading a kernel.
@end deffn


@node testvbe
@subsection testvbe

@deffn Command testvbe mode
Test the VESA BIOS EXTENSION mode @var{mode}. This command will switch
your video card to the graphics mode, and show an endless animation. Hit
any key to return. See also @ref{vbeprobe}.
@end deffn


@node uppermem
@subsection uppermem

@deffn Command uppermem kbytes
Force GRUB to assume that only @var{kbytes} kilobytes of upper memory
are installed. Any system address range maps are discarded.

@strong{Caution:} This should be used with great caution, and should
only be necessary on some old machines. GRUB's BIOS probe can pick up
all @sc{ram} on all new machines the author has ever heard of. It can
also be used for debugging purposes to lie to an OS.
@end deffn


@node vbeprobe
@subsection vbeprobe

@deffn Command vbeprobe [mode]
Probe VESA BIOS EXTENSION information. If the mode @var{mode} is
specified, show only the information about @var{mode}. Otherwise, this
command lists up available VBE modes on the screen. See also
@ref{testvbe}.
@end deffn


@node Troubleshooting
@chapter Error messages reported by GRUB

This chapter describes error messages reported by GRUB when you
encounter trouble. @xref{Invoking the grub shell}, if your problem is
specific to the grub shell.

@menu
* Stage1 errors::               Errors reported by the Stage 1
* Stage1.5 errors::             Errors reported by the Stage 1.5
* Stage2 errors::               Errors reported by the Stage 2
@end menu


@node Stage1 errors
@section Errors reported by the Stage 1

The general way that the Stage 1 handles errors is to print an error
string and then halt. Pressing @kbd{@key{CTRL}-@key{ALT}-@key{DEL}} will
reboot.

The following is a comprehensive list of error messages for the Stage 1:

@table @asis
@item Hard Disk Error
The stage2 or stage1.5 is being read from a hard disk, and the attempt
to determine the size and geometry of the hard disk failed.

@item Floppy Error
The stage2 or stage1.5 is being read from a floppy disk, and the attempt
to determine the size and geometry of the floppy disk failed. It's listed
as a separate error since the probe sequence is different than for hard
disks.

@item Read Error
A disk read error happened while trying to read the stage2 or stage1.5.

@item Geom Error
The location of the stage2 or stage1.5 is not in the portion of the disk
supported directly by the BIOS read calls.  This could occur because the
BIOS translated geometry has been changed by the user or the disk is
moved to another machine or controller after installation, or GRUB was
not installed using itself (if it was, the Stage 2 version of this error
would have been seen during that process and it would not have completed
the install).
@end table


@node Stage1.5 errors
@section Errors reported by the Stage 1.5

The general way that the Stage 1.5 handles errors is to print an error
number in the form @code{Error @var{num}} and then halt. Pressing
@kbd{@key{CTRL}-@key{ALT}-@key{DEL}} will reboot.

The error numbers correspond to the errors reported by Stage
2. @xref{Stage2 errors}.


@node Stage2 errors
@section Errors reported by the Stage 2

The general way that the Stage 2 handles errors is to abort the
operation in question, print an error string, then (if possible) either
continue based on the fact that an error occurred or wait for the user to
deal with the error.

The following is a comprehensive list of error messages for the Stage 2
(error numbers for the Stage 1.5 are listed before the colon in each
description):

@table @asis
@item 1 : Filename must be either an absolute filename or blocklist
This error is returned if a file name is requested which doesn't fit the
syntax/rules listed in the @ref{Filesystem}.

@item 2 : Bad file or directory type
This error is returned if a file requested is not a regular file, but
something like a symbolic link, directory, or FIFO.

@item 3 : Bad or corrupt data while decompressing file
This error is returned if the run-length decompression code gets an
internal error. This is usually from a corrupt file.

@item 4 : Bad or incompatible header in compressed file
This error is returned if the file header for a supposedly compressed
file is bad.

@item 5 : Partition table invalid or corrupt
This error is returned if the sanity checks on the integrity of the
partition table fail. This is a bad sign.

@item 6 : Mismatched or corrupt version of stage1/stage2
This error is returned if the install command points to incompatible
or corrupt versions of the stage1 or stage2. It can't detect corruption
in general, but this is a sanity check on the version numbers, which
should be correct.

@item 7 : Loading below 1MB is not supported
This error is returned if the lowest address in a kernel is below the
1MB boundary. The Linux zImage format is a special case and can be
handled since it has a fixed loading address and maximum size.

@item 8 : Kernel must be loaded before booting
This error is returned if GRUB is told to execute the boot sequence
without having a kernel to start.

@item 9 : Unknown boot failure
This error is returned if the boot attempt did not succeed for reasons
which are unknown.

@item 10 : Unsupported Multiboot features requested
This error is returned when the Multiboot features word in the Multiboot
header requires a feature that is not recognized. The point of this is
that the kernel requires special handling which GRUB is probably
unable to provide.

@item 11 : Unrecognized device string
This error is returned if a device string was expected, and the string
encountered didn't fit the syntax/rules listed in the @ref{Filesystem}.

@item 12 : Invalid device requested
This error is returned if a device string is recognizable but does not
fall under the other device errors.

@item 13 : Invalid or unsupported executable format
This error is returned if the kernel image being loaded is not
recognized as Multiboot or one of the supported native formats (Linux
zImage or bzImage, FreeBSD, or NetBSD).

@item 14 : Filesystem compatibility error, cannot read whole file
Some of the filesystem reading code in GRUB has limits on the length of
the files it can read. This error is returned when the user runs into
such a limit.

@item 15 : File not found
This error is returned if the specified file name cannot be found, but
everything else (like the disk/partition info) is OK.

@item 16 : Inconsistent filesystem structure
This error is returned by the filesystem code to denote an internal
error caused by the sanity checks of the filesystem structure on disk
not matching what it expects. This is usually caused by a corrupt
filesystem or bugs in the code handling it in GRUB.

@item 17 : Cannot mount selected partition
This error is returned if the partition requested exists, but the
filesystem type cannot be recognized by GRUB.

@item 18 : Selected cylinder exceeds maximum supported by BIOS
This error is returned when a read is attempted at a linear block
address beyond the end of the BIOS translated area. This generally
happens if your disk is larger than the BIOS can handle (512MB for
(E)IDE disks on older machines or larger than 8GB in general).

@item 19 : Linux kernel must be loaded before initrd
This error is returned if the initrd command is used before loading a
Linux kernel.

@item 20 : Multiboot kernel must be loaded before modules
This error is returned if the module load command is used before loading
a Multiboot kernel. It only makes sense in this case anyway, as GRUB has
no idea how to communicate the presence of such modules to a
non-Multiboot-aware kernel.

@item 21 : Selected disk does not exist
This error is returned if the device part of a device- or full file name
refers to a disk or BIOS device that is not present or not recognized by
the BIOS in the system.

@item 22 : No such partition
This error is returned if a partition is requested in the device part of
a device- or full file name which isn't on the selected disk.

@item 23 : Error while parsing number
This error is returned if GRUB was expecting to read a number and
encountered bad data.

@item 24 : Attempt to access block outside partition
This error is returned if a linear block address is outside of the disk
partition. This generally happens because of a corrupt filesystem on the
disk or a bug in the code handling it in GRUB (it's a great debugging
tool).

@item 25 : Disk read error
This error is returned if there is a disk read error when trying to
probe or read data from a particular disk.

@item 26 : Too many symbolic links
This error is returned if the link count is beyond the maximum
(currently 5), possibly the symbolic links are looped.

@item 27 : Unrecognized command
This error is returned if an unrecognized command is entered on the
command-line or in a boot sequence section of a configuration file and
that entry is selected.

@item 28 : Selected item cannot fit into memory
This error is returned if a kernel, module, or raw file load command is
either trying to load its data such that it won't fit into memory or it
is simply too big.

@item 29 : Disk write error
This error is returned if there is a disk write error when trying to
write to a particular disk. This would generally only occur during an
install of set active partition command.

@item 30 : Invalid argument
This error is returned if an argument specified to a command is invalid.

@item 31 : File is not sector aligned
This error may occur only when you access a ReiserFS partition by
block-lists (e.g. the command @command{install}). In this case, you
should mount the partition with the @samp{-o notail} option.

@item 32 : Must be authenticated
This error is returned if you try to run a locked entry. You should
enter a correct password before running such an entry.

@item 33 : Serial device not configured
This error is returned if you try to change your terminal to a serial
one before initializing any serial device.

@item 34 : No spare sectors on the disk
This error is returned if a disk doesn't have enough spare space. This
happens when you try to embed Stage 1.5 into the unused sectors after
the MBR, but the first partition starts right after the MBR or they are
used by EZ-BIOS.
@end table


@node Invoking the grub shell
@chapter Invoking the grub shell

This chapter documents the grub shell @command{grub}. Note that the grub
shell is an emulator; it doesn't run under the native environment, so it
sometimes does something wrong. Therefore, you shouldn't trust it too
much. If there is anything wrong with it, don't hesitate to try the
native GRUB environment, especially when it guesses a wrong map between
BIOS drives and OS devices.

@menu
* Basic usage::                 How to use the grub shell
* Installation under UNIX::     How to install GRUB via @command{grub}
* Device map::                  The map between BIOS drives and OS devices
@end menu


@node Basic usage
@section Introduction into the grub shell

You can use the command @command{grub} for installing GRUB under your
operating systems and for a testbed when you add a new feature into GRUB
or when fixing a bug. @command{grub} is almost the same as the Stage 2,
and, in fact, it shares the source code with the Stage 2 and you can use
the same commands (@pxref{Commands}) in @command{grub}. It is emulated by
replacing BIOS calls with UNIX system calls and libc functions.

The command @command{grub} accepts the following options:

@table @option
@item --help
Print a summary of the command-line options and exit.

@item --version
Print the version number of GRUB and exit.

@item --verbose
Print some verbose messages for debugging purpose.

@item --device-map=@var{file}
Use the device map file @var{file}. The format is described in
@ref{Device map}.

@item --no-floppy
Do not probe any floppy drive. This option has no effect if the option
@option{--device-map} is specified (@pxref{Device map}).

@item --probe-second-floppy
Probe the second floppy drive. If this option is not specified, the grub
shell does not probe it, as that sometimes takes a long time. If you
specify the device map file (@pxref{Device map}), the grub shell just
ignores this option.

@item --config-file=@var{file}
Read the configuration file @var{file} instead of
@file{/boot/grub/menu.lst}. The format is the same as the normal GRUB
syntax. See @ref{Filesystem}, for more information.

@item --boot-drive=@var{drive}
Set the stage2 @var{boot_drive} to @var{drive}. This argument should be
an integer (decimal, octal or hexadecimal).

@item --install-partition=@var{par}
Set the stage2 @var{install_partition} to @var{par}. This argument
should be an integer (decimal, octal or hexadecimal).

@item --no-config-file
Do not use the configuration file even if it can be read.

@item --no-curses
Do not use the screen handling interface by the curses even if it is
available.

@item --batch
This option has the same meaning as @samp{--no-config-file --no-curses}.

@item --read-only
Disable writing to any disk.

@item --hold
Wait until a debugger will attach. This option is useful when you want
to debug the startup code.
@end table


@node Installation under UNIX
@section How to install GRUB via @command{grub}

The installation procedure is the same as under the @dfn{native} Stage
2. @xref{Installation}, for more information. The command
@command{grub}-specific information is described here.

What you should be careful about is @dfn{buffer cache}. @command{grub}
makes use of raw devices instead of filesystems that your operating
systems serve, so there exists a potential problem that some cache
inconsistency may corrupt your filesystems. What we recommend is:

@itemize @bullet
@item
If you can unmount drives to which GRUB may write any amount of data,
unmount them before running @command{grub}.

@item
If a drive cannot be unmounted but can be mounted with the read-only
flag, mount it in read-only mode. That should be secure.

@item
If a drive must be mounted with the read-write flag, make sure that no
activity is being done on it while the command @command{grub} is
running.

@item
Reboot your operating system as soon as possible. This is probably not
required if you follow the rules above, but reboot is the most secure
way.
@end itemize

In addition, enter the command @command{quit} when you finish the
installation. That is @emph{very important} because @command{quit} makes
the buffer cache consistent. Do not push @key{C-c}.

If you want to install GRUB non-interactively, specify @samp{--batch}
option in the command-line. This is a simple example:

@example
@group
#!/bin/sh

# Use /usr/sbin/grub if you are on an older system.
/sbin/grub --batch <<EOT 1>/dev/null 2>/dev/null
root (hd0,0)
setup (hd0)
quit
EOT
@end group
@end example


@node Device map
@section The map between BIOS drives and OS devices

When you specify the option @option{--device-map} (@pxref{Basic usage}),
the grub shell creates the @dfn{device map file} automatically unless it
already exists. The file name @file{/boot/grub/device.map} is preferred.

If the device map file exists, the grub shell reads it to map BIOS
drives to OS devices. This file consists of lines like this:

@example
@var{device} @var{file}
@end example

@var{device} is a drive specified in the GRUB syntax (@pxref{Device
syntax}), and @var{file} is an OS file, which is normally a device
file.

The reason why the grub shell gives you the device map file is that it
cannot guess the map between BIOS drives and OS devices correctly in
some environments. For example, if you exchange the boot sequence
between IDE and SCSI in your BIOS, it gets the order wrong.

Thus, edit the file if the grub shell makes a mistake. You can put any
comments in the file if needed, as the grub shell assumes that a line is
just a comment if the first character is @samp{#}.


@node Invoking grub-install
@chapter Invoking grub-install

The program @command{grub-install} installs GRUB on your drive using the
grub shell (@pxref{Invoking the grub shell}). You must specify the
device name on which you want to install GRUB, like this:

@example
grub-install @var{install_device}
@end example

The device name @var{install_device} is an OS device name or a GRUB
device name.

@command{grub-install} accepts the following options:

@table @option
@item --help
Print a summary of the command-line options and exit.

@item --version
Print the version number of GRUB and exit.

@item --force-lba
Force GRUB to use LBA mode even for a buggy BIOS. Use this option only
if your BIOS doesn't work properly in LBA mode even though it supports
LBA mode.

@item --root-directory=@var{dir}
Install GRUB images under the directory @var{dir} instead of the root
directory. This option is useful when you want to install GRUB into a
separate partition or a removable disk. Here is an example in which
you have a separate @dfn{boot} partition which is mounted on
@file{/boot}:

@example
@kbd{grub-install --root-directory=/boot hd0}
@end example

@item --grub-shell=@var{file}
Use @var{file} as the grub shell. You can append arbitrary options to
@var{file} after the file name, like this:

@example
@kbd{grub-install --grub-shell="grub --read-only" /dev/fd0}
@end example

@item --recheck
Recheck the device map, even if @file{/boot/grub/device.map} already
exists. You should use this option whenever you add/remove a disk
into/from your computer.
@end table


@node Invoking grub-md5-crypt
@chapter Invoking grub-md5-crypt

The program @command{grub-md5-crypt} encrypts a password in MD5 format.
This is just a frontend of the grub shell (@pxref{Invoking the grub
shell}). Passwords encrypted by this program can be used with the
command @command{password} (@pxref{password}).

@command{grub-md5-crypt} accepts the following options:

@table @option
@item --help
Print a summary of the command-line options and exit.

@item --version
Print the version information and exit.

@item --grub-shell=@var{file}
Use @var{file} as the grub shell.
@end table


@node Invoking grub-terminfo
@chapter Invoking grub-terminfo

The program @command{grub-terminfo} generates a terminfo command from
a terminfo name (@pxref{terminfo}). The result can be used in the
configuration file, to define escape sequences. Because GRUB assumes
that your terminal is vt100-compatible by default, this would be
useful only if your terminal is uncommon (such as vt52).

@command{grub-terminfo} accepts the following options:

@table @option
@item --help
Print a summary of the command-line options and exit.

@item --version
Print the version information and exit.
@end table

You must specify one argument to this command. For example:

@example
@kbd{grub-terminfo vt52}
@end example


@node Invoking grub-set-default
@chapter Invoking grub-set-default

The program @command{grub-set-default} sets the default boot entry for
GRUB. This automatically creates a file named @file{default} under
your GRUB directory (i.e. @file{/boot/grub}), if it is not
present. This file is used to determine the default boot entry when
GRUB boots up your system when you use @samp{default saved} in your
configuration file (@pxref{default}), and to save next default boot
entry when you use @samp{savedefault} in a boot entry
(@pxref{savedefault}).

@command{grub-set-default} accepts the following options:

@table @option
@item --help
Print a summary of the command-line options and exit.

@item --version
Print the version information and exit.

@item --root-directory=@var{dir}
Use the directory @var{dir} instead of the root directory
(i.e. @file{/}) to define the location of the default file. This
is useful when you mount a disk which is used for another system.
@end table

You must specify a single argument to @command{grub-set-default}. This
argument is normally the number of a default boot entry. For example,
if you have this configuration file:

@example
@group
default saved
timeout 10

title GNU/Hurd
root (hd0,0)
...

title GNU/Linux
root (hd0,1)
...
@end group
@end example

and if you want to set the next default boot entry to GNU/Linux, you
may execute this command:

@example
@kbd{grub-set-default 1}
@end example

Because the entry for GNU/Linux is @samp{1}. Note that entries are
counted from zero. So, if you want to specify GNU/Hurd here, then you
should specify @samp{0}.

This feature is very useful if you want to test a new kernel or to
make your system quite robust. @xref{Making your system robust}, for
more hints about how to set up a robust system.


@node Invoking mbchk
@chapter Invoking mbchk

The program @command{mbchk} checks for the format of a Multiboot
kernel. We recommend using this program before booting your own kernel
by GRUB.

@command{mbchk} accepts the following options:

@table @option
@item --help
Print a summary of the command-line options and exit.

@item --version
Print the version number of GRUB and exit.

@item --quiet
Suppress all normal output.
@end table


@node Obtaining and Building GRUB
@appendix How to obtain and build GRUB

@quotation
@strong{Caution:} GRUB requires binutils-2.9.1.0.23 or later because the
GNU assembler has been changed so that it can produce real 16bits
machine code between 2.9.1 and 2.9.1.0.x. See
@uref{http://sources.redhat.com/binutils/}, to obtain information on
how to get the latest version.
@end quotation

GRUB is available from the GNU alpha archive site
@uref{ftp://alpha.gnu.org/gnu/grub} or any of its mirrors. The file
will be named grub-version.tar.gz. The current version is
@value{VERSION}, so the file you should grab is:

@uref{ftp://alpha.gnu.org/gnu/grub/grub-@value{VERSION}.tar.gz}

To unbundle GRUB use the instruction:

@example
@kbd{zcat grub-@value{VERSION}.tar.gz | tar xvf -}
@end example

which will create a directory called @file{grub-@value{VERSION}} with
all the sources. You can look at the file @file{INSTALL} for detailed
instructions on how to build and install GRUB, but you should be able to
just do:

@example
@group
@kbd{cd grub-@value{VERSION}}
@kbd{./configure}
@kbd{make install}
@end group
@end example

This will install the grub shell @file{grub} (@pxref{Invoking the grub
shell}), the Multiboot checker @file{mbchk} (@pxref{Invoking mbchk}),
and the GRUB images. This will also install the GRUB manual.

Also, the latest version is available from the CVS. See
@uref{http://savannah.gnu.org/cvs/?group=grub} for more information.


@node Reporting bugs
@appendix Reporting bugs

These are the guideline for how to report bugs. Take a look at this
list below before you submit bugs:

@enumerate
@item
Before getting unsettled, read this manual through and through. Also,
see the @uref{http://www.gnu.org/software/grub/grub-faq.html, GNU GRUB FAQ}.

@item
Always mention the information on your GRUB. The version number and the
configuration are quite important. If you build it yourself, write the
options specified to the configure script and your operating system,
including the versions of gcc and binutils.

@item
If you have trouble with the installation, inform us of how you
installed GRUB. Don't omit error messages, if any. Just @samp{GRUB hangs
up when it boots} is not enough.

The information on your hardware is also essential. These are especially
important: the geometries and the partition tables of your hard disk
drives and your BIOS.

@item
If GRUB cannot boot your operating system, write down
@emph{everything} you see on the screen. Don't paraphrase them, like
@samp{The foo OS crashes with GRUB, even though it can boot with the
bar boot loader just fine}. Mention the commands you executed, the
messages printed by them, and information on your operating system
including the version number.

@item
Explain what you wanted to do. It is very useful to know your purpose
and your wish, and how GRUB didn't satisfy you.

@item
If you can investigate the problem yourself, please do. That will give
you and us much more information on the problem. Attaching a patch is
even better.

When you attach a patch, make the patch in unified diff format, and
write ChangeLog entries. But, even when you make a patch, don't forget
to explain the problem, so that we can understand what your patch is
for.

@item
Write down anything that you think might be related. Please understand
that we often need to reproduce the same problem you encounterred in our
environment. So your information should be sufficient for us to do the
same thing---Don't forget that we cannot see your computer directly. If
you are not sure whether to state a fact or leave it out, state it!
Reporting too many things is much better than omitting something
important.
@end enumerate

If you follow the guideline above, submit a report to the
@uref{http://savannah.gnu.org/bugs/?group=grub, Bug Tracking System}.
Alternatively, you can submit a report via electronic mail to
@email{bug-grub@@gnu.org}, but we strongly recommend that you use the
Bug Tracking System, because e-mail can be passed over easily.

Once we get your report, we will try to fix the bugs.


@node Future
@appendix Where GRUB will go

We started the next generation of GRUB, GRUB 2. This will include
internationalization, dynamic module loading, real memory management,
multiple architecture support, a scripting language, and many other
nice feature. If you are interested in the development of GRUB 2, take
a look at @uref{http://www.gnu.org/software/grub/grub.html, the
homepage}.


@c Separate the programming guide.
@include internals.texi


@node Index
@unnumbered Index

@c Currently, we use only the Concept Index.
@printindex cp


@bye

Some notes:

  This is the second attempt to rewrite the manual. The status is
mostly complete, but I need to check the spelling by ispell, and add
more indices. Perhaps I also have to let some English native speakers
proofread this manual through. My English is syntactically almost
perfect, but sometimes (often?) awful in the nuance. Hehe, I can't be an
English poet for now.
