A bootdisk is basically a miniature, self-contained Linux system on a
diskette. It must perform many of the same functions that a complete
full-size Linux system performs. Before trying to build one you should
understand the basic Linux boot process. Here we present the basics, which
are sufficient for understanding the rest of this document. Many details and
alternative options have been omitted.

All PC systems start the boot process by executing code in ROM
(specifically, the BIOS) to load the sector from
sector 0, cylinder 0 of the boot drive. The boot drive is usually the
first floppy drive (designated A: in DOS and
/dev/fd0 in Linux). The BIOS then tries to execute
this sector. On most bootable disks, sector 0, cylinder 0 contains either:

code from a boot loader such as LILO, which locates the kernel,
loads it and executes it to start the boot proper; or

the start of an operating system kernel, such as Linux.

If a Linux kernel has been raw-copied to a diskette, the first sector of the
disk will be the first sector of the Linux kernel itself. This first sector
will continue the boot process by loading the rest of the kernel from the boot
device.

When the kernel is completely loaded, it initializes device drivers and its
internal data structures. Once it is completely initialized, it consults a
special location in its image called the ramdisk word.
This word tells it how and where to find its root
filesystem. A root filesystem is simply a filesystem that will be
mounted as ``/''. The kernel has to be told where to
look for the root filesystem; if it cannot find a loadable image there, it
halts.

In some boot situations — often when booting from a diskette
— the root filesystem is loaded into a ramdisk,
which is RAM accessed by the system as if it were a disk. RAM is several
orders of magnitude faster than a floppy disk, so system operation is fast
from a ramdisk. Also, the kernel can load a compressed
filesystem from the floppy and uncompress it onto the ramdisk,
allowing many more files to be squeezed onto the diskette.

Once the root filesystem is loaded and mounted, you see a message like:

VFS: Mounted root (ext2 filesystem) readonly.

Once the system has loaded a root filesystem successfully, it tries to
execute the init program (in /bin or
/sbin). init reads its
configuration file /etc/inittab, looks for a line
designated sysinit, and executes the named script. The
sysinit script is usually something like
/etc/rc or /etc/init.d/boot. This
script is a set of shell commands that set up basic system services, such as
running fsck on hard disks, loading necessary kernel
modules, initializing swapping, initializing the network, and mounting disks
mentioned in /etc/fstab.

This script often invokes various other scripts to do modular
initialization. For example, in the common SysVinit structure, the directory
/etc/rc.d/ contains a complex structure of subdirectories
whose files specify how to enable and shut down most system services. However,
on a bootdisk the sysinit script is often very simple.

When the sysinit script finishes control returns to init,
which then enters the default runlevel, specified in
inittab with the initdefault keyword.
The runlevel line usually specifies a program like getty,
which is responsible for handling commununications through the console and
ttys. It is the getty program which prints the familiar
``login:'' prompt. The getty program in
turn invokes the login program to handle login validation
and to set up user sessions.

Having reviewed the basic boot process, we can now define various
kinds of disks involved. We classify disks into four types. The
discussion here and throughout this document uses the term ``disk'' to
refer to floppy diskettes unless otherwise specified, though most of
the discussion could apply equally well to hard disks.

boot

A disk containing a kernel which can be booted. The disk
can be used to boot the kernel, which then may load a root file system on
another disk. The kernel on a bootdisk usually must be told where to find
its root filesystem.

Often a bootdisk loads a root filesystem from another diskette, but it is
possible for a bootdisk to be set up to load a hard disk's root filesystem
instead. This is commonly done when testing a new kernel (in fact,
``make zdisk'' will create such a bootdisk automatically
from the kernel source code).

root

A disk with a filesystem containing files
required to run a Linux system. Such a disk does not necessarily
contain either a kernel or a boot loader.

A root disk can be used to run the system independently of any other
disks, once the kernel has been booted. Usually the root disk is
automatically copied to a ramdisk. This makes root disk accesses much
faster, and frees up the disk drive for a utility disk.

boot/root

A disk which contains both the kernel and a root filesystem. In other
words, it contains everything necessary to boot and run a Linux system
without a hard disk. The advantage of this type of disk is that is it
compact — everything required is on a single disk. However, the gradually
increasing size of everything means that it is increasingly difficult to
fit everything on a single diskette, even with compression.

utility

A disk which contains a filesystem, but is not
intended to be mounted as a root file system. It is an additional data
disk. You would use this type of disk to carry additional utilities where
you have too much to fit on your root disk.

In general, when we talk about ``building a bootdisk'' we mean
creating both the boot (kernel) and root (files) portions. They may
be either together (a single boot/root disk) or separate (boot + root
disks). The most flexible approach for rescue diskettes is probably
to use separate boot and root diskettes, and one or more utility
diskettes to handle the overflow.