爱上 systemd

systemd 是所有进程之母,负责将 Linux 主机启动到可以进行高效工作的状态。
393 位读者喜欢这篇文章。
How Linux got to be Linux: Test driving 1993-2003 distros

互联网档案馆图书图片。由 Opensource.com 修改。CC BY-SA 4.0

systemd——是的,全部小写,即使在句子的开头——是 init 和 SystemV init 脚本的现代替代品。 它远不止于此。

像大多数系统管理员一样,当我想到 init 程序和 SystemV 时,我想到的是 Linux 启动和关闭,而不是其他的,例如管理服务,一旦它们启动并运行。 像 init 一样,systemd 是所有进程之母,它负责将 Linux 主机启动到可以进行高效工作的状态。 systemd 承担的一些功能比旧的 init 程序广泛得多,包括管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理计时器以及启动和管理所需的系统服务,以拥有高效的 Linux 主机。

本系列文章部分基于我三卷 Linux 培训课程中的摘录,使用和管理 Linux:从零到系统管理员,探讨了 systemd 在启动时和启动完成后开始的功能。

Linux 启动

Linux 主机从关闭状态变为运行状态的完整过程很复杂,但它是开放且可知的。 在深入了解细节之前,我将从主机硬件开启到系统准备好供用户登录进行快速概述。 大多数时候,“启动过程”被作为一个单一实体来讨论,但这并不准确。 实际上,完整的启动和启动过程分为三个主要部分

  • 硬件启动: 初始化系统硬件
  • Linux 启动: 加载 Linux 内核,然后加载 systemd
  • Linux 启动: systemd 在此处准备主机以进行高效工作

在内核加载 init 或 systemd 后,Linux 启动序列开始,具体取决于发行版使用的是旧的还是新的启动。 init 和 systemd 程序启动并管理所有其他进程,并且都被称为各自系统上的“所有进程之母”。

重要的是将硬件启动与 Linux 启动与 Linux 启动分开,并明确定义它们之间的分界点。 了解这些差异以及每个部分在使 Linux 系统达到可以高效工作的状态中所起的作用,可以管理这些过程并更好地确定在大多数人称为“启动”期间发生问题的位置。

启动过程遵循三步启动过程,并将 Linux 计算机启动到可用于高效工作的运行状态。 当内核将主机控制权交给 systemd 时,启动过程开始。

systemd 争议

systemd 可能会引起系统管理员和其他负责保持 Linux 系统启动和运行的人员的广泛反应。 systemd 正在许多 Linux 系统中接管如此多的任务这一事实,引起了某些开发人员和系统管理员的反击和不和谐。

SystemV 和 systemd 是执行 Linux 启动序列的两种不同方法。 SystemV 启动脚本和 init 程序是旧方法,而使用目标的 systemd 是新方法。 尽管大多数现代 Linux 发行版使用较新的 systemd 进行启动、关闭和进程管理,但仍然有一些发行版没有使用。 其中一个原因是,一些发行版维护者和一些系统管理员更喜欢旧的 SystemV 方法,而不是较新的 systemd。

我认为两者都有优点。

我为什么更喜欢 SystemV

我更喜欢 SystemV,因为它更开放。 启动是使用 Bash 脚本完成的。 在内核启动 init 程序(这是一个编译后的二进制文件)后,init 会启动 rc.sysinit 脚本,该脚本会执行许多系统初始化任务。 在 rc.sysinit 完成后,init 会启动 /etc/rc.d/rc 脚本,该脚本反过来会启动 /etc/rc.d/rcX.d 中 SystemV 启动脚本定义的各种服务,其中“X”是要启动的运行级别数。

除了 init 程序本身之外,所有这些程序都是开放且易于理解的脚本。 可以通读这些脚本并准确了解整个启动过程中发生的事情,但我认为没有多少系统管理员真正这样做。 每个启动脚本都已编号,以便按特定顺序启动其预期的服务。 服务是串行启动的,并且一次只启动一个服务。

