A bootdisk is basically a miniature, self-contained Linux system on a floppy 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. We present the basics here, 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:
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.
Once the kernel is completely loaded, it goes through some basic device initialization. It then tries to load and mount a root filesystem from some device. A root filesystem is simply a filesystem that is 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. There are two reasons why the system loads to ramdisk. First, RAM is several orders of magnitude faster than a floppy disk, so system operation is fast; and second, 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.
At this point the system finds the init
program on the root filesystem
(in /bin
or /sbin
) and executes it. 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:
fsck
on all the disks,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.
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).
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.
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.
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.