TOC

Systemd 的问题

开源中国上看到 Debian 正在投票是否支持非 systemd 初始化系统

  1. 2014 年素来混乱的 Debian 社区,经过了一番激烈争论之后(甚至是生命安全威胁),终于决定支持 systemd。
    PS: 这场争议导致部分核心人员离开,主要是对 Debian 社区的管理机制(混乱 “民主”)产生质疑。
  2. 2015 年 5 月发布的 Debian 8.0 (Jessie) 开始使用 Systemd 当默认的初始化系统。
    但是关于 Systemd 的争论从未停止,甚至有部分开发者独自维护了一个拒绝 Systemd 的分叉:Devuan

Systemd 真是闹出好大争议,和 GNOME3 一样。也正是有 GNOME3 的例子(社区总体来说,或者说大多数人,最后还是拥抱了变化,接纳 GNOME3),而且我只是一个实用主义的使用者,我觉得 Systemd 挺好的,能提升性能、使用又方便,为什么不呢。

RedHat 就是牛逼!

据我的了解,反对派能拿得出手的理由只有一条:违反 Unix 设计哲学——做好一件事,更确切的说是用很多小的独立程序拼出一个完整功能。中国人对于墨守成规,然后落后挨打应该有比较深刻的记忆吧!
另外,能算半条的理由是:Systemd 和 Linux 的一些功能特性强绑定,不能移植到 BSD。这对于 Linux 圈子来说算个雕。

Systemd 取代的现有功能:服务管理, 网络管理,文件系统挂载, udev, crond, syslog (-> journald)...

与 System V 风格 init 相比,systemd 采用了以下新技术:

  • 将 service(服务)、target(执行模式,类似于运行级别)、mount、timer、snapshot、path、socket、swap 等称为 Unit。
    比如,一个 auditd 服务(就是 auditd.service)就是一个 Unit,一个 multi-user.target 执行模式也是一个 Unit。
  • 采用 Socket 激活式与 D-Bus 激活式服务,以提高相互依赖的各服务的并行运行性能;
  • 用 cgroups 代替进程 ID 来追踪进程,因此即使是两次 fork 之后生成的守护进程也不会脱离 systemd 的控制。
  • 用 target 代替 System V 的运行级别(Runlevel),比如,SystemD 的 graphical.target 相当于 System V 的 init 5,multi-user.target 相当于 System V 的 init 3。
  • 内置 journald 日志管理系统。
  • 内置 resolved、timesyncd、networkd 等组件。
  • 引入 localectl、timedatectl、hostnamectl 等新命令,系统配置更方便。

systemd

system-config-printer           systemd-inhibit
system-config-printer-applet    systemd-machine-id-setup
systemctl                       systemd-mount
systemd                         systemd-notify
systemd-analyze                 systemd-path
systemd-ask-password            systemd-resolve
systemd-cat                     systemd-run
systemd-cgls                    systemd-socket-activate
systemd-cgtop                   systemd-stdio-bridge
systemd-cryptenroll             systemd-sysext
systemd-delta                   systemd-sysusers
systemd-detect-virt             systemd-tmpfiles
systemd-escape                  systemd-tty-ask-password-agent
systemd-hwdb                    systemd-umount
systemd-id128

如果说以后 Linux 发行版 = 内核 + Systemd + Shell + Desktop,我觉得都没问题,可能更好。

附: SystemV init

内核引导完成之后,执行 init 程序,然后 init 程序按照执行级别执行指定目录下的所有脚本,启动服务。

传统的 init 程序由两种风格: System V, BSD。Linux 圈子都是采用 System V 风格。

启动

运行级别

  • 0: 关机
  • 1: 单用户模式(root)
  • 2: 多用户模式(禁用 NFS)
  • 3: 多用户模式
  • 4:
  • 5: 图形化
  • 6: 重启

PS:根据中文维基百科资料,还有 S 级别,但我没见过。
PS: 根据中文维基百科资料,0、1、6 之外,其他模式(也就是 2、3、4、5)在各系统之间有差异。

服务管理

服务的管理程序(Shell 脚本)放在 /etc/init.d/ 目录下,然后通过 sudo /etc/init.d/service_name start|stop|restart|status 管理。

/etc/init.d/mysql
Usage: /etc/init.d/mysql start|stop|restart|reload|force-reload|status

也可以通过 service service_name start|stop|restart|status 管理。

缺点

  1. init 串行启动,比较耗时
  2. init 只管执行脚本,服务需要自己实现各种管理功能

其他替代方案

  • Upstart, Ubuntu 出的,RHEL 6 也采纳了这个方案。
  • OpenRC, Gentoo 定制。
  • runit

参考资料与拓展阅读