Linux的初始化程序 systemd
▶ Linux 的引导启动过程
▷ GRUB 配置
在 GRUB 配置中,除了指定一个内核之外,还需要指定一个 initrd 选项来指定一个配套的临时的文件系统,也就是初始 raw 磁盘,这样当用户从 GRUB 配置菜单中选择一个内核之后借助初始的 raw 磁盘把引导任务就交给了内核。
这个初始的 raw 磁盘文件是一个文件系统,可以从文件名看出。
[root@server ~]# grubby --info=DEFAULT
--snip--
initrd="/boot/initramfs-5.14.0-427.13.1.el9_4.x86_64.img"
--snip--
[root@server ~]# file /boot/initramfs-5.14.0-427.13.1.el9_4.x86_64.img
/boot/initramfs-5.14.0-427.13.1.el9_4.x86_64.img: ASCII cpio archive (SVR4 with no CRC)
这是一个 cpio 的打包文件,在引导过程中 Linux 会把这个文件加载到内核中,然后Linux 使用里面的硬件驱动程序,这样就启动了第一个进程,现在通常的进程是 systmed 。
▶ Linux 的 systemd
当 systemV 初始化后,会把所有会用到的服务都启动起来,系统需要等到所有的服务都启动之后,才能让用户登陆,这就造成了启动时间长同时也会造成资源的浪费。
systemd 有并行启动的能力,自然启动速度更快,systemd 采用仅可能启动更少的进程,尽可能将进程并行的启动。
systemd 支持之前 SystemV 的脚本兼容性,同时支持按需启动能力,只有当服务需要的时候才会启动服务。
systemd 会根据 /etc/fstab 文件来挂载文件系统,这样就能访问下面的文件了,通过访问 /etc/systmd/system/default.target 文件来决定Linux主机启动到那个目标状态。
如果是桌面系统的话会启动 XWindow 这就会连接到 graphical.target 这样相当于是 systemV 的运行级别 5,对于维护和排错来说会启动到 rescue.target 相当于是运行级别1。
▶ systemd 的基本概念
单元是 systemd 的基本配置单元,用于封装系统服务、监听 socket、设备文件...
| 常见类型 | 介绍 |
|---|---|
| Service | 守护进程及其组成的进程 |
| Socket | 本地或网络套接字 |
| Target | 用与对单元进行分组,或在启动后到达的目标 |
| Device | 使用udev规则的标记的设备 |
| Mount | 文件系统挂载点 |
| Automount | 提供自动挂载功能,用于按需挂载文件系统及并行启动 |
| Timer | 定时器 |
| Swap | 交换分区或文件 |
| Path | 路径 |
系统初始化的时候要做的事情有很多,比如要启动一些服务,也需要做配置工作,这些工作每一个环节都抽象成一个 Unit 配置单元。
列出目前系统所支持的配置单元的类型:
[root@server ~]# systemctl -t help
Available unit types:
service mount swap socket target
device automount timer path slice
scope
每一个配置单元都有一个配置文件
配置文件保存在 /usr/lib/systemd/system
[root@server ~]# ll /usr/lib/systemd/system | wc -l
307
有很多的内容,主要关注的是 Service 和 Target 这两种 Unit。
▷ Target 用于对单元进行分组,或在启动后到达的目标
Target 是把其他服务的单元组成在一起形成一个组。
每个 target 关联多个 systemd 的 Unit,这些单元可能是具体的服务。
[root@server ~]# ls -F /etc/systemd/system/multi-user.target.wants/
auditd.service@ firewalld.service@ NetworkManager.service@ sshd.service@
chronyd.service@ irqbalance.service@ remote-fs.target@ sssd.service@
crond.service@ kdump.service@ rsyslog.service@
在 /etc/systemd/system/multi-user.target.wants/ 就有在最小化的情况下系统会自启动的服务,这里面就有常见的 sshd 服务。
sshd.service@ 这个服务是 sshd.service 的一个符号连接。
[root@server ~]# ls -l /etc/systemd/system/multi-user.target.wants/sshd.service
lrwxrwxrwx. 1 root root 36 Aug 15 09:17 /etc/systemd/system/multi-user.target.wants/sshd.service -> /usr/lib/systemd/system/sshd.service
▷ unit 单元的依赖关系
单元可能依赖与另一个单元,这倒是像安装 RPM 软件包一样。
[root@server ~]# systemctl list-dependencies multi-user.target
--snip--
● │ ├─sockets.target
● │ │ ├─dbus.socket
● │ │ ├─dm-event.socket
● │ │ ├─sssd-kcm.socket
● │ │ ├─systemd-coredump.socket
man bootup

浙公网安备 33010602011771号