boot — System bootup process based on UNIX System V Release 4
The bootup process (or "boot sequence") varies in details among systems, but can be roughly divided into phases controlled by the following components:
hardware
operating system (OS) loader
kernel
root user-space process (init
and inittab
)
boot scripts
Each of these is described below in more detail.
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. |
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).
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.
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.
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.
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)).
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.
This page is part of release 4.07 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/.
Written by Oron Peled <oronactcom.co.il>. %%%LICENSE_START(GPL_NOVERSION_ONELINE) May be distributed subject to the GPL. %%%LICENSE_END I tried to be as much generic in the description as possible: - General boot sequence is applicable to almost any OS/Machine (DOS/PC, Linux/PC, Solaris/SPARC, CMS/S390) - kernel and init(1) is applicable to almost any UNIX/Linux - boot scripts are applicable to SYSV-R4 based UNIX/Linux Modified 2004-11-03 patch from Martin Schulze <joeyinfodrom.org> |