8.2. The boot process in closer look
When a PC is booted, the BIOS will do various tests to
check that everything looks all right, and will then start the actual
booting. This process is called the power on self test
, or POST for short. It will choose a disk
drive (typically the first floppy drive, if there is a floppy
inserted, otherwise the first hard disk, if one is installed
in the computer; the order might be configurable, however)
and will then read its very first sector. This is called the
boot sector; for a hard disk, it is also
called the master boot record, since a
hard disk can contain several partitions, each with their own
boot sectors.
The boot sector contains a small program (small enough to
fit into one sector) whose responsibility is to read the actual
operating system from the disk and start it. When booting Linux
from a floppy disk, the boot sector contains code that just reads
the first few hundred blocks (depending on the actual kernel
size, of course) to a predetermined place in memory. On a Linux
boot floppy, there is no filesystem, the kernel is just stored
in consecutive sectors, since this simplifies the boot process.
It is possible, however, to boot from a floppy with a filesystem,
by using LILO, the LInux LOader, or GRUB, the GRand Unifying
Bootloader.
When booting from the hard disk, the code in the master
boot record will examine the partition table (also in the master
boot record), identify the active partition (the partition that is
marked to be bootable), read the boot sector from that partition,
and then start the code in that boot sector. The code in the
partition's boot sector does what a floppy disk's boot sector
does: it will read in the kernel from the partition and start it.
The details vary, however, since it is generally not useful to
have a separate partition for just the kernel image, so the
code in the partition's boot sector can't just read the disk
in sequential order, it has to find the sectors wherever the
filesystem has put them. There are several ways around this
problem, but the most common way is to use a boot loader like
LILO or GRUB. (The details
about how to do this are irrelevant for this discussion, however;
see the LILO or GRUB documentation for more information; it is most
thorough.)
When booting, the bootloader will normally go right ahead
and read in and boot the default kernel. It is also possible
to configure the boot loader to be able to boot one of several kernels,
or even other operating systems than Linux, and it is possible
for the user to choose which kernel or operating system is to
be booted at boot time. LILO, for example, can be configured so that if one
holds down the alt, shift, or
ctrl key at boot time (when LILO is loaded),
LILO will ask what is to be booted and not boot the default
right away. Alternatively, the bootloader can be configured so that it
will always ask, with an optional timeout that will cause the
default kernel to be booted.
It is also possible to give a kernel
command line argument, after the name of the kernel
or operating system. For a list of possible options you can read
https://www.tldp.org/HOWTO/BootPrompt-HOWTO.html.
Booting from floppy and from hard disk have both their
advantages, but generally booting from the hard disk is nicer,
since it avoids the hassle of playing around with floppies.
It is also faster. Most Linux distributions will setup the bootloader
for you during the install process.
After the Linux kernel has been read into the memory, by
whatever means, and is started for real, roughly the following
things happen:
The Linux kernel is installed compressed, so it will first
uncompress itself. The beginning of the kernel image
contains a small program that does this.
If you have a super-VGA card that Linux
recognizes and that has some special text modes (such as 100
columns by 40 rows), Linux asks you which mode
you want to use. During the kernel compilation, it is
possible to preset a video mode, so that this is never asked.
This can also be done with LILO, GRUB or rdev.
After this, the kernel checks what other hardware there is
(hard disks, floppies, network adapters, etc), and configures
some of its device drivers appropriately; while it does this,
it outputs messages about its findings. For example, when I
boot, I it looks like this:
LILO boot:
Loading linux.
Console: colour EGA+ 80x25, 8 virtual consoles
Serial driver version 3.94 with no serial options enabled
tty00 at 0x03f8 (irq = 4) is a 16450
tty01 at 0x02f8 (irq = 3) is a 16450
lp_init: lp1 exists (0), using polling driver
Memory: 7332k/8192k available (300k kernel code, 384k reserved, 176k
data)
Floppy drive(s): fd0 is 1.44M, fd1 is 1.2M
Loopback device init
Warning WD8013 board not found at i/o = 280.
Math coprocessor using irq13 error reporting.
Partition check:
hda: hda1 hda2 hda3
VFS: Mounted root (ext filesystem).
Linux version 0.99.pl9-1 (root@haven) 05/01/93 14:12:20 |
The exact texts are different on different systems, depending
on the hardware, the version of Linux being used, and how
it has been configured.
Then the kernel will try to mount the root
filesystem. The place is configurable at compilation time, or
any time with rdev or the bootloader. The filesystem
type is detected automatically. If the mounting of the root
filesystem fails, for example because you didn't remember to
include the corresponding filesystem driver in the kernel, the
kernel panics and halts the system (there isn't much it can do,
anyway).
The root filesystem is usually mounted read-only (this can
be set in the same way as the place). This makes it possible
to check the filesystem while it is mounted; it is not a good
idea to check a filesystem that is mounted read-write.
After this, the kernel starts
the program init (located in
/sbin/init) in the background (this will
always become process number 1). init does
various startup chores. The exact things it does depends on how
it is configured; see Section 2.3.1 for more information
(not yet written). It will at least start some essential
background daemons.
init then switches to
multi-user mode, and starts a getty for virtual
consoles and serial lines. getty is the
program which lets people log in via virtual consoles and serial
terminals. init may also start some other
programs, depending on how it is configured.
After this, the boot is complete, and the system
is up and running normally.