systemd 由 Red Hat 的 Lennart Poettering 和 Kay Sievers 开发,是一个复杂的大型编译二进制可执行文件系统,如果没有访问源代码,则无法理解。 它是开源的,因此“访问源代码”并不难,只是不太方便。 systemd 似乎代表着对 Linux 哲学多个原则的重大反驳。 作为二进制文件,systemd 不直接向系统管理员开放以查看或进行轻松更改。 systemd 尝试做所有事情,例如管理正在运行的服务,同时提供比 SystemV 更多的状态信息。 它还管理硬件、进程和进程组、文件系统挂载等等。 systemd 存在于现代 Linux 主机的几乎每个方面,使其成为系统管理的一站式工具。 所有这些都明显违反了程序应该小巧,每个程序都应该做好一件事并且做好这件事的原则。

我为什么更喜欢 systemd

我更喜欢 systemd 作为我的启动机制,因为它会并行启动尽可能多的服务,具体取决于启动过程中的当前阶段。 这加快了整体启动速度,并使主机系统比 SystemV 更快地进入登录屏幕。

systemd 管理着正在运行的 Linux 系统的几乎每个方面。 它可以管理正在运行的服务,同时提供比 SystemV 更多的状态信息。 它还管理硬件、进程和进程组、文件系统挂载等等。 systemd 存在于现代 Linux 操作系统中的几乎每个方面,使其成为系统管理的一站式工具。 (这听起来耳熟吗?)

systemd 工具是编译后的二进制文件,但该工具套件是开放的,因为所有配置文件都是 ASCII 文本文件。 可以通过各种 GUI 和命令行工具修改启动配置,以及添加或修改各种配置文件以满足特定本地计算环境的需求。

真正的问题

你认为我不会同时喜欢这两个启动系统吗? 我喜欢,而且我可以与任何一个一起工作。

我认为,SystemV 和 systemd 之间的大部分争议的真正问题和根本原因是系统管理员级别没有选择。 是否使用 SystemV 或 systemd 的选择已经由各种发行版的开发人员、维护人员和打包人员做出——但这是有充分理由的。 由于 init 系统具有极其侵入性的性质,因此将其挖出和更换会产生很多后果,这些后果很难在发行版设计过程之外解决。

尽管这个选择是为我做的,但我的 Linux 主机启动并运行,这通常是我最关心的。 作为最终用户,甚至作为系统管理员,我最关心的是我是否可以完成我的工作,例如编写我的书和这篇文章、安装更新以及编写脚本来自动化一切。 只要我可以完成我的工作,我就不太关心我的发行版上使用的启动顺序。

当启动或服务管理期间出现问题时,我会关心。 无论主机上使用哪个启动系统,我都了解足够的信息来跟踪事件的顺序,以找到故障并修复它。

替换 SystemV

之前曾尝试用一些更现代的东西来替换 SystemV。 大约两个版本中,Fedora 使用了一个名为 Upstart 的东西来替换老化的 SystemV,但它没有替换 init,也没有提供我注意到的任何更改。 由于 Upstart 没有对 SystemV 周围的问题提供任何重大更改,因此朝这个方向的努力很快就被放弃,转而支持 systemd。

尽管大多数 Linux 开发人员都同意替换旧的 SystemV 启动是个好主意,但许多开发人员和系统管理员不喜欢 systemd。 我不会重新讨论人们对 systemd 存在或曾经存在的所有所谓的问题,而是将您推荐给两篇好的(如果有点旧)文章,这些文章应该涵盖大部分内容。 Linux 内核的创建者 Linus Torvalds 似乎对此不感兴趣。 在 2014 年 ZDNet 的一篇文章中,Linus Torvalds 和其他人谈论 Linux 的 systemd,Linus 清楚地表达了他的感受。

