初识 systemd

init 系统能够定义、管理和控制 init 进程的行为。它负责组织和运行许多独立的或相关的初始化工作(因此被称为 init 系统),从而让计算机系统进入某种用户预定义的运行模式,比如命令行模式或图形界面模式 。

upstart -> systemd。虽然本文的目的是要介绍 systemd,但是笔者觉得如果能从历史发展的角度观察 init 系统的演进,将会帮助我们更好的理解、使用 systemd。

是第一个被广泛应用的新一代 init 系统。

在感知到该事件之后触发相应的等待任务,比如处理 /etc/fstab 中存在的挂载点。采用这种事件驱动的模式,upstart 完美地解决了即插即用设备带来的新问题。采用事件驱动机制也带来了一些其它有益的变化,比如加快了系统启动时间。sysvinit 运行时是同步阻塞的。一个脚本运行的时候,后续脚本必须等待。这意味着所有的初始化步骤都是串行执行的,而实际上很多服务彼此并不相关,完全可以并行启动,从而减小系统的启动时间。

的特点解决了之前提到的 sysvinit 的缺点。采用事件驱动模型的 可以:

可以很好地应用在桌面或者便携式系统中,处理这些系统中的动态硬件插拔特性。

更激进的并行启动能力,采用了 socket / D-Bus activation 等技术启动服务。一个显而易见的结果就是:更快的启动速度。为了减少系统启动时间,systemd 的目标是:

也试图实现这两个目标。下图展示了 相对于 sysvinit 在并发启动这个方面的改进(此图来自互联网):

中,有依赖关系的服务还是必须先后启动。比如任务 A,B,(C,D)因为存在依赖关系,所以在这个局部,还是串行执行。

认为存在相互依赖而必须串行的服务,比如 Avahi 和 D-Bus 也可以并发启动。从而实现如下图所示的并发启动过程(此图来自互联网):

更进一步提高了并行启动能力,极大地加速了系统启动时间。

,systemd 可以确保找到所有的相关进程,从而干净地停止服务。已经出现了很久,它主要用来实现系统资源配额管理。提供了类似文件系统的接口,使用方便。当进程创建子进程时,子进程会继承父进程的 。因此无论服务如何启动新的子进程,所有的这些相关进程都会属于同一个 ,systemd 只需要简单地遍历指定的 即可正确地找到所有的相关进程,将它们一一停止即可。

systemd journal 的优点如下:简单性:代码少,依赖少,抽象开销最小。零维护:日志是除错和监控系统的核心功能,因此它自己不能再产生问题。举例说,自动管理磁盘空间,避免由于日志的不断产生而将磁盘空间耗尽。移植性:日志文件应该在所有类型的 Linux 系统上可用,无论它使用的何种 CPU 或者字节序。性能:添加和浏览日志非常快。最小资源占用:日志数据文件需要较小。统一化:各种不同的日志存储技术应该统一起来,将所有的可记录事件保存在同一个数据存储中。所以日志内容的全局上下文都会被保存并且可供日后查询。例如一条固件记录后通常会跟随一条内核记录,最终还会有一条用户态记录。重要的是当保存到硬盘上时这三者之间的关系不会丢失。syslog 将不同的信息保存到不同的文件中,分析的时候很难确定哪些条目是相关的。扩展性:日志的适用范围很广,从嵌入式设备到超级计算机集群都可以满足需求。安全性:日志文件是可以验证的,让无法检测的修改不再可能。

系统初始化需要做的事情非常多。需要启动后台服务,比如启动 ssh 服务;需要做配置工作,比如挂载文件系统。这个过程中的每一步都被 systemd 抽象为一个配置单元,即 unit。可以认为一个服务是一个配置单元,一个挂载点是一个配置单元,一个交换分区的配置是一个配置单元等等。systemd 将配置单元归纳为以下一些不同的类型。然而,systemd 正在快速发展,新功能不断增加。所以配置单元类型可能在不久的将来继续增加。下面是一些常见的 unit 类型:

