In this chapter you will learn how the system start.
Objectives: In this chapter, future Linux administrators will learn:
The different stages of the booting process;
How Rocky Linux supports this boot via GRUB2 and systemd;
How to protect GRUB2 from an attack;
How to manage the services;
How to access to the logs from journald.
Reading time: 20 minutes
The boot process¶
It is important to understand the boot process of Linux in order to be able to solve problems that may occur.
The boot process includes:
The BIOS startup¶
The BIOS (Basic Input/Output System) performs the POST (power on self-test) to detect, test and initialize the system hardware components.
It then loads the MBR (Master Boot Record).
The Master boot record (MBR)¶
The Master Boot Record is the first 512 bytes of the boot disk. The MBR discovers the boot device and loads the bootloader GRUB2 into memory and transfers control to it.
The next 64 bytes contain the partition table of the disk.
The GRUB2 bootloader¶
The default bootloader for the Rocky 8 distribution is GRUB2 (GRand Unified Bootloader). GRUB2 replaces the old GRUB bootloader (also called GRUB legacy).
The GRUB 2 configuration file is located under
/boot/grub2/grub.cfg but this file should not be edited directly.
The GRUB2 menu configuration settings are located under
/etc/default/grub and are used to generate the
# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap crashkernel=auto rd.lvm.lv=rhel/root rhgb quiet net.ifnames=0" GRUB_DISABLE_RECOVERY="true"
If changes are made to one or more of these parameters, the
grub2-mkconfig command must be run to regenerate the
[root] # grub2-mkconfig –o /boot/grub2/grub.cfg
- GRUB2 looks for the compressed kernel image (the
vmlinuzfile) in the
- GRUB2 loads the kernel image into memory and extracts the contents of the
initramfsimage file into a temporary folder in memory using the
The kernel starts the
systemd process with PID 1.
root 1 0 0 02:10 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
Systemd is the parent of all system processes. It reads the target of the
/etc/systemd/system/default.target link (e.g.,
/usr/lib/systemd/system/multi-user.target) to determine the default target of the system. The file defines the services to be started.
Systemd then places the system in the target-defined state by performing the following initialization tasks:
- Set the machine name
- Initialize the network
- Initialize SELinux
- Display the welcome banner
- Initialize the hardware based on the arguments given to the kernel at boot time
- Mount the file systems, including virtual file systems like /proc
- Clean up directories in /var
- Start the virtual memory (swap)
Protecting the GRUB2 bootloader¶
Why protect the bootloader with a password?
- Prevent Single user mode access - If an attacker can boot into single user mode, he becomes the root user.
- Prevent access to GRUB console - If an attacker manages to use GRUB console, he can change its configuration or collect information about the system by using the
- Prevent access to insecure operating systems. If there is a dual boot on the system, an attacker can select an operating system like DOS at boot time that ignores access controls and file permissions.
To password protect the GRUB2 bootloader:
-unrestrictedfrom the main
CLASS=statement in the
If a user has not yet been configured, use the
grub2-setpasswordcommand to provide a password for the root user:
/boot/grub2/user.cfg file will be created if it was not already present. It contains the hashed password of the GRUB2.
This command only supports configurations with a single root user.
[root]# cat /boot/grub2/user.cfg GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.CC6F56....A21
- Recreate the configuration file with the
[root]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-f9725b0c842348ce9e0bc81968cf7181 Found initrd image: /boot/initramfs-0-rescue-f9725b0c842348ce9e0bc81968cf7181.img done
- Restart the server and check.
All entries defined in the GRUB menu will now require a user and password to be entered at each boot. The system will not boot a kernel without direct user intervention from the console.
- When the user is requested, enter
- When a password is requested, enter the password provided at the
To protect only the editing of GRUB menu entries and access to the console, the execution of the
grub2-setpassword command is sufficient. There may be cases where you have good reasons for doing only that. This might be particularly true in a remote data center where entering a password each time a server is rebooted is either difficult or impossible to do.
Systemd is a service manager for the Linux operating systems.
It is developed to:
- remain compatible with older SysV initialization scripts,
- provide many features, such as parallel start of system services at system startup, on-demand activation of daemons, support for snapshots, or management of dependencies between services.
Systemd is the default initialization system since RedHat/CentOS 7.
Systemd introduces the concept of systemd units.
||A group of systemd units|
||An automatic mount point for file system|
There are many types of units: Device unit, Mount unit, Path unit, Scope unit, Slice unit, Snapshot unit, Socket unit, Swap unit, Timer unit.
Systemd supports system state snapshots and restore.
Mount points can be configured as systemd targets.
At startup, systemd creates listening sockets for all system services that support this type of activation and passes these sockets to these services as soon as they are started. This makes it possible to restart a service without losing a single message sent to it by the network during its unavailability. The corresponding socket remains accessible and all messages are queued.
System services that use D-BUS for their inter-process communications can be started on demand the first time they are used by a client.
Systemd stops or restarts only running services. Previous versions (before RHEL7) attempted to stop services directly without checking their current status.
System services do not inherit any context (like HOME and PATH environment variables). Each service operates in its own execution context.
All service unit operations are subject to a default timeout of 5 minutes to prevent a malfunctioning service from freezing the system.
Managing system services¶
Service units end with the
.service file extension and have a similar purpose to init scripts. The
systemctl command is used to
restart a system service:
|systemctl start name.service||Start a service|
|systemctl stop name.service||Stops a service|
|systemctl restart name.service||Restart a service|
|systemctl reload name.service||Reload a configuration|
|systemctl status name.service||Checks if a service is running|
|systemctl try-restart name.service||Restart a service only if it is running|
|systemctl list-units --type service --all||Display the status of all services|
systemctl command is also used for the
disable of system a service and displaying associated services:
|systemctl enable name.service||Activate a service|
|systemctl disable name.service||Disable a service|
|systemctl list-unit-files --type service||Lists all services and checks if they are running|
|systemctl list-dependencies --after||Lists the services that start before the specified unit|
|systemctl list-dependencies --before||Lists the services that start after the specified unit|
systemctl stop nfs-server.service # or systemctl stop nfs-server
To list all units currently loaded:
systemctl list-units --type service
To list all units to check if they are activated:
systemctl list-unit-files --type service
systemctl enable httpd.service systemctl disable bluetooth.service
Example of a .service file for the postfix service¶
postfix.service Unit File What follows is the content of the /usr/lib/systemd/system/postfix.service unit file as currently provided by the postfix package: [Unit] Description=Postfix Mail Transport Agent After=syslog.target network.target Conflicts=sendmail.service exim.service [Service] Type=forking PIDFile=/var/spool/postfix/pid/master.pid EnvironmentFile=-/etc/sysconfig/network ExecStartPre=-/usr/libexec/postfix/aliasesdb ExecStartPre=-/usr/libexec/postfix/chroot-update ExecStart=/usr/sbin/postfix start ExecReload=/usr/sbin/postfix reload ExecStop=/usr/sbin/postfix stop [Install] WantedBy=multi-user.target
Using system targets¶
On Rocky8/RHEL8, the concept of run levels has been replaced by Systemd targets.
Systemd targets are represented by target units. Target units end with the
.target file extension and their sole purpose is to group other Systemd units into a chain of dependencies.
For example, the
graphical.target unit, which is used to start a graphical session, starts system services such as the GNOME display manager (
gdm.service) or the accounts service (
accounts-daemon.service) and also activates the
multi-user.target unit starts other essential system services, such as NetworkManager (
NetworkManager.service) or D-Bus (
dbus.service) and activates another target unit named
|poweroff.target||Shuts down the system and turns it off|
|rescue.target||Activates a rescue shell|
|multi-user.target||Activates a multi-user system without graphical interface|
|graphical.target||Activates a multi-user system with graphical interface|
|reboot.target||Shuts down and restarts the system|
The default target¶
To determine which target is used by default:
This command searches for the target of the symbolic link located at
/etc/systemd/system/default.target and displays the result.
$ systemctl get-default graphical.target
systemctl command can also provide a list of available targets:
systemctl list-units --type target UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System bluetooth.target loaded active active Bluetooth cryptsetup.target loaded active active Encrypted Volumes getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface 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 System network-online.target loaded active active Network is Online network.target loaded active active Network nss-user-lookup.target loaded active active User and Group Name Lookups paths.target loaded active active Paths remote-fs.target loaded active active Remote File Systems slices.target loaded active active Slices 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 timers.target loaded active active Timers
To configure the system to use a different default target:
systemctl set-default name.target
# systemctl set-default multi-user.target rm '/etc/systemd/system/default.target' ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'
To switch to a different target unit in the current session:
systemctl isolate name.target
The Rescue mode provides a simple environment to repair your system in cases where it is impossible to perform a normal boot process.
rescue mode, the system attempts to mount all local file systems and start several important system services, but does not enable a network interface or allow other users to connect to the system at the same time.
On Rocky 8, the
rescue mode is equivalent to the old
single user mode and requires the root password.
To change the current target and enter
rescue mode in the current session:
Emergency mode provides the most minimalist environment possible and allows the system to be repaired even in situations where the system is unable to enter rescue mode. In the emergency mode, the system mounts the root file system only for reading. It will not attempt to mount any other local file system, will not activate any network interface, and will start some essential services.
To change the current target and enter emergency mode in the current session:
Shutdown, suspension and hibernation¶
systemctl command replaces a number of power management commands used in previous versions:
|Old command||New command||Description|
||Shuts down the system.|
||Turns off the system.|
||Restarts the system.|
||Suspends the system.|
||Hibernates the system.|
||Hibernates and suspends the system.|
Log files can, in addition to
rsyslogd, also be managed by the
journald daemon which is a component of
journald daemon captures Syslog messages, kernel log messages, messages from the initial RAM disk and from the start of boot, as well as messages written to the standard output and the standard error output of all services, then indexes them and makes them available to the user.
The format of the native log file, which is a structured and indexed binary file, improves searches and allows for faster operation, it also stores metadata information, such as timestamps or user IDs.
journalctl command displays the log files.
The command lists all log files generated on the system. The structure of this output is similar to that used in
/var/log/messages/ but it offers some improvements:
- the priority of entries is marked visually;
- timestamps are converted to the local time zone of your system;
- all logged data is displayed, including rotating logs;
- the beginning of a start is marked with a special line.
Using continuous display¶
With continuous display, log messages are displayed in real time.
This command returns a list of the ten most recent log lines. The journalctl utility then continues to run and waits for new changes to occur before displaying them immediately.
It is possible to use different filtering methods to extract information that fits different needs. Log messages are often used to track erroneous behavior on the system. To view entries with a selected or higher priority:
journalctl -p priority
You must replace priority with one of the following keywords (or a number):
- debug (7),
- info (6),
- notice (5),
- warning (4),
- err (3),
- crit (2),
- alert (1),
- and emerg (0).