“实际上,我对 systemd 本身没有任何特别强烈的意见。 我对一些核心开发人员存在问题,我认为他们对错误和兼容性过于草率,我认为一些设计细节很疯狂(例如,我不喜欢二进制日志),但这些都是细节,而不是大问题。”

如果您不太了解 Linus,我可以告诉您,如果他不喜欢某些东西,他会非常直言不讳、明确且非常清楚地表达这种不喜欢。 在表达对事物的不喜欢的方式上,他变得更容易被社会接受。

2013 年,Poettering 发表了一篇长篇博文,他在其中驳斥了关于 systemd 的神话,同时深入了解了创建它的一些原因。 这是一篇非常值得一读的文章,我强烈推荐它。

systemd 任务

根据编译过程中使用的选项(本系列文章未考虑),systemd 最多可以有 69 个二进制可执行文件,这些文件执行以下任务等

  • systemd 程序以 PID 1 运行,并尽可能并行地提供尽可能多的服务的系统启动,这作为副作用,加快了整体启动时间。 它还管理关闭序列。
  • systemctl 程序为服务管理提供用户界面。
  • 提供对 SystemV 和 LSB 启动脚本的支持,以实现向后兼容性。
  • 服务管理和报告提供比 SystemV 更多的服务状态数据。
  • 它包括用于基本系统配置的工具,例如主机名、日期、区域设置、已登录用户列表、运行中的容器和虚拟机、系统帐户、运行时目录和设置、管理简单网络配置的守护进程、网络时间同步、日志转发和名称解析。
  • 它提供套接字管理。
  • systemd 定时器提供高级的类似 cron 的功能,包括在相对于系统启动、systemd 启动、定时器上次启动时间等的时间运行脚本。
  • 它提供一个工具来分析定时器规范中使用的日期和时间。
  • 具有分层意识的文件系统的挂载和卸载允许更安全的级联挂载文件系统。
  • 它支持临时文件的积极创建和管理,包括删除。
  • 与 D-Bus 的接口提供了在插入或移除设备时运行脚本的能力。这允许将所有设备(无论是否可插拔)都视为即插即用,从而大大简化了设备处理。
  • 其分析启动序列的工具可用于定位耗时最多的服务。
  • 它包括用于存储系统日志消息的日志以及用于管理日志的工具。

架构

这些任务以及更多任务由许多守护进程、控制程序和配置文件支持。图 1 显示了属于 systemd 的许多组件。这是一个简化的图表,旨在提供一个高级概述,因此它不包括所有单独的程序或文件。它也没有提供对数据流的任何深入了解,因为数据流非常复杂,在本系列文章中进行分析将是毫无用处的。

systemd architecture

图 1:systemd 的架构,作者:Shmuel Csaba Otto Traian (CC BY-SA 3.0)

图 1:systemd 的架构,作者:Shmuel Csaba Otto Traian (CC BY-SA 3.0)

对 systemd 的完整阐述本身就可以写成一本书。您无需了解图 1 中 systemd 组件如何组合在一起的细节;了解使管理各种 Linux 服务以及处理日志文件和日志成为可能的程序和组件就足够了。但很明显,systemd 并不是一些批评者声称的那种庞大的单体怪物。

作为 PID 1 的 systemd

systemd 是 PID 1。它的一些功能(比旧的 SystemV3 init 程序广泛得多)是管理运行中的 Linux 主机的许多方面,包括挂载文件系统以及启动和管理拥有一个生产 Linux 主机所需的系统服务。systemd 的任何与启动序列无关的任务都不在本篇文章的讨论范围内(但有些将在本系列的后续文章中探讨)。

首先,systemd 挂载由 /etc/fstab 定义的文件系统,包括任何交换文件或分区。此时,它可以访问位于 /etc 中的配置文件,包括它自己的。它使用其配置链接 /etc/systemd/system/default.target 来确定应该将主机引导到哪种状态或目标。default.target 文件是指向真实目标文件的符号链接。对于桌面工作站,这通常是 graphical.target,它相当于 SystemV 中的运行级别 5。对于服务器,默认设置更可能是 multi-user.target,它类似于 SystemV 中的运行级别 3。 emergency.target 类似于单用户模式。目标和服务都是 systemd 单元。

