‘init’ 和 ‘systemd’ 背后的故事:为什么 Linux 中需要用 ‘systemd’ 替换 ‘init’
我订阅了多个与各种 Linux 发行版和应用程序相关的邮件列表,以便随时了解最新情况。有哪些新错误?发布了哪些补丁?下一版本中预期会有什么?以及一大堆其他内容。这些天来,邮件列表中充斥着大量“在 Linux Divide 上选择你的立场”的内容,主要是 Debian 邮件列表,还有一些其他邮件列表。
“在 Linux Divide 上选择你的立场” 到底是什么?
一些 Linux发行版将用守护进程systemd取代init守护进程,而许多发行版已经实现了该功能。这将在传统 Unix/Linux Guard 和新 Linux Guard(程序员和系统管理员)之间造成巨大差距。
在本文中,我们将逐一讨论并解决以下所有问题。
- 什么是 init?
- 什么是 systemd?
- 为什么需要替换 init?
- systemd 将拥有哪些功能。
什么是 init?
在 Linux 中,init是初始化的缩写。init是一个守护进程,它在计算机启动时立即启动并持续运行直到计算机关闭。事实上, init是计算机启动时启动的第一个进程,使其成为所有其他正在运行的进程的父进程,直接或间接地,因此通常为其分配“ pid=1 ”。
如果init守护进程因某种原因无法启动,则不会启动任何进程,系统将进入称为“ Kernel Panic ”的阶段。 init 通常被称为System V init。 System V 是第一个设计的商业 UNIX 操作系统,当今大多数 Linux 发行版上 init 的使用与System V OS相同,只有少数例外,例如 Slackware 使用 BSD 风格,Gentoo 使用自定义 init。
人们很早就感觉到需要用更完美的东西来替换 init,并不时地开发出几种替代方案,其中一些成为发行版的本机 init 替代品,其中一些是:
- Upstart – 在 Ubuntu GNU/Linux 中实现的 init 替换守护进程,旨在异步启动进程。
- Epoch — 一个围绕简单性和服务管理构建的 init 替换守护进程,旨在以单线程方式启动进程。
- Mudar – 一个用 Python 编写的 init 替换守护进程,在 Pardus GNU/Linux 上实现,旨在异步启动进程。
- systemd – 一个用于并行启动进程的 init 替换守护进程,已在多个标准发行版中实现 – Fedora、OpenSuSE、Arch、RHEL、CentOS 等。
什么是 systemd?
systemd是一个系统管理守护进程,其命名遵循 UNIX 惯例,即在守护进程末尾添加“ d ”。这样,它们就很容易被识别。它最初是在 GNU 通用公共许可证下发布的,但现在的发布是在 GNU 宽通用公共许可证下发布的。与 init 类似,systemd 是所有其他进程的直接或间接父进程,并且是系统启动时启动的第一个进程,因此通常分配“ pid=1 ”。
systemd可以指守护进程周围的所有软件包、实用程序和库。它旨在克服 init 的缺点。它本身是一个后台进程,旨在并行启动进程,从而减少启动时间和计算开销。与 init 相比,它还有很多其他功能。
为什么需要替换 init?
init 进程按顺序启动,即,只有在上一个任务启动成功并加载到内存中后,才会启动下一个任务。这通常会导致启动延迟和启动时间过长。然而,systemd 的设计目的不是追求速度,而是要让任务完成得井井有条,从而避免所有不必要的延迟。
systemd 的功能
- 简洁、先进且高效的设计。
- 更简单的启动过程。
- 启动时进行并发和并行处理。
- 更好的 API。
- 简单单位语法。
- 能够删除可选组件。
- 低内存占用。
- 改进了表达依赖关系的技术。
- 初始化指令写在配置文件中而不是在 shell 脚本中。
- 使用 Unix 域套接字。
- 使用 systemd 日历计时器进行作业调度。
- 使用 journald 进行事件记录。
- 选择使用 systemd 和 syslog 记录系统事件。
- 日志存储在二进制文件中。
- systemd 状态可以被保存以便将来调用。
- 使用内核的 cgroup 而不是 PID 来跟踪进程。
- 用户登录由 systemd-logind 管理。
- 更好地与 Gnome 集成,实现互操作性。
瓶颈 systemd
- 一切都集中在一个地方。
- 不是 POSIX 标准。
Systemd 和 Distro 集成
Linux 发行版 | 一体化 |
Fedora | 是的,第一个采用 systemd 的发行版 |
拱 | 是的 |
红帽 | 是的 |
CentOS | 是的 |
Debian | 是的,Debian 8 代号 Jessie 将默认使用 systemd |
Gentoo | 是的,但需要下载、安装并使用自定义初始化进行配置 |
OpenSUSE | 是的 |
松弛 | 否(虽然到现在它还没有在 slackware 中被采用,但 Patric Volkerding 并未表明是否会采用它) |
Ubuntu | 是的,需要安装并配置 Upstream。 |
争议
Linux 内核首席架构师 Linus Torvalds 认为 systemd 的主要开发人员对用户和错误报告的态度似乎不太好。还有报道称 systemd 的理念很奇怪,是一种控制系统进程的外来方式。Patric Volkerding 和其他著名的 Linux 用户和开发人员以及在线论坛不时地记录了同样的情况。
systemd 与 init 的比较
特征 | 初始化 | systemd |
DBus 依赖 – 必需 | 不 | 是的 |
基于设备的激活 | 不 | 是的 |
使用 udev 进行设备依赖性配置 | 不 | 是的 |
基于定时器的激活 | 计划任务 | 所有权 |
配额管理 | 不 | 是的 |
自动服务依赖性处理 | 不 | 是的 |
注销时终止用户进程 | 不 | 是的 |
掉期管理 | 不 | 是的 |
SELinux 集成 | 不 | 是的 |
支持加密硬盘 | 不 | 是的 |
静态内核模块加载 | 不 | 是的 |
图形用户界面 | 不 | 是的 |
列出所有子进程 | 不 | 是的 |
兼容 Sysv | 是的 | 是的 |
交互式启动 | 不 | 是的 |
可移植至非 x86 | 是的 | 不 |
采用日期 | 多个发行版 | 多个发行版 |
并行服务启动 | 不 | 是的 |
每个服务的资源限制 | 不 | 是的 |
易于扩展的启动脚本 | 是的 | 不 |
分离代码和配置文件 | 是的 | 不 |
自动依赖性计算 | 不 | 是的 |
详细调试 | 是的 | 不 |
版本 | 不适用 | V44+ |
尺寸 | 560 千字节 | 不适用 |
文件数 | 75 个文件 | 900 个文件 + glib + DBus |
代码行——LOC | 15000 (大约) | 224000 (大约) (包括代码、注释和空格) 125000 (大约) (实际代码) |
结论
任何以 pid=1 运行的东西都不能中断,不能混乱,必须由用户有效和高效地控制。许多用户认为,用 systemd 替换 init 只不过是每次都重新发明轮子,这是 Linux 的副作用。但这就是 Linux 的多样性。这是因为 Linux 非常强大。改变是好的,如果改变是有充分理由的,我们必须欣赏它。
现在就这些了。我会再次在这里为您带来另一篇有趣的文章,你们一定会喜欢阅读。在此之前,请继续关注并关注示例。不要忘记在下面的评论中向我们提供您宝贵的反馈。