开源中国上看到 Debian 正在投票是否支持非 systemd 初始化系统。
- 2014 年素来混乱的 Debian 社区,经过了一番激烈争论之后(甚至是生命安全威胁),终于决定支持 systemd。
PS: 这场争议导致部分核心人员离开,主要是对 Debian 社区的管理机制(混乱 “民主”)产生质疑。 - 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 等新命令,系统配置更方便。
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
管理。
缺点
- init 串行启动,比较耗时
- init 只管执行脚本,服务需要自己实现各种管理功能
其他替代方案
- Upstart, Ubuntu 出的,RHEL 6 也采纳了这个方案。
- OpenRC, Gentoo 定制。
- runit
参考资料与拓展阅读
- 阮一峰, 2016-03-07, Systemd 入门教程:命令篇
- 阮一峰, 2016-03-08, Systemd 入门教程:实战篇
- 维基百科, Systemd
- 维基百科, init
- 知乎, systemd 为什么会有那么大的争议?