下表(图 2)将 systemd 目标与旧的 SystemV 启动运行级别进行了比较。systemd 提供了 systemd 目标别名以实现向后兼容性。目标别名允许脚本以及许多系统管理员使用诸如 init 3 之类的 SystemV 命令来更改运行级别。当然,SystemV 命令被转发到 systemd 进行解释和执行。

systemd 目标 SystemV 运行级别 目标别名 描述
default.target     此目标始终使用指向 multi-user.targetgraphical.target 的符号链接进行别名。systemd 始终使用 default.target 启动系统。default.target 绝不应别名为 halt.targetpoweroff.targetreboot.target
graphical.target 5 runlevel5.target 带有 GUI 的 Multi-user.target
  4 runlevel4.target 未使用。运行级别 4 在 SystemV 世界中与运行级别 3 相同。可以创建和自定义此目标以启动本地服务,而无需更改默认的 multi-user.target
multi-user.target 3 runlevel3.target 所有服务都在运行,但仅限命令行界面 (CLI)
  2 runlevel2.target 多用户,没有 NFS,但所有其他非 GUI 服务都在运行
rescue.target 1 runlevel1.target 一个基本系统,包括挂载文件系统,只运行最基本的服务,并在主控制台上提供一个救援 shell
emergency.target S   单用户模式——没有服务正在运行;文件系统未挂载。这是最基本的操作级别,只有在主控制台上运行的紧急 shell 供用户与系统交互。
halt.target     停止系统而不关闭电源
reboot.target 6 runlevel6.target 重启
poweroff.target 0 runlevel0.target 停止系统并关闭电源

图 2:SystemV 运行级别与 systemd 目标和一些目标别名的比较

每个目标在其配置文件中都有一组依赖项。systemd 启动所需的依赖项,这些依赖项是在特定功能级别运行 Linux 主机所需的服务。当目标配置文件中列出的所有依赖项都已加载并运行时,系统将以该目标级别运行。在图 2 中,功能最多的目标位于表的顶部,而功能则向表的底部递减。

systemd 还会查看旧的 SystemV init 目录,以查看其中是否存在任何启动文件。如果是这样,systemd 会将它们用作配置文件来启动文件描述的服务。已弃用的网络服务就是一个很好的例子,它仍然在 Fedora 中使用 SystemV 启动文件。

下图 3 直接从启动手册页复制而来。它显示了 systemd 启动期间的一般事件序列图以及确保成功启动的基本排序要求。


                                         cryptsetup-pre.target
                                                   |
 (various low-level                                v
     API VFS mounts:                 (various cryptsetup devices...)
  mqueue, configfs,                                |    |
  debugfs, ...)                                    v    |
  |                                  cryptsetup.target  |
  |  (various swap                                 |    |    remote-fs-pre.target
  |   devices...)                                  |    |     |        |
  |    |                                           |    |     |        v
  |    v                       local-fs-pre.target |    |     |  (network file systems)
  |  swap.target                       |           |    v     v                 |
  |    |                               v           |  remote-cryptsetup.target  |
  |    |  (various low-level  (various mounts and  |             |              |
  |    |   services: udevd,    fsck services...)   |             |    remote-fs.target
  |    |   tmpfiles, random            |           |             |             /
  |    |   seed, sysctl, ...)          v           |             |            /
  |    |      |                 local-fs.target    |             |           /
  |    |      |                        |           |             |          /
  \____|______|_______________   ______|___________/             |         /
                              \ /                                |        /
                               v                                 |       /
                        sysinit.target                           |      /
                               |                                 |     /
        ______________________/|\_____________________           |    /
       /              |        |      |               \          |   /
       |              |        |      |               |          |  /
       v              v        |      v               |          | /
  (various       (various      |  (various            |          |/
   timers...)      paths...)   |   sockets...)        |          |
       |              |        |      |               |          |
       v              v        |      v               |          |
 timers.target  paths.target   |  sockets.target      |          |
       |              |        |      |               v          |
       v              \_______ | _____/         rescue.service   |
                              \|/                     |          |
                               v                      v          |
                           basic.target         rescue.target    |
                               |                                 |
                       ________v____________________             |
                      /              |              \            |
                      |              |              |            |
                      v              v              v            |
                  display-    (various system   (various system  |
              manager.service     services        services)      |
                      |         required for        |            |
                      |        graphical UIs)       v            v
                      |              |            multi-user.target
 emergency.service    |              |              |
         |            \_____________ | _____________/
         v                          \|/
 emergency.target                    v
                              graphical.target