service :代表一个后台服务进程,比如 mysqld。这是最常用的一类。socket :此类配置单元封装系统和互联网中的一个套接字 。当下,systemd 支持流式、数据报和连续包的 AF_INET、AF_INET6、AF_UNIX socket 。每一个套接字配置单元都有一个相应的服务配置单元 。相应的服务在第一个"连接"进入套接字时就会启动(例如:nscd.socket 在有新连接后便启动 nscd.service)。device :此类配置单元封装一个存在于 Linux 设备树中的设备。每一个使用 udev 规则标记的设备都将会在 systemd 中作为一个设备配置单元出现。mount :此类配置单元封装文件系统结构层次中的一个挂载点。Systemd 将对这个挂载点进行监控和管理。比如可以在启动时自动将其挂载;可以在某些条件下自动卸载。Systemd 会将 /etc/fstab 中的条目都转换为挂载点,并在开机时处理。automount :此类配置单元封装系统结构层次中的一个自挂载点。每一个自挂载配置单元对应一个挂载配置单元 ,当该自动挂载点被访问时,systemd 执行挂载点中定义的挂载行为。swap:和挂载配置单元类似,交换配置单元用来管理交换分区。用户可以用交换配置单元来定义系统中的交换分区,可以让这些交换分区在启动时被激活。target :此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已。这样便可以对配置单元做一个统一的控制。这样就可以实现大家都已经非常熟悉的运行级别概念。比如想让系统进入图形化模式,需要运行许多服务和配置命令,这些操作都由一个个的配置单元表示,将所有这些配置单元组合为一个目标(target),就表示需要将这些配置单元全部执行一遍以便进入目标所代表的系统运行状态。 (例如:multi-user.target 相当于在传统使用 SysV 的系统中运行级别 5)timer:定时器配置单元用来定时触发用户定义的操作,这类配置单元取代了 atd、crond 等传统的定时服务。snapshot :与 target 配置单元相似,快照是一组配置单元。它保存了系统当前的运行状态。path:文件系统中的一个文件或目录。scope:用于 cgroups,表示从 systemd 外部创建的进程。slice:用于 cgroups,表示一组按层级排列的单位。slice 并不包含进程,但会组建一个层级,并将 scope 和 service 都放置其中。

"套接字激活"(socket activation)、D-Bus activation 和 autofs 三大方法来解除依赖。比如:挂载必须等待挂载点在文件系统中被创建;挂载也必须等待相应的物理设备就绪。为了解决这类依赖问题,systemd 的配置单元之间可以彼此定义依赖关系。Systemd 用配置单元定义文件中的关键字来描述配置单元之间的依赖关系。比如:unit A 依赖 unit B,可以在 unit B 的定义中用"require A"来表示。这样 systemd 就会保证先启动 A 再启动 B。

</tr>
<tr>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">0</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">poweroff.target</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">关闭系统。</td>

</tr>
<tr>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">1,s,single</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">rescue.target</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">单用户模式。</td>

</tr>
<tr>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">2,4 </td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">multi-user.target</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">用户定义/域特定运行级别。默认等同于 3。</td>

</tr>
<tr>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">3 </td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">multi-user.target </td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">多用户,非图形化。用户可以通过多个控制台或网络登录。</td>

</tr>
<tr>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">5</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">graphical.target</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">多用户,图形化。通常为所有运行级别 3 的服务外加图形化登录。</td>

</tr>
<tr>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">6</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">reboot.target </td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">重启。</td>

</tr>
<tr>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">emergency</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">emergency.target</td>
<td><span style="font-family: Microsoft YaHei; font-size: 14px">紧急 Shell。</td>

</tr>

相关文章

LinuxSystemd服务(2021.07.09)目录LinuxSystemd服务(2021.07...
opidrvabortingprocessM002ospid(3561)asaresultofORA-600OR...
安装好haproxy后,配置正确无法启动,看日志:Feb1309:32:50clu...
Linux 系统与服务管理工具Systemd被曝存在3大漏洞,影响几乎...
一、systemd查看日志文件有隐藏 systemctlstatusSERVICE-l-...
不要在mp目录下保存文件,该目录会定期清理文件mp默认保存10...