TrumanWong

systemd简介与特点

TrumanWong
8/7/2023

systemd简介

systemd是一个系统和服务管理器,它的主进程的默认进程ID是1。systemd 主进程是系统所有进程的起点。Linux系统在完成内核引导以后就开始运行systemd程序。systemd的主要功能包括:

  • 在启动过程中并行启动系统服务
  • 按需激活守护进程
  • 基于依赖项的服务控制逻辑

systemd特点

按需启动

System V系统中,系统服务被赋予了不同的优先级。系统启动时,System V的主进程init会按优先级依次启动服务,即按优先级排序,优先级高的先启动,启动完成后再启动优先级较低的服务。System V的启动过程类似于串行队列处理系统,排在队伍前面的先启动,前面的启动完成再启动后面的服务。这样做的好处是能解决服务之间的依赖性问题,例如需要使用网络的服务必须等待网络启动后才能启动。坏处是服务总是排队处理,效率太低。

System V的另一个问题是,启动系统时会将可能用到的所有服务都启动。有些服务可能从未使用过,例如打印服务CUPS、蓝牙服务Bluetooth等,这些服务虽未被使用过,但却一直运行在系统中消耗着系统资源。

为了解决这些问题,systemd采取了两项技术:

  1. 引入了并行启动的概念,为每一个需要启动的守护进程建立一个套接字,这些套接字对于使用它们的进程来说是抽象的,这样它们可以允许不同守护进程之间进行交互。所有服务都尽可能地并行启动,使用缓冲池的方式解决服务的依赖性,同时还尽可能启动更少的进程,进一步提高启动速度。
  2. 使用按需启动技术,只有服务在被请求时才会启动服务,当请求结束,服务会被关闭,以此方式来节约系统资源。

采用Linux的Cgroup特性跟踪和管理进程的生命周期

System Vinit进程不仅需要启动服务,还要能跟踪和管理服务进程的生命周期,这项工作非常有难度。服务进程通常在后台运行,有时服务进程会多次派生,其难度在于要准确获得派生进程的PID才能完整关闭服务。

CgroupLinux内核的特性,主要用来实现系统资源配额管理。当进程创建子进程时,子进程会自动继承父进程的Cgroup。因此无论进程如何派生子进程,它们的Cgroup都是一样的。systemd正是利用了Linux内核的Cgroup特性来跟踪进程的,当服务停止后,systemd只需要遍历查询指定的Cgroup,就可以找到所有子进程,然后一一结束即可。

日志服务

systemd还针对性地重新设计了系统的日志服务journald,其主要是针对正在使用的syslog的一些缺点。syslog的缺点主要存在两方面:其一是日志不安全,进程在产生日志消息时,消息的内容均由进程自主产生,任何进程都可以互相冒充,因为syslog并不会验证消息的来源是否属实;其二是日志消息没有严格的格式,这使得自动化处理日志变得困难、低效。

journald进行了重新设计,不再使用文本格式存放日志,而使用二进制文件存放日志;同时还有可移植性高、资源消耗少、结构简单、可扩展、安全性高等优点。

单元类型

systemd配置文件被称为单元,根据类型不同,以不同的扩展名结尾。系统初始化需要做的事情非常多,需要启动后台服务,比如启动sshd服务;需要做配置工作,比如挂载文件系统。这个过程中的每一步都被systemd抽象为一个配置单元,即单元unit。可以认为一个服务是一个配置单元;一个挂载点是一个配置单元;一个交换分区的配置是一个配置单元。systemd将配置单元归纳为一些不同的类型。

systemd中,服务、设备、挂载等资源统一被称为单元,所以systemd中有许多单元类型。服务单元文件的扩展名是.service,同Shell脚本的功能相似。

systemd单元文件放置位置有以下路径:

  • /usr/lib/systemd/system:与安装的 RPM 软件包一起分发的 systemd 单元文件。
  • /run/systemd/system:在运行时创建的 systemd 单元文件。该目录优先于安装了的服务单元文件的目录。
  • /etc/systemd/system:使用 systemctl enable 命令创建的 systemd 单元文件,以及为扩展服务添加的单元文件。这个目录优先于带有运行时单元文件的目录。

常见的单元类型及作用如下:

  • device:管理硬件设备及其可用性,例如网卡、终端等。
  • mount:处理文件系统挂载,systemd将会自动对此挂载点进行监控和管理。通常此类挂载点都是systemd通过检测/etc/fstab文件后自动配置的。
  • automount:自动挂载点,通常每一个单元对应一个配置单元。当挂载点被访问时,systemd自动执行挂载行为。
  • swap:管理交换分区的挂载。
  • service:控制和管理单个系统服务,如nginxmysqld等。
  • socket:此类配置单元用来封装一个系统和服务的套接字,当连接到来时,systemd会启动与此套接字对应的服务。
  • target:表示定义系统状态的一组单元,便于对单元进行统一的控制。例如,每一个运行级别都是一个target分组单元,包含了进入该级别需要运行的单元。
  • timer:调度任务以特定间隔运行,可用来替代cronat计划任务。
  • snapshot:可用于临时保存systemd单元集的状态,稍后可通过激活已保存的快照单元来恢复该状态。

查看所有可用的单元类型

# systemctl -t help