图 3:systemd 启动图

sysinit.targetbasic.target 目标可以被认为是启动过程中的检查点。虽然 systemd 的设计目标之一是并行启动系统服务,但某些服务和功能目标必须在其他服务和目标启动之前启动。在满足该检查点所需的所有服务和目标之前,无法通过这些检查点。

当它所依赖的所有单元都完成时,将达到 sysinit.target。所有这些单元(挂载文件系统、设置交换文件、启动 udev、设置随机数生成器种子、启动底层服务以及设置加密服务(如果一个或多个文件系统已加密))都必须完成,但是在 sysinit.target 中,这些任务可以并行执行。

sysinit.target 启动系统基本运行所需的所有底层服务和单元,并且需要启用才能移动到 basic.target

在满足 sysinit.target 之后,systemd 然后启动满足下一个目标所需的所有单元。基本目标通过启动所有后续目标所需的单元来提供一些附加功能。这些包括设置诸如到各种可执行目录的路径、通信套接字和计时器之类的内容。

最后,可以初始化用户级别目标 multi-user.targetgraphical.target。必须先达到 multi-user.target,然后才能满足图形目标依赖项。图 3 中带下划线的目标是通常的启动目标。达到其中一个目标时,启动完成。如果 multi-user.target 是默认值,那么您应该在控制台上看到文本模式登录。如果 graphical.target 是默认值,那么您应该看到图形登录;您看到的特定 GUI 登录屏幕取决于您的默认显示管理器。

启动手册页还描述并提供了引导到初始 RAM 磁盘和 systemd 关闭过程的图。

systemd 还提供了一个工具,用于列出完整启动或指定单元的依赖项。单元是一个可控制的 systemd 资源实体,其范围可以从特定服务(例如 httpd 或 sshd)到计时器、挂载、套接字等等。尝试以下命令并滚动浏览结果。

systemctl list-dependencies graphical.target

请注意,这完全展开了将系统启动到图形目标运行模式所需的顶级目标单元列表。使用 --all 选项也可以展开所有其他单元。

systemctl list-dependencies --all graphical.target

您可以使用 less 命令的搜索工具搜索诸如“target”、“slice”和“socket”之类的字符串。

所以现在,尝试以下操作。

systemctl list-dependencies multi-user.target

systemctl list-dependencies rescue.target

systemctl list-dependencies local-fs.target

systemctl list-dependencies dbus.service

此工具可以帮助我可视化我正在使用的主机的启动依赖项的细节。继续并花一些时间探索您的一个或多个 Linux 主机的启动树。但请小心,因为 systemctl 手册页包含以下注释:

“请注意,此命令仅列出服务管理器当前加载到内存中的单元。特别是,此命令不适合获取特定单元上的所有反向依赖项的完整列表,因为它不会列出当前未加载的单元声明的依赖项。”

最后的想法

即使在深入了解 systemd 之前,也很明显它既强大又复杂。同样明显的是,systemd 不是一个巨大的、单片的和不可知的二进制文件。相反,它由许多较小的组件和子命令组成,这些组件和子命令旨在执行特定任务。

