Boot Sequence
From: https://manpages.ubuntu.com/manpages/trusty/man7/boot.7.html
jammy (7) boot.7.gz
Provided by: manpages_5.10-1ubuntu1_all bug
NAME
boot - System bootup process based on UNIX System V Release 4
DESCRIPTION
The bootup process (or "boot sequence") varies in details among systems, but can be
roughly divided into phases controlled by the following components:
Each of these is described below in more detail.
Hardware
After power-on or hard reset, control is given to a program stored in read-only memory
(normally PROM); for historical reasons involving the personal computer, this program is
often called "the BIOS".
This program normally performs a basic self-test of the machine and accesses nonvolatile
memory to read further parameters. This memory in the PC is battery-backed CMOS memory,
so most people refer to it as "the CMOS"; outside of the PC world, it is usually called
"the NVRAM" (nonvolatile RAM).
The parameters stored in the NVRAM vary among systems, but as a minimum, they should
specify which device can supply an OS loader, or at least which devices may be probed for
one; such a device is known as "the boot device". The hardware boot stage loads the OS
loader from a fixed position on the boot device, and then transfers control to it.
Note: The device from which the OS loader is read may be attached via a network, in which
case the details of booting are further specified by protocols such as DHCP, TFTP,
PXE, Etherboot, etc.
OS loader
The main job of the OS loader is to locate the kernel on some device, load it, and run it.
Most OS loaders allow interactive use, in order to enable specification of an alternative
kernel (maybe a backup in case the one last compiled isn't functioning) and to pass
optional parameters to the kernel.
In a traditional PC, the OS loader is located in the initial 512-byte block of the boot
device; this block is known as "the MBR" (Master Boot Record).
In most systems, the OS loader is very limited due to various constraints. Even on non-PC
systems, there are some limitations on the size and complexity of this loader, but the
size limitation of the PC MBR (512 bytes, including the partition table) makes it almost
impossible to squeeze much functionality into it.
Therefore, most systems split the role of loading the OS between a primary OS loader and a
secondary OS loader; this secondary OS loader may be located within a larger portion of
persistent storage, such as a disk partition.
In Linux, the OS loader is often either lilo(8) or grub(8).
Kernel
When the kernel is loaded, it initializes various components of the computer
and operating system; each portion of software responsible for such a task is
usually consider "a driver" for the applicable component. The kernel starts
the virtual memory swapper (it is a kernel process, called "kswapd" in a modern
Linux kernel), and mounts some filesystem at the root path, /.
Some of the parameters that may be passed to the kernel relate to these
activities (for example, the default root filesystem can be overridden); for
further information on Linux kernel parameters, read bootparam(7).
Only then does the kernel create the initial userland process, which is given
the number 1 as its PID (process ID). Traditionally, this process executes the
program /sbin/init, to which are passed the parameters that haven't already
been handled by the kernel.
Root user-space process
Note: The following description applies to an OS based on
UNIX System V Release 4. However, a number of widely used systems have adopted
a related but fundamentally different approach known as systemd(1), for which
the bootup process is detailed in its associated bootup(7).
When /sbin/init starts, it reads /etc/inittab for further instructions. This
file defines what should be run when the /sbin/init program is instructed to
enter a particular run-level, giving the administrator an easy way to establish
an environment for some usage; each run-level is associated with a set of
services (for example, run-level S is single- user mode, and run-level 2
entails running most network services).
The administrator may change the current run-level via init(1), and query the
current run-level via runlevel(8).
However, since it is not convenient to manage individual services by editing
this file, /etc/inittab only bootstraps a set of scripts that actually
start/stop the individual services.
Boot scripts
Note: The following description applies to an OS based on UNIX System V Release 4.
However, a number of widely used systems (Slackware Linux, FreeBSD, OpenBSD) have a
somewhat different scheme for boot scripts.
For each managed service (mail, nfs server, cron, etc.), there is a single startup script
located in a specific directory (/etc/init.d in most versions of Linux). Each of these
scripts accepts as a single argument the word "start" (causing it to start the service) or
the word "stop" (causing it to stop the service). The script may optionally accept other
"convenience" parameters (e.g., "restart" to stop and then start, "status" to display the
service status, etc.). Running the script without parameters displays the possible
arguments.
Sequencing directories
To make specific scripts start/stop at specific run-levels and in a specific order,
there are sequencing directories, normally of the form /etc/rc[0-6S].d. In each of
these directories, there are links (usually symbolic) to the scripts in the /etc/init.d
directory.
A primary script (usually /etc/rc) is called from inittab(5); this primary script calls
each service's script via a link in the relevant sequencing directory. Each link whose
name begins with 'S' is called with the argument "start" (thereby starting the service).
Each link whose name begins with 'K' is called with the argument "stop" (thereby stopping
the service).
To define the starting or stopping order within the same run-level, the name of a link
contains an order-number. Also, for clarity, the name of a link usually ends with the
name of the service to which it refers. For example, the link /etc/rc2.d/S80sendmail
starts the sendmail service on runlevel 2. This happens after /etc/rc2.d/S12syslog
is run but before /etc/rc2.d/S90xfs is run.
To manage these links is to manage the boot order and run-levels; under many systems,
there are tools to help with this task (e.g., chkconfig(8)).
Boot configuration
A program that provides a service is often called a "daemon". Usually, a daemon may
receive various command-line options and parameters. To allow a system administrator to
change these inputs without editing an entire boot script, some separate configuration
file is used, and is located in a specific directory where an associated boot script may
find it (/etc/sysconfig on older Red Hat systems).
In older UNIX systems, such a file contained the actual command line options for a daemon,
but in modern Linux systems (and also in HP-UX), it just contains shell variables. A boot
script in /etc/init.d reads and includes its configuration file (that is, it "sources" its
configuration file) and then uses the variable values.
FILES
/etc/init.d/, /etc/rc[S0-6].d/, /etc/sysconfig/
SEE ALSO
init(1), systemd(1), inittab(5), bootparam(7), bootup(7), runlevel(8), shutdown(8)
COLOPHON
This page is part of release 5.10 of the Linux man-pages project. A description of the
project, information about reporting bugs, and the latest version of this page, can be
found at https://www.kernel.org/doc/man-pages/.