Systemd
systemd: Linux的初始化系统。管理Linux 所有初始化进程(process ID 为1)的系统。
- 在server启动时,自动启动一些服务(sshd,firewall)等,
- 在server shutdown时,关闭这些服务。
结构
-
利用linux的crgoups来跟踪任务,当服务停止时,会通过查询cgroups找到所有相关的进程,从而干净的停止服务。
- cgroups : 进程创建子进程时,子进程会继承父进程的cgroups。所以service不管怎么启动新的进程,所有的进程都会属于一个cgroups
-
启动挂载点和自动挂载的管理
-
实现事务性依赖关系管理
unit 单元
系统初始化要做很多事情,systemd把每一步都抽象为一个unit 配置单元,常见的配置单元
- service: 代表一个后台进程。如mysql
- socket: 封装系统和互联网中的一个套接字,systemd支持流式,数据报,连续包的AF_INET,AF_INET6,AF_UNIX socket, 每一个套接字配置单元都有一个对应的service unit,对应的service会在第一个“连接”进入套接字时启动(如nscd.socket 在有新的连接后会启动nscd.service)
- device: 封装一个存在于linux设备树中的设备,每一个使用udev规则标记的设备在systemd中作为一个device unit出现
- target: 此类unit为其他unit进行逻辑分组,他们本身并不做什么,只是引用其他unit。如图形化界面的初始化需要很多unit,讲这些unit的组合组合为一个target。
命令显示units 文件所在的路径。
systemctl show --property=UnitPath
/usr/lib/systemd/system/ 软件包安装的unit /etc/systemd/system/ 系统管理员安装的unit
unit的 依赖关系
systemd解除了大量启动工作的依赖关系,让unit可以并发启动。但有些unit确实存在依赖关系,可以在unit的定义中使用 require 来声明依赖关系。
troubleshooting
# 寻找启动失败的unit
systemctl --state=failed
# 寻找启动失败的unit
journalctl -fp err
#查看unit systemd-modules-load的状态
systemctl status systemd-modules-load
#通过PID 查询错误内容
journalctl -b _PID=15630
debug一个unit。在此unit的配置文件中加
[Service]
Environment=SYSTEMD_LOG_LEVEL=debug