本系列中的下一篇文章将更详细地探讨 systemd 启动,以及 systemd 配置文件、更改默认目标以及如何创建简单的服务单元。

资源

互联网上有很多关于 systemd 的信息,但很多信息简洁、晦涩甚至具有误导性。除了本文中提到的资源外,以下网页还提供了关于 systemd 启动的更详细和可靠的信息。

  • Fedora 项目提供了一个良好且实用的 指南 来了解 systemd。它几乎包含了您需要了解的所有内容,以便使用 systemd 配置、管理和维护 Fedora 计算机。
  • Fedora 项目还有一个不错的速查表,将旧的 SystemV 命令与可比的 systemd 命令进行交叉引用。
  • 有关 systemd 的详细技术信息以及创建原因,请查看 Freedesktop.orgsystemd 描述
  • Linux.com 的 "更多 systemd 乐趣" 提供了更高级的 systemd 信息和技巧

这里还有一系列由 systemd 的设计师和主要开发者 Lennart Poettering 为 Linux 系统管理员编写的深度技术文章。 这些文章写于 2010 年 4 月至 2011 年 9 月之间,但它们与现在一样重要。关于 systemd 及其生态系统的许多其他优秀文章都基于这些论文。

接下来阅读什么
标签
David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演说家。 自 1996 年以来他一直从事 Linux 和开源软件方面的工作,自 1969 年以来一直从事计算机方面的工作。 他是“系统管理员 Linux 哲学”的坚定支持者和传播者。

21 条评论

有用的信息

你没有在 init 系统投票中包含 runit

systemd 的问题与 freedesktop.org 的其他所有东西一样

它假定 Linux 的主要目的是作为桌面 PC 的免费操作系统...

事实并非如此。 Linux 的目的是用于无头服务器、云平台和嵌入式设备...

系统的所谓优势实际上使这些应用程序的情况变得更糟.....

所有这些都是为了基本上无关紧要的用户群体的利益,即非 ChromeOS/Android 桌面用户....

我不太确定我是否同意这一点。 虽然 Linux 是云部署的热门选择,但这可能与其整体受欢迎程度有关。 Linux 对于桌面体验来说非常好(dhcp + 其他最终用户便利),这在一定程度上促进了整体采用; 有组织的 UI 和包管理器将促进整体使用,并希望将这些技能开发和转换为精简的“服务器”或“最小”安装。 有时,采用这些过于复杂的用户中心发行版并将其精简为更安全的服务器部署可能是一个挑战。 此外,与商业 UNIX 和 *BSD 不同,Linux 并不总是在网络、NFS 等领域表现出色。但是,我们仍然喜欢它并寻求改进... 我不确定 systemd 控制一切的方法是否是正确的方向。

回复 作者 Dave Acklam (未验证)

系统,但我一直在抱怨。

很高兴看到。 谢谢

很棒的文章,David。

我每天都在服务器和桌面(以及 SBC)上使用 systemd,但我不得不说,当我回到我自己的机器上时,如果我必须与 init 系统交互,那么要么是 OpenRC,要么是 SysV,这让我松了一口气。

我对 systemd 有很多问题,不仅限于

- 一个漫长的过程,试图发现应用程序无法启动的原因
- 事情突然停止工作,或者应用程序或启动中出现与问题完全无关的巨大延迟。
- 如果你想使用主流发行版,systemd 变成了一个强制依赖项。 这并不意味着它更好,只是集成得太紧密了,别无选择。
- 如上所述,它集成得太紧密了。
- 首席开发人员非常自恋,并且一再表现出对用户担忧或实际使用的完全漠视。
-(现在是个人观点)如果我想在 Linux 中使用 Windows 注册表,我会改用 Windows。
- 深入了解它需要一个陡峭的学习曲线。 不幸的是,一旦你遇到你的第一个错误,就需要深度。

引导时间似乎只是 systemd 游说工具,当时他们试图将其推入发行版。 systemd 仍然感觉像是一个超级复杂的解决方案,解决了一个并不完全很大的问题。

