The Linux Boot Process
Quick HOWTO : Ch07 : The Linux Boot Process
Contents
Introduction
Learning how Linux boots up is critical. When you have this information you can use it to alter the type of login screen you get as well as which programs start up. Read on for the details.The Linux Boot Sequence
You might remember when you installed Linux that the installation process prompted you for a list of partitions and the sizes of each in which your filesystems would be placed.When allocating disk space for the partitions, the first sector, or data unit, for each partition is always reserved for programmable code used in booting. The very first sector of the hard disk is reserved for the same purpose and is called the master boot record (MBR).
When booting from a hard disk, the PC system BIOS starts by loading and executing bootloader code. In many cases the complete bootloader code is larger than the space available in the MBR, so booting has to be done in stages.
Fedora Linux uses the Grub staged bootloader system where the first stage bootloader code (
boot.img
) is run from the MBR, but depending on the version of Grub, the following sequence of events is different.
Grub Version 1
In Stage 1.5 of the Grub version 1 process, additional code is loaded from the 30 kilobytes of hard disk immediately after the MBR. This 1.5 bootloader image file includes enough partition and filesystem drivers to allow the Stage 2 to be loaded from a known location in the boot filesystem, usually/boot/grub
.
Stage 2 then loads other required drivers and kernel modules before
reading the Grub configuration file and displaying the boot menu.
Grub Version 2
Like version 1, version 2 reads an image file (core.img
)
in the 30 kilobytes after the MBR. To keep its size small, it contains
only enough modules to access the boot partition and loads everything it
needs, including the boot menu, from there.
Grub After the Boot Menu
The familiar GRUB startup menu is now displayed, which will allow you to select an operating system to boot or to view and edit kernel startup parameters.Assuming you select a version of Linux to boot, the following steps will happen:
- The kernel you selected is loaded into memory
- An image file containing a basic root file system with all the kernel modules and other files the kernel requires to continue the boot process is loaded into memory too. This file is sometimes called initrd ("init ram disk") or initramfs ("init ram filesystem").
- Grub then starts the kernel and tells it the memory address of the image file. The kernel then mounts this image file as a "starter" memory based root filesystem.
- The kernel then starts to detect the systems' hardware by loading drivers it needs from this filesystem.
- The root filesystem on disk takes over from the one in memory
- The boot process then starts the software daemons according to the system administrator's settings.
- A root file system will be created in memory using A ramdisk file will be loaded into memory
Grub Configuration Files
As you would expect, the different versions of Grub have different configuration file names and syntaxes. These will be covered next.Grub Version 1 Configuration
Grub v1 uses the/boot/grub/grub.conf
configuration file
to get a list of all the available operating systems and their booting
parameters. This information is then used to create the familiar GRUB
startup menu.
Note: In some operating systems, such as Debian / Ubuntu, the /boot/grub/grub.conf file may also be referred to by the name
/boot/grub/menu.lst
.
Figure 7-1 shows a typical grub.conf file for a system that can boot both Fedora Linux and Windows 2000.
Figure 7-1 Sample grub.conf file
default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz title Fedora Core (2.6.8-1.521) root (hd0,0) kernel /vmlinuz-2.6.8-1.521 ro root=LABEL=/ initrd /initrd-2.6.8-1.521.img title Windows 2000 rootnoverify (hd0,1) chainloader +1
In this example, the default value is set to 0, which means the system boots the first kernel entry (2.6.8-1.521) when you either:
- Hit the "enter" key when presented with the startup splash screen and boot menu
- Let the startup boot menu process timeout at which time it auto boots in an unattended mode
You can also see that the Fedora kernel file is
vmlinuz-2.6.8-1.521
and the memory based root filesystem image file is initrd-2.6.8-1.521.img
. Both these files will be found in your /boot
directory or partition.
The (
hd0,0
) and (hd0,1
) disk definitions may seem strange, but /boot/grub/device.map
file maps the Grub device nomenclature to that expected by Linux.
# # File: /boot/grub/device.map # (fd0) /dev/fd0 (hd0) /dev/hdaSo (
hd0,0
) and (hd0,1
) refer to the first and second partitions of device /dev/hda respectively.
Grub Version 2 Configuration
When Fedora installs new kernel versions, updated versions of the vmlinuz and initramfs files are deposited in the /etc/grub directory. After doing this, the script grub2-mkconfig is run to create an updated grub menu configuration file /boot/grub2/grub.cfg. This is then used to create the Grub boot menu. A very trimmed version of this file is shown below.# # File: /boot/grub2/grub.cfg # ... ... ... menuentry 'Fedora (3.4.2-1.fc16.x86_64)' --class fedora --class gnu-linux --class gnu --class os { echo 'Loading Fedora (3.4.2-1.fc16.x86_64)' linux /vmlinuz-3.4.2-1.fc16.x86_64 ... echo 'Loading initial ramdisk ...' initrd /initramfs-3.4.2-1.fc16.x86_64.img } ... ...Note: The /boot/grub2/grub.cfg file has sections or stanzas called "menuentry" that define the entries to be shown in the boot menu and the parameters each requires. You don't edit /boot/grub2/grub.cfg as it is auto-generated. Customizations are done in the /etc/default/grub file. A sample is below.
# # File: /etc/default/grub # GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="Fedora" GRUB_DEFAULT=saved GRUB_CMDLINE_LINUX="rd.md=0 rd.dm=0 rd.lvm.lv=vg_web003/LogVol01 rd.lvm.lv=vg_web003/LogVol00 \ KEYTABLE=us quiet SYSFONT=latarcyrheb-sun16 rhgb rd.luks=0 LANG=en_US.UTF-8"Here are what the keywords mean. If you need more information, the official Grub manual at http://www.gnu.org has more details.
GRUB_TIMEOUT
: The timeout in seconds that the boot menu is displayed.GRUB_DISTRIBUTOR
: The distribution of Linux being usedGRUB_SAVEDEFAULT
: When set to ‘true’, then the menu entry selected will be saved as the new default entry for all future reboots.GRUB_DEFAULT
: The name of the menuentry to use in the /boot/grub2/grub.cfg as the version of Linux to boot. If set to a number N, then the Nth entry is used. If set to "saved" then the value of GRUB_SAVEDEFAULT will be used. If GRUB_SAVEDEFAULT isn't defined, then the very first menuentry is used.GRUB_CMDLINE_LINUX
: A list of command-line arguments that will be added to the kernel menuentry stanzas in /boot/grub2/grub.cfg.
Boot Runlevels and Targets
The final post booting state of Linux systems is configured by the systems administrator. With Fedora / RedHat systems there are seven of these states as defined in Table 7-1 "Runlevel and Target Descriptions".Table 7-1 Runlevel and Target Descriptions
Runlevel | Target | Description |
---|---|---|
0 | runlevel0.target , poweroff.target | Halt |
1 | runlevel1.target, rescue.target | Single-user mode |
2 | runlevel2.target | Not used (user-definable) |
3 | runlevel3.target , multi-user.target | Full multi-user mode (no GUI interface) |
4 | runlevel4.target | Not used (user-definable) |
5 | runlevel5.target, graphical.target | Full multiuser mode (with GUI interface) |
6 | runlevel6.target, reboot.target | Reboot |
For example, when the system is set for runlevel zero, it halts, and when it's set to runlevel six, it reboots. The default level is usually 3, for booting without a GUI interface, or 5 for booting with one. Single user mode is used for maintenance or emergency repair purposes as it loads a very limited set of drivers and often has network services disabled.
Some differences between the init and systemd systems include:
- init: The daemon startup scripts in the /etc/rc.X directory are executed, where "X" is the run level. Daemons are started sequentially. Daemons are tracked by process IDs (PIDs) without constraints on resource usage.
- systemd: You can create your own target directories for your daemons in /etc/systemd/system to create your very own custom post boot states. Daemons can be started in parallel. Daemons are tracked by control groups or cgroups which limit system resources by class of daemon.
Systemd
Symbolic links to the systemd startup configuration files are located in the /etc/systemd/system directory. Each target will have its own subdirectory as shown in Table 7-2.Table 7-2 Systemd Target File Locations
Target | Directory |
---|---|
Default | /etc/systemd/system/default.target.wants |
Multiuser | /etc/systemd/system/multi-user.target.wants |
Network | /etc/systemd/system/network.target.wants |
Sockets | /etc/systemd/system/sockets.target.wants |
Sysinit | /etc/systemd/system/sysinit.target.wants |
Fortunately you don't have to be a scripting/symbolic linking guru to make sure everything works right because Fedora RPM daemon packages install their files in the correct locations so that they work correctly at each target level.
When the system boots under systemd, it follows these basic steps.
1. First, systemd reads all the .target files in the /lib/systemd/system/ directory. Each target file contains a list of services that need to be run during the target activation; a list of pre-requisite targets that have to be completed and the target which must be completed immediately beforehand. In some cases the file will include targets that must be completed immediately afterwards. In this sample target file we see that the target expects the steps in sysinit.target and sockets.target to be completed as pre-requisites and that the target will also run immediately after they are completed
# # File: /lib/systemd/system/basic.target # [Unit] Description=Basic System Requires=sysinit.target sockets.target After=sysinit.target sockets.target RefuseManualStart=yes2. Using this information, systemd creates a master list of services and the order in which they should be started. The system will boot and systemd will stop starting daemons in the list after it executes the services in the default.target file found in the /etc/systemd/system directory. 3. When all this is completed without errors, the system has booted successfully.
Table 7-3 provides a summary of some important systemd commands that will be helpful to you with systemd. These are then covered in more detail.
Table 7-3 Important Systemd Boot Related Commands
Desired Result | Command |
---|---|
Determine the current default target group | # ll /etc/systemd/system/default.target |
Determine the current active target group (Alternative method | # runlevel |
Set the default target group (multi-user) | # systemctl enable multi-user.target |
Change the current target group (multi-user) | # systemctl isolate multi-user.target # systemctl isolate runlevel3.target |
List all active targets in the active target group | # systemctl list-units --type=target |
Determine the current default target group
As stated before the target control files are located in the /etc/systemd directory tree. The file that sets the default target is /etc/systemd/system/default.target. In this case doing a directory listing of this file shows that when the system boots next, it will be in target 3.[root@bigboy tmp]# ll /etc/systemd/system/default.target lrwxrwxrwx. 1 root root 36 Jan 1 2012 /etc/systemd/system/default.target -> /lib/systemd/system/runlevel3.target [root@bigboy tmp]#The currently running target can be determined using the runlevel command. Here we see that it is set to 3 also.
[root@bigboy tmp]# runlevel N 3 [root@bigboy tmp]#If you need to see all the various targets that are active then use the systemctl list-units --type=target command as shown here.
[root@bigboy tmp]# systemctl list-units --type=target UNIT LOAD ACTIVE SUB JOB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes getty.target loaded active active Login Prompts local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User network.target loaded active active Network remote-fs.target loaded active active Remote File Systems sockets.target loaded active active Sockets sound.target loaded active active Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization syslog.target loaded active active Syslog LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. JOB = Pending job for the unit. 13 units listed. Pass --all to see inactive units, too. [root@bigboy tmp]#
Set the default target group
To set the default target use either the systemctl enable x.target command or the ln -sf command to link the /lib/systemd/system/*.target file to /etc/systemd/system/default.target. In these cases we set the default target to 3 and 5.[root@bigboy tmp]# systemctl enable multi-user.target [root@bigboy tmp]# systemctl enable graphical.target [root@bigboy tmp]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target [root@bigboy tmp]# ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.targetNext we'll discuss systems that use init.
SysV Init
When a Linux system running SysV Init begins to boot with its kernel, it first runs the /sbin/init program, which does some system checks, such as verifying the integrity of the file systems, and starts vital programs needed for the operating system to function properly. It then inspects the /etc/inittab file to determine Linux's overall mode of operation or runlevel. A listing of valid runlevels can be seen in Table 7-4. Table 7-4 "Init Runlevel File Locations"7-4 Init Runlevel File Locations
Runlevel | Directory |
---|---|
0 | /etc/rc.d/rc0.d |
1 | /etc/rc.d/rc1.d |
2 | /etc/rc.d/rc2.d |
3 | /etc/rc.d/rc3.d |
4 | /etc/rc.d/rc4.d |
5 | /etc/rc.d/rc5.d |
6 | /etc/rc.d/rc6.d |
/etc/rc.d
directory. Scripts used for runlevels 0 to 6 are located in subdirectories /etc/rc.d/rc0.d
through /etc/rc.d/rc6.d
, respectively.
Here is a directory listing of the scripts in the
/etc/rc.d/rc3.d
directory:
[root@bigboy tmp]# ls /etc/rc.d/rc3.d ... ... K75netfs K96pcmcia ... ... ... ... K86nfslock S05kudzu ... ... ... ... K87portmap S09wlan ... ... ... ... K91isdn S10network ... ... ... ... K92iptables S12syslog ... ... ... ... K95firstboot S17keytable ... ... [root@bigboy tmp]#As you can see, each filename in these directories either starts with an "S" which signifies the script should be run at startup, or a K, which means the script should be run when the system is shutting down. If a script isn't there, it won't be run.
Most Linux packages place their startup script in the
/etc/init.d
directory and place symbolic links (pointers) to this script in the appropriate subdirectory of /etc/rc.d
.
This makes file management a lot easier. The deletion of a link doesn't
delete the file, which can then be used for another day.
The number that follows the K or S specifies the position in which the scripts should be run in ascending order. In our example,
kudzu
with a value 05 will be started before wlan
with a value of 09.
Fortunately you don't have to be a scripting/symbolic linking guru to
make sure everything works right because Fedora comes with a nifty
utility called chkconfig
while Debian / Ubuntu uses the update-rc.d
command to do it all for you. This is explained later.
Determining and Setting the Default Boot runlevel
The default boot runlevel is set in the file /etc/inittab with the initdefault variable. When set to 3, the system boots up with the text interface on the VGA console; when set to 5, you get the GUI. Here is a snippet of the file (delete the initdefault line you don't need):# Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # Console Text Mode id:5:initdefault: # Console GUI ModeNote the following:
- Most home users boot up with a Windows like GUI (runlevel 5)
- Most techies will tend to boot up with a plain text-based command-line-type interface (runlevel 3)
- Changing initdefault from 3 to 5, or vice-versa, has an effect upon your next reboot. See the following section on how to get a GUI login all the time until the next reboot.
- Of course, don't set the initdefault value to 6 or your system will constantly reboot. Setting it to 0 will never allow it to start!
System Shutdown and Rebooting
It is usually not a good idea to immediately power off your system when you are finished using it. This can cause files that are being updated to become corrupted, or worse, you could corrupt the filesystem directory structure. Linux has a number of ways to gracefully shut down and reboot your system which will be outlined in this section.Halt/Shut Down The System
The init command will allow you to change the current runlevel, and for a shutdown, that value is 0. Here is an example:[root@bigboy tmp]# init 0Fedora also has a shutdown command which can also be used to the same effect. It often prompts you as to whether you are sure you want to execute the command, which can be avoided with the -y switch. The -h switch forces the system to halt, and the first argument tells it how long to wait before starting the procedure, in this case 0 minutes. You can also specify shutting down at a specific time of the day; please refer to the man pages for details. Another advantage of the shutdown command is that it warns people that the shutdown is going to occur.
[root@bigboy tmp]# shutdown -hy 0 Broadcast message from root (pts/0) (Sat Nov 6 13:15:27 2004): The system is going down for system halt NOW! [root@bigboy tmp]#
Reboot The System
You can also use the init command to reboot the system immediately by entering runlevel 6.[root@bigboy tmp]# init 6The "reboot" command has the same effect, but it also sends a warning message to all users.
[root@bigboy tmp]# reboot Broadcast message from root (pts/0) (Sat Nov 6 12:39:31 2004): The system is going down for reboot NOW! [root@bigboy tmp]#More graceful reboots can be done with the shutdown command using the -r switch and specifying a delay, which in this case is 10 minutes.
[root@bigboy root]# shutdown -ry 10 Broadcast message from root (pts/0) (Sat Nov 6 13:26:39 2004): The system is going DOWN for reboot in 10 minutes! Broadcast message from root (pts/0) (Sat Nov 6 13:27:39 2004): The system is going DOWN for reboot in 9 minutes! ... ... ... Broadcast message from root (pts/0) (Sat Nov 6 13:36:39 2004): The system is going down for reboot NOW!
Entering Single-user Mode
Some activities require you to force the system to log off all users, third-party applications and networking so that only the systems administrator has access to the system from the VGA console. A typical scenario is the addition of a new hard disk, as mentioned in Chapter 27, "Expanding Disk Capacity", or the troubleshooting of a failed boot process.Another reason is the recovery of your root password.
Switching to Single-user Mode
When the system is running normally, this can be done by using the init command to enter runlevel 1. It is best to do this from the console, because if you do it from a remote terminal session you'll be logged out.[root@bigboy root]# init 1 ... ... bash-2.05b#Unfortunately, this gives no prior warning to users, and the shutdown command doesn't have a single-user mode option. This can be overcome by running the shutdown command with a delay in minutes as the only argument.
[root@bigboy tmp]# shutdown 1 Broadcast message from root (pts/0) (Sat Nov 6 13:44:59 2004): The system is going DOWN to maintenance mode in 1 minute! Broadcast message from root (pts/0) (Sat Nov 6 13:45:59 2004): The system is going down to maintenance mode NOW! ... ... bash-2.05b#
Entering Single-user Mode At The Grub Splash Screen
You can enter single user mode directly after turning on the power to your system. The steps to do this are listed below.1. Power on your system. Wait for the "Grub loading" message to appear and, depending on your Linux distribution, get ready to hit either any key or the ESC key to enter the grub boot menu.
Grub loading, please wait ... Press ESC to enter the menuor
Grub loading, please wait ... Press any key to enter the menu2. You will then get grub's main menu which will display a list of available kernels. Use the arrow keys to scroll to your desired version of the kernel and then press e for "edit".
Fedora Core (2.6.18-1.2239.fc5smp) Fedora Core (2.6.18-1.2200.fc5smp)3. The kernel's boot menu will appear. Use the arrow keys to scroll to the "kernel" line and then press e for "edit".
root (hd0,0) kernel /vmlinuz-2.6.18-1.2239.fc5smp ro root=LABEL=/ initrd /initrd-2.6.18-1.2239.fc5smp.img4. A grub edit prompt will appear. Use the arrow keys to move to the end of the line and add the word "single" to the end, separated by a space. Change
grub edit> kernel /vmlinuz-2.6.18-1.2239.fc5smp ro root=LABEL=/to
grub edit> kernel /vmlinuz-2.6.18-1.2239.fc5smp ro root=LABEL=/ single5. Press enter to save your changes, and then b for "boot". 6. The system will continue to boot, but will go straight to the root # prompt without first asking for a username and password.
Reverting To Your Default runlevel From Single User Mode
The exit command forces the system to exit runlevel 1 and revert to the default runlevel for the system. You can also use the init command (for example init 3 and init 5) to alter this default behavior:bash-2.05b# exit INIT: Entering runlevel: 3 ... ... ... Fedora Core release 2 (Tettnang) Kernel 2.6.8-1.521 on an i686 bigboy login:
Root Password Recovery
Sometimes you might forget the root password, or the previous systems administrator may move on to a new job without giving it to you. To do this, follow these steps:- Go to the VGA console and press Ctrl-Alt-Del. The system will then shut down in an orderly fashion.
- Reboot the system and enter single-user mode.
- Once at the command prompt, change your password. Single user mode assumes the person at the console is the systems administrator root, so you don't have to specify a root username.
- Return to your default runlevel by using the exit command.
The Linux Console
A good knowledge of some basic Linux console commands is always helpful immediately after booting. Here are some examples.Getting a GUI Console
Manual Method: You can start the X terminal GUI application each time you need it by running the startx command at the VGA console. Remember that when you log out you will get the regular text-based console again.[root@bigboy tmp]# startxAutomatic Method: You can have Linux automatically start the X terminal GUI console for every login attempt until your next reboot by using the init command. You will need to edit your initdefault variable in your /etc/inittab file, as mentioned in the preceding section to keep this functionality even after you reboot.
[root@bigboy tmp]# init 5When the CPU capacity or available memory on your server is low or you want to maximize all system resources, you might want to operate in text mode runlevel 3 most of the time, using the GUI only as necessary with the startx command.
Servers that double as personal workstations, or servers that might have to be operated for an extended period of time by relatively nontechnical staff, may need to be run at runlevel 5 all the time through the init 5 command. Remember you can make runlevel 5 permanent even after a reboot by editing the /etc/inittab file.
Get a Basic Text Terminal Without Exiting the GUI
There are a number of ways for you to get a command prompt when running a Linux GUI. This can be important if you need quick access to commands or you are not familiar with the GUI menu option layout.Using a GUI Terminal Window
You can open a GUI-based window with a command prompt inside by doing the following:- Click on the Fedora logo button in the bottom left hand corner of the screen.
- Click on Systems Tools and then Terminal
Using Virtual Consoles
By default, Linux runs six virtual console or TTY sessions running on the VGA console. These are defined by the mingetty statements in the /etc/inittab file. The X terminal GUI console creates its own virtual console using the first available TTY that is not controlled by mingetty. This makes the GUI run as number 7:- You can step through each virtual console session by using the Ctl-Alt-F1 through F6 key sequence. You'll get a new login prompt for each attempt.
- You can get the GUI login with the sequence Ctl-Alt-F7 only in run level 5, or if the GUI is running after launching startx.
Comments