写在前面:
博客书写牢记5W1H法则:What,Why,When,Where,Who,How。
本篇主要内容:
● Systemd新特征
● Systemd核心概念:unit
unit常见类型
systemd关键特征
管理target units
unit文件格式
● systemd配置文件读取顺序
开机流程
开机自启脚本配置
Systemd新特征:
系统引导时实现服务并行启动;
按需激活进程;
系统状态快照;
基于依赖关系定义服务控制逻辑;
核心概念:unit
unit由其相关配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听socket、保存的快照以及其他与init相关的信息;
这些配置文件主要保存在:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
unit常见类型:
Service unit:文件扩展名为.service,用于定义系统服务;
Target unit:文件扩展名为.target,用于模拟实现“运行级别”;
Device unit: .device,用于定义内核识别的设备;
Mount unit: .mount,定义文件系统挂载点;
Socket unit: .socket,用于标识进程间通信用到的socket文件;
Snapshot unit: .snapshot, 管理系统快照;
Swap unit: .swap, 用于标识swap设备;
Automount unit: .automount,文件系统自动点设备;
Path unit: .path, 用于定义文件系统中的一文件或目录;
关键特性:
基于socket的激活机制:socket与程序分离;
基于bus的激活机制;
基于device的激活机制;
基于Path的激活机制;
系统快照:保存各unit的当前状态信息于持久存储设备中;
向后兼容sysv init脚本;
/etc/init.d/
不兼容部分:
systemctl的命令是固定不变的;不像service启动的服务脚本一样可以直接修改/etc/rc.d/rc.sysinit目录中脚本文件,自定义脚本命令。
非由systemd启动的服务,systemctl无法与之通信;不支持自定义程序交给systemd管理。
管理系统服务:
即借助.service类型的unit文件管理服务。
systemctl
Control the systemd system and service manager
systemctl [OPTIONS...] COMMAND [NAME...]
服务状态修改与状态查询:
systemctl start|stop|restart|status|try-restart|reload-restart|reload-or-try-restart NAME.service
服务当前激活状态:
systemctl is-active NAME.service
列出所有激活状态的服务:
systemctl list-units --type service
列出所有服务(已激活及未激活):
systemctl list-units -t service all
设置/取消/查看开机自启:
systemctl enable|disable|is-enable NAME.service
(无非就是在/etc/systemd/system/xx.target.wants/目录中建立或删除服务链接而已)
禁止/不禁止设置为开机自启:
systemctl mask|unmask NAME.service
查看服务依赖关系:
systemctl list-dependencies NAME.service
管理target units:
运行级别对照:
0 --> runlevel0.target, poweroff.target
1 --> runlevel1.target, rescue.target
2|3|4 --> runlevel2|3|4.target, multi-user.target
5 --> runlevel5.target, graphical.target
6 --> runlevel6.target, reboot.target
切换运行级别:
systemctl isolate NAME.target
查看运行级别:
systemctl list-units --type target
查看所有运行级别:
systemctl list-units -t target -a
获取/设置默认运行级别:
systemctl get-default NAME.target
systemctl set-default NAME.target
切换至紧急救援模式:
systemctl rescue
切换至emergency模式:
systemctl emergency
其他常用命令 :
systemctl halt|poweroff|reboot
systemctl suspend 挂起
systemctl hibernate 快照
systemctl hubrid-sleep
unit文件格式:
unit文件通常是由3部分组成的:
[Unit]:
定义与Unit类型无关的通用选项,用于提供unit的描述信息、unit行为及依赖关系等;
[Service]:
与特定类型相关的专用选项,此处为service类型。
[Install]:
定义由"systemctl enable|disable"命令在实现服务启动或禁用时用到的一些选项。
Unit段常用选项:
Description:描述信息; 意义性描述;
After:定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;
Requies:依赖到的其它units;强依赖,被依赖的units无法激活时,当前unit即无法激活;
Wants:依赖到的其它units;弱依赖;
Conflicts:定义units间的冲突关系
Service段的常用选项:
Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型;
类型:
simple:
forking:
oneshot:
dbus:
notify:
idle:
EnvironmentFile:环境配置文件;
ExecStart:指明启动unit要运行命令或脚本; ExecStartPre, ExecStartPost
ExecStop:指明停止unit要运行的命令或脚本;
Restart:
Install段的常用选项:
Alias:
RequiredBy:被哪些units所依赖;
WantedBy:被哪些units所依赖;
注意:对于新创建的unit文件或,修改了的unit文件,要通知systemd重载此配置文件:
# systemctl daemon-reload
systemd方式配置文件读取顺序:
(1)systemd启动后首先读取/etc/systemd/system/default.target文件,取得默认启动级别
(2)/etc/systemd/system/xx.target.wants/ 用户设定加载的unit
/usr/lib/systemd/system/xx.target.wants/ 系统默认加载的unit
(3)/usr/lib/systemd/system/xx.target根据文件内的定义,获取到启动xx.target需要依赖的其他服务。然后通过其他服务的对应文件,查找其他服务依赖的下一级服务,直到全部启动。(使用systemctl list-dependencies xx.target查看)
systemd开机流程大概是这样:
(通过观察systemctl list-dependencies xx.target总结得到)
a. local-fs.target + swap.target:这两个target主要在挂载本机/etc/fstab里面所规范的文件系统与相关的内存置换空间。
b. sysinit.target:这个target主要在侦测硬件,加载所需要的核心模块等动作。
c. basic.target:加载主要的外围硬件驱动程序与防火墙相关任务。
d. muli-user-target:底下的其它一般系统或网络服务加载。
e. 图形界面相关服务。如gdm.service等 相关服务的加载。
systemd下的自启动脚本配置:
默认情况下使用systemd的centos7系统上的/etc/rc.d/rc.local文件是没有执行权限的,所以,如果需要使用兼容老版本的方式继续依靠rc.local文件开机启动某程序或脚本,需要先赋予rc.local文件x权限。
systemd更建议用户在/etc/systemd/system/目录中创建启动脚本配置文件(unit文件),然后还用systemctl命令来管理开机启动。