我通常会同意你的观点。 任何使用 AIX 或 FreeBSD 的人都会看到启动过程是多么简单,从而使其在需要时更容易维护和扩展。

存在使事情过度复杂化和不必要复杂化的事情。 查看 AT&T SysV 的最新版本,了解诸如字符设备、网络配置和服务管理之类的东西,以了解大量基本上未使用且从未移植到其他 UNIX falvors 的复杂性

回复 作者 Adam N (未验证)

哇,你真的说到了点子上。 您可能会发现我自己在 systemd 方面的经验,突出了您如此简洁地表达的很多内容。

我将 systemd 和 Windows 注册表归类为一个我们过去工作时常用的通用术语 - 我会称它们为“精彩” - 而这并不是一个积极的属性。 它是带着完全的鄙视使用的。

回复 作者 Adam N (未验证)

Microsoft Azure Cloud-Init 也从列表中消失了!

我对 systemd 最大的问题是它被设计成一个像 inetd 这样的超级守护程序。 尤其是当您考虑到 NetBSD 团队放弃了 inetd 和 xinetd,因为它们在概念上是不安全的并且无法保护。

最终用户,而不是系统管理员。 看起来像是老前辈,而不是冒险家。
老前辈喜欢繁琐的 CLI、RTFM、非专业人士和非外国人。
冒险家喜欢 GUI、信任上游支持和探索新世界。

在计算机世界中,我们对 Xerox 的 WIMP、彩色和动态模拟显示器取代单色字母数字显示器、一体式微型计算机取代以前的计算机、各种手持计算机以及最终使先前的计算机“专家”蒙羞的意外的新“专家”都有类似的敌意。

人类学工具的这种“进化”已经得到充分的研究和预测。 最终,“systemd”和“Linux 基金会”的运作都将被淹没(轻视)到任何取代这两个团体的总括组织中。

苹果公司转向了基于 Unix 的操作系统。 最终,微软也应该这样做。 如果开放创新网络 (OIN) 现在可以使用 90,000 项微软版权和专利,这将使微软更快地效仿苹果,转向合理的类 Unix 系统。

如果微软越来越接近 Linux,并且当微软越来越接近 Linux 时,人们可能会忘记对“systemd”的这种怀疑和敌意。 也许俄罗斯黑手党或其他共产主义者已经在“systemd”中播下了他们的种子? The_Donald 应该很快就会告诉我们。

仅供参考,虽然 MacOS 使用微内核架构,并且通常基于 *BSD,但他们正在努力更改和隐藏其 UNIX 基础。 查看最新版本,了解诸如 root 无法执行某些操作、隐藏和删除传统用户管理概念(/etc/passwd 等)之类的东西。 我仍然大量使用 MacOS 进行日常工作,并且总体上喜欢他们对 UI 所做的工作,并且严重依赖终端/ssh 和内置 shell/语言 - 但它肯定正在远离和隐藏 Unix 系统的样子,开始不鼓励多个用户和非 UI 管理的概念。

回复 作者 Greg Zeng

Solaris 有 SMF。 现有的 SysV 仍然有效。 SMF 使用 XML 文件来执行依赖项、并行性。

systemd 在开始时比 SMF 运行得更好。 SMF 花了 3-4 个版本才能变得可靠。

systemd 在兼容性方面做得不好。 例如,rc.local 仍然存在,但间歇性地触发或不触发。 将 rc.local 过渡到 systemd 原生比 SMF 容易得多。

service xyz status exited with $? 以前成功时为 == 0,之后为 3。 我所有的 shell 脚本都需要更改为 systemctl status xyz 才能获得可靠的退出代码。

systemd 似乎正在捕获日志文件,而不是将它们放在 /var/log 中。 这将是另一个使现有工具过时的过渡。

总的来说,我通常喜欢 systemd 并接受痛点。

