网站搜索

“init”和“systemd”背后的故事:为什么在 Linux 中需要用“systemd”替换“init”


我订阅了多个与各种 Linux 发行版和应用程序相关的邮件列表,只是为了让自己随时了解最新动态。有哪些新的错误?发布了哪些补丁?下一个版本的预期是什么?以及很多其他的东西。如今,邮件列表中充满了“在 Linux Divide 上选择你的立场”的内容,主要是 Debian 邮件列表以及其他一些邮件列表。

“在 Linux Divide 上选择你的立场”是什么意思?

在某些 Linux 发行版上,init 守护进程将被替换为守护进程 systemd,而其中许多发行版已经实现了它。这正在/将会在传统的 Unix/Linux Guard 和新的 Linux Guard——程序员和系统管理员之间造成巨大的差距。

在这篇文章中,我们将针对所有疑问一一讨论和解决。

  1. 初始化是什么?
  2. 什么是systemd?
  3. 为什么需要替换init?
  4. systemd 将拥有哪些功能。

里边啥啊?

在Linux中,init是Initialization的缩写。 init 是一个守护进程,它在计算机启动时立即启动,并持续运行直至关闭。事实上 init 是计算机启动时启动的第一个进程,使其直接或间接成为所有其他正在运行的进程的父进程,因此通常为它分配“pid=1”。

如果init守护进程因某种原因无法启动,则不会启动任何进程,系统将进入称为“内核恐慌”的阶段。 init 通常称为System V init。 System V 是第一个设计的商业 UNIX 操作系统,当今大多数 Linux 发行版上的 init 用法与 System V OS 相同,但有一些例外,例如使用 BSD 风格的 Slackware 和使用自定义 init 的 Gentoo 。

长期以来,人们一直认为需要用更完美的东西来替换 init,并且不时开发出几种替代方案,其中一些成为发行版的本机 init 替代品,其中一些是:

  1. Upstart – 在 Ubuntu GNU/Linux 中实现的 init 替换守护进程,旨在异步启动进程。
  2. Epoch – 一个围绕简单性和服务管理构建的 init 替换守护进程,旨在启动单线程进程。
  3. Mudar – 用 Python 编写的 init 替换守护进程,在 Pardus GNU/Linux 上实现,旨在异步启动进程。
  4. systemd – 一个 init 替代守护进程,旨在并行启动进程,在许多标准发行版中实现 - Fedora、OpenSuSE、Arch、RHEL、CentOS 等。

什么是systemd?

systemd 是一个系统管理守护进程,按照 UNIX 约定命名,在守护进程末尾添加“d”。这样,他们就可以很容易地被识别出来。最初它是在 GNU 通用公共许可证下发布的,但现在是在 GNU 宽通用公共许可证下发布的。与 init 类似,systemd 直接或间接是所有其他进程的父进程,并且是引导时启动的第一个进程,因此通常分配一个“pid=1”。

systemd 可能指守护进程周围的所有软件包、实用程序和库。它的设计目的是为了克服 init 的缺点。它本身是一个后台进程,旨在并行启动进程,从而减少启动时间和计算开销。与 init 相比,它还有很多其他功能。

为什么需要替换init?

init 进程是串行启动的,即只有在最后一个任务启动成功并将其加载到内存中后才启动一个任务。这通常会导致启动时间延迟和过长。然而,systemd 的设计目的并不是为了速度,而是为了整齐地完成工作,从而避免所有不必要的延迟。

系统的特点
  1. 简洁、前瞻性和高效的设计。
  2. 更简单的启动过程。
  3. 启动时的并发和并行处理。
  4. 更好的 API。
  5. 简单的单位语法。
  6. 能够删除可选组件。
  7. 内存占用低。
  8. 改进了表达依赖性的技术。
  9. 初始化指令写在配置文件中而不是shell脚本中。
  10. 利用 Unix 域套接字。
  11. 使用 systemd 日历计时器进行作业调度。
  12. 使用journald 记录事件。
  13. 选择使用 systemd 和 syslog 记录系统事件。
  14. 日志存储在二进制文件中。
  15. 可以保留 systemd 状态以供以后调用。
  16. 使用内核的 cgroup 而不是 PID 来跟踪进程。
  17. 用户登录由 systemd-logind 管理。
  18. 与 Gnome 更好地集成以实现互操作性。
系统瓶颈
  1. 一切都在一处。
  2. 不是 POSIX 标准。

Systemd 和发行版集成

Linux Distribution

集成

Fedora

是的,第一个采用 systemd 的发行版

Arch

是的

RedHat

是的

CentOS

是的

Debian

是的,代号 Jessie 的 Debian 8 默认会有 systemd

Gentoo

是的,但需要下载、安装并使用自定义初始化进行配置

OpenSUSE

是的

Slack

否(虽然到目前为止它还没有在 slackware 中被采用,但 Patric Volkerding 没有显示任何迹象表明它是否会被采用)

Ubuntu

是的,需要使用 Upstream 安装和配置。

争议

Linux 内核首席架构师 Linus Torvalds 认为 systemd 的主要开发人员对用户和 bug 报告的态度似乎不太好。据报道,systemd 的理念很奇怪,是一种外国的控制系统进程的方法。 Patric Volkerding 和其他著名的 Linux 用户和开发人员以及在线论坛时不时地记录了同样的情况。

systemd 与 init

Features init systemd
DBus Dependency – Mandatory No Yes
Device based Activation No Yes
Device dependency configuration with udev No Yes
Timer based Activation Cron/at Proprietary
Quota Management No Yes
Automatic Service Dependency Handling No Yes
Kills users Process at logout No Yes
Swap Management No Yes
SELinux integration No Yes
Support for Encrypted HDD No Yes
Static kernle module loading No Yes
GUI No Yes
List all the child processes No Yes
Sysv compatible Yes Yes
Interactive booting No Yes
Portable to non x86 Yes No
Adopted on Several Distro Several Distro
Parallel service startup No Yes
Resource limit per service No Yes
Easy extensible startup script Yes No
Separate Code and Configuration File Yes No
Automatic dependency calculation No Yes
Verbose debug Yes No
Version N/A V44+
Size 560 KB N/A
Number of Files 75 files 900 files + glib + DBus
Lines of code – LOC 15000 (Approx) 224000 (Approx) (inc Codes, comments and white space) 125000 (Approx) (acctual code)

结论

任何以 pid=1 运行的东西都不能中断,不能混乱,并且必须由用户有效且高效地控制。许多用户认为,用 systemd 替换 init 只不过是每次重新发明轮子,这是 Linux 的副作用。但这就是Linux的多样性。这是因为 Linux 太强大了。改变是好事,如果有充分的理由,我们必须感激它。

目前为止就这样了。我将再次在这里发表另一篇你们会喜欢阅读的有趣文章。在此之前请继续关注并连接到 Howtoing。不要忘记在下面的评论中向我们提供您的宝贵反馈。