Linux系统init程序之systemd(1):基本概念
前言
systemd是现代Linux系统广泛采用的系统配置和服务管理程序,通常作为init进程(PID=1)运行,并执行系统的初始化任务。系统中大部分的服务程序都由systemd在系统启动过程中按照特定的顺序和依赖拉起,并且systemd提供了一系列工具如systemctl、journalctl等来对系统中的各种服务进行配置和管理。
Unit(单元)
为了管理系统的各种资源,systemd将各种系统启动及运行相关的对象,如系统服务、网络配置、设备挂载以及定时任务等,统一抽象程各种不同类型的unit,并且对于不同unit间允许配置依赖关系。在系统启动过程中,systemd会尝试并行启动所有配置的unit,对于配置了依赖关系的unit,systemd保证它们的启动顺序。
单元通常以配置文件的形式存放在系统特定的目录下,不同类型单元的配置文件其文件扩展名也不相同。以centos 8系统为例,查看系统目录下的单元文件:
单元类型
systemd共支持12种单元类型,对于不同的Unit类型,其表示的意义如下表所示:
单元类型 | 作用 |
---|---|
service单元 | 用于定义系统服务,如各种后台服务进程 |
target单元 | 用于将多个单元在逻辑上组合在一起,可模拟实现“运行级别” |
device单元 | 用于封装一个设备文件,可用于基于设备的启动。 |
mount单元 | 用于封装一个文件系统挂载点 |
automount单元 | 用于封装一个文件系统自动挂载点,即访问时进行挂载 |
swap单元 | 用于封装一个交换分区或交换文件 |
path单元 | 用于根据文件系统上特定对象的变化来启动其它服务 |
socet单元 | 用于封装一个套接字(UNIX/INET)或者管道(FIFO) |
timer单元 | 用于封装一个基于时间触发的动作。它取代了传统的atd, crond等任务计划服务 |
slice单元 | 用于控制特定CGroup内(例如一组service与scope单元)所有进程的总体资源占用 |
scope单元 | 与service单元类似,但是由systemd根据D-bus接口接收到的信息自动创建,可用于管理外部创建的进程 |
单元存放目录
systemd将所有unit文件放置在指定的系统目录当中,并且对于不同的目录具有不同的优先级,按照优先级高低的顺序排列如下:
- /etc/systemd/system:系统或用户自定义的配置文件
- /run/systemd/system:软件运行时生成的配置文件
- /usr/lib/systemd/system:系统或第三方软件安装时添加的配置文件
systemd默认从/etc/system/system目录下读取unit配置文件,但实际上该目录下存放的基本是软链接,真正的unit配置文件存放在/usr/lib/system/system目录下。
Target(目标)
target是unit的一种,封装了一个由 systemd 管理的启动目标, 用于在启动过程中将一组单元汇聚到一个众所周知的同步点,便于系统启动阶段的控制。
默认启动目标
系统启动时,默认使用目标default.target
,通常情况下是链接到multi-user.target
(对于支持图形的系统,则是graphical.target
。使用systemctl工具可以查看当前的默认启动目标:
Aspiresky ~ # systemctl get-default
graphical.target
systemd支持更改当前默认启动目标:
Aspiresky ~ # systemctl set-default multi-user.target
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.
默认目标顺序
systemd使用下面的顺序来确定要启动的default.target
:
- 通过内核参数
systemd.unit=
指定 - 使用
/etc/systemd/system/default.target
软链接指向的目标 - 使用
/usr/lib/systemd/system/default.target
软链接指向的目标
“SysV 运行级别” 与 “systemd 目标” 对照表
sysvinit机制提供了运行级别,但是在systemd中已经去除了这样的概念。为了与sysvinit兼容,systemd可以使用target来模拟“运行级别”,并支持使用旧有的telinit命令进行切换。
SysV运行级别 | Systemd目标 | 注释 |
---|---|---|
0 | runlevel0.target, poweroff.target | 中断系统(halt) |
1, s, single | runlevel1.target, rescue.target | 单用户模式 |
2, 4 | runlevel2.target, runlevel4.target, multi-user.target | 用户自定义运行级别,通常识别为级别3 |
3 | runlevel3.target, multi-user.target | 多用户,无图形界面。用户可以通过终端或网络登录 |
5 | runlevel5.target, graphical.target | 多用户,图形界面。继承级别3的服务,并启动图形界面服务 |
6 | runlevel6.target, ****reboot.target | 重启 |
emergency | emergency.target | 紧急模式(Emergency shell) |
内核引导选项
当作为init进程运行时,systemd可以支持内核引导选项用以定制化systemd的行为,一些常用的引导选项如下:
- system.unit=, rd.systemd.unit=:设置系统默认启动的目标,缺省配置为default.target。这里带有"rd."前缀的选项用于"initramfs"环境,无前缀的选项则用于常规环境
- systemd.dump_core:该选项用于指示systemd在崩溃时,进行内存转储
- systemd.crash_shell:该选项用于指示systemd在崩溃后启动一个shell
- quiet:关闭启动过程中的状态输出。注意,内核支持相同的选项,并用于禁止内核的调试输出
- debug:开启启动过程中的调试输出。注意,内核支持相同的选项,并用于开启内核的调试输出
相关参考
- 《Arch Linux WIKI》
- 《systemd - Linux man pages》