因此,我是一个对 SysV init 感到满意的老前辈,并且从未真正设法找到以有意义的方式完全详细说明 systemd 如何工作的文档。 看起来你的文章系列将帮助我解决这个问题。 我读到 systemd 配置链接是 /etc/systemd/system/default 时,我的希望破灭了。 我的系统肯定运行 systemd,但它没有这样的文件。 这个系列涵盖的是什么发行版/版本? 我猜它是某个版本的 Fedora/RHEL,但不确定。 以防你想知道,我运行的发行版/版本仍然获得安全更新,所以它并不像那么旧。 许多发行版从根本上改变了这样的事情,或者如此核心的东西改变了吗
在过去 2 年左右的时间里,systemd 实际上发生了变化? 无论如何,您应该在本系列的每个页面上突出显示您实际记录的 systemd 版本,以便通过 Google 到达此处的人们知道这不适合他们。

还有一件事,您对启动过程的描述遗漏了一个潜在的重要步骤:加载/运行初始 ramdisk。我必须承认我有一段时间没有关注它了,但我的系统仍然使用它,而且它已经变得非常复杂。在这种情况下,没有必要做更多的解释,但如果能提到它就更好了。

上面的 Adam N 一语中的,但无论如何我还是想补充一下我的经验。

看看为了尝试解释 systemd 需要多少材料。我可以,而且确实在一次 4 小时的晚上大学课堂中教授了基于 SystemV 的 Linux 启动过程 - 包括 2 小时的实验时间。 systemd 是我们 IT 部门过去称之为“wonderful”的东西,但这并不是一个好的描述。看看本文中的复杂图表。

我对 systemd 的爱恨交织的关系发生在几年前我对我的实验性 Ubuntu 桌面进行就地升级时。它间歇性地无法在 systemd 下正确启动(并且仍然如此)。甚至没有人能帮助我尝试弄清楚发生了什么。当我将其报告为 systemd 问题时,得到的回复是我升级的发行版太旧了,我应该重新安装。我花了几个小时试图理解发生了什么以及为什么会失败。最终放弃了。

我在 IT 行业工作了 36 年:从第六版 UNIX 开始,多年来一直支持 UNIX 工作站,将“C”引入了我们的主机环境,早在 1999 年就在我的 PC 上安装了 RedHat 5.2,在当地技术学院教授了大约 3 年的 Linux 课程,将 Linux 引入了我们的州政府机构,并且仅仅为了各种项目的乐趣学习了 C、C++、C#、Perl、Python、PHP 等等。我并不回避新事物,但 systemd 的体验太糟糕了,那个桌面直接被关掉了。我自从至少 2 年没用过它了。

我的旧桌面上有专门的扫描仪软件(源代码修改)以使旧的 SCSI Ricoh 扫描仪正常运行。我解决该问题的方案是找到一台更新的扫描仪。这一切都是因为一个棘手的软件叫做 systemd。我仍然有一个 Linux 防火墙和一台运行我的气象站的 Linux 机器,但是这些都是更简单的启动设置,只需要一天的时间就可以重新安装。

真正让我对 systemd 不满的是我在其他开源组织中看到的东西。 Ubuntu(现在使用 systemd)、KiCAD、MySQL、Folding@Home、WordPress -- 我都在使用它们。当我报告问题时,我在所有这些方面都有 *糟糕* 的支持体验。存在一种 *傲慢*,如果你没有完全沉浸在他们热爱的任何软件中,他们就不会关心你遇到的问题。要么解决方案对他们来说太明显了,他们认为你是个白痴,要么它足够复杂,以至于找到解决方案不是一个“快速修复”。

唉。

Systemd,但不是我的选择。如果可行的话,我宁愿回到 BSD 或 SysV 风格的 initscripts。从那时起,用 OpenRC 进行改造会破坏东西。

很棒的文章! 非常完整。我制作了一个非常好的包装器,可以帮助您非常轻松地将东西作为服务/单元运行: https://github.com/kootenpv/sysdm

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.