1. init简介
2. init简史
3. init现状
    3.1 OpenRC
    3.2 Systemd
    3.3 使用命令对比
    3.4 systemd 备受争议,仍然一同天下?
4. 主流Linux发行版使用的init列表
5. init对比
6. 值得期待更好的init替代品

1. init简介

https://en.wikipedia.org/wiki/Init
在基于Unix的计算机操作系统中,init(初始化的简称)是在启动计算机系统期间启动的第一个进程。
Init是一个守护进程,它将持续运行,直到系统关闭。
它是所有其他进程的直接或间接祖先,并自动采用所有孤立进程(adopts)。
Init 在启动过程中由内核启动 ; 如果内核无法启动它,将发生内核恐慌
通常为Init分配进程标识符 1。

2. init简史

就GNU/Linux而言,最常见的首先是sysvinit。
然后Apple创建了launchd,这启发了Ubuntu制作Upstart
大约2007年,Gentoo开始使用OpenRC
接着在2010年systemd改变了一切。到2015年,基本一统天下,大部分Linux发行版都采用Systemd作为默认init。
更完整的历史请看: https://blog.darknedgy.net/technology/2015/09/05/0/
现代初始系统的历史(1992-2015)

3. init现状

  • 大部分主流Linux发行版采用systemd
  • Gentoo支持多种内核的特性,需要使用OpenRC(因为可移植性?),但在使用Linux内核时可安装为Systemd;
  • Apple的mac OS使用lanuchd。https://en.wikipedia.org/wiki/Launchd

还有极少数Linux发行版仍在使用SysV作为默认init;以及一些非广泛场景的其他init。
https://en.wikipedia.org/wiki/Operating_system_service_management

  • Service Control Manager - 由Microsoft Windows使用
  • Android init - 由谷歌Android使用
  • Service Management Facility - 由illumos发行版和Oracle Solaris使用
  • sysvinit - 由较旧的类Unix操作系统使用
  • rc.d or rcorder-based init - 由BSD操作系统使用
  • cygserver - 由Cygwin使用
  • runit - 由Void使用
  • The GNU Shepherd - 由Guix系统分发GuixSD和GNU Hurd使用,但设计用于Guile可用的每个类似POSIX的系统

关于古老的Slackware发行版使用的init?
wiki百科的对比列表里Slackware使用BSD init scripts作为init
distrowatch的Slackware页面,使用SysV作为init
https://distrowatch.com/table.php?distribution=slackware

Slackware可以使用OpenRC
http://docs.slackware.com/howtos:general_admin:openrc?s[]=init
OpenRC提供了许多功能,如硬件启动的initscript运行和cgroups支持,无需进行大的布局更改。
有两个Slackbuild可用,openrc包含OpenRC init系统,openrc-services包含用于OpenRC的各种服务。

3.1 OpenRC

https://en.wikipedia.org/wiki/OpenRC
https://github.com/OpenRC/openrc
http://wiki.gentoo.org/wiki/OpenRC
与Linux一样,OpenRC也可用于多个BSD系统。它是由一个NetBSD开发人员创建的,他开始了Gentoo/FreeBSD项目。
OpenRC提供以下功能:

  • 可在Linux,TrueOS,FreeBSD和NetBSD之间移植
  • 并行服务启动(可选,正在开发中)
  • 基于依赖关系的启动
  • 通过cgroup进行流程隔离
  • 每服务资源限制(ulimit)
  • 代码和配置的分离(init.d / conf.d)
  • 用户可自定义的易于扩展的启动脚本
  • 除了基本的“开始,停止和状态”之外,能够包含无限多种命令
  • 有状态的init脚本(它已经启动了吗?)
  • 用于启动多个组件的复杂init脚本(Samba(smbd和nmbd),NFS(nfsd,portmap等))
  • 自动依赖计算和服务排序
  • 正确集成到容器/虚拟化(Linux-VServer,OpenVZ等
  • 适当的模块化架构和可选组件的分离(Cron,syslog)
  • 富有表现力和灵活的网络处理(包括VPN,网桥等)
  • 支持裸机裸依赖服务器
  • 详细的调试模式

项目主页: https://wiki.gentoo.org/wiki/Project:OpenRC
OpenRC是一个基于依赖的init系统,基于依赖的rc(运行命令)系统,它与系统提供的init程序一起工作,通常位于/sbin/init。
它不是/sbin/init的替代品。
Gentoo Linux使用的默认init系统是sys-apps/sysvinit,而Gentoo/FreeBSD使用sys-freebsd/freebsd-sbin提供的FreeBSD init 。
OpenRC与Gentoo init脚本100%兼容,这意味着您可以在主Gentoo存储库中找到几个守护进程。
但是,OpenRC并非由Gentoo Linux专门使用,因此我们的目标是与平台无关。

https://wiki.gentoo.org/wiki/Init_system
https://wiki.gentoo.org/wiki/OpenRC

3.2 Systemd

https://en.wikipedia.org/wiki/Systemd
该systemd 软件套件提供了一个基本的构建模块的Linux 操作系统。
systemd包括“System and Service Manager”,用于引导用户空间和管理用户进程的init系统。
systemd旨在统一Linux发行版中的服务配置和行为。它取代了UNIX System V和BSD init系统。
自2015年以来,大多数Linux发行版都采用了systemd,并且它被认为是事实上的标准。

3.3 使用命令对比

OpenRC中常用的命令列表及其等效的systemd命令。
https://wiki.gentoo.org/wiki/OpenRC_to_systemd_Cheatsheet
https://wiki.archlinux.org/index.php/OpenRC#Usage

描述 SysVinit systemd OpenRC
开始服务 rc.d start daemon systemctl start <service> /etc/init.d/<service> start
rc-service <service> start
停止服务 rc.d stop daemon systemctl stop <service> /etc/init.d/<service> stop
rc-service <service> stop
重启服务 rc.d restart daemon systemctl restart <service> /etc/init.d/<service> restart
rc-service <service> restart
获得服务状态 rc.d (start, stop, restart) daemon systemctl status <service> /etc/init.d/<service> status
rc-service <service> status
显示已知的启动脚本
列出运行服务状态
rc.d list systemctl list-units rc-status
rc-update show
启动时启用服务 chkconfig daemon on systemctl enable <service> rc-update add <service> <runlevel>
启动时禁用服务 chkconfig daemon off systemctl disable <service> rc-update del <service> <runlevel>
显示所有启动脚本   systemctl list-unit-files --type=service ls /etc/init.d/
rc-update -v show
检查服务失败   systemctl --failed rc-status --crashed
显示所有可用服务。   systemctl --all rc-update -v show
创建或修改配置。 chkconfig daemon --add systemctl daemon-reload  
禁用自动生成的服务   systemctl mask <service>  
杀死与服务相关的所有流程   systemctl kill <service>  
显示记录今天发生的事件,
首先记录最近的事件
  journalctl -r --since=today  
显示特定服务的日志事件   journalctl _SYSTEMD_UNIT=<service>.service  

 

3.4 systemd 备受争议,仍然一同天下?

批评者认为systemd过于复杂,并且持续存在功能蔓延,认为其架构违反了Unix哲学。
还有人担心它会形成一个互锁的依赖系统,从而使分发维护者别无选择,只能采用systemd,因为更多的用户空间软件依赖于它的组件。

https://www.zhihu.com/question/25873473
systemd 为什么会有那么大的争议?
https://www.solidot.org/story?sid=41361
systemd作者抨击开源和Linux社区
https://www.solidot.org/story?sid=41219
抗议者创建Systemd分支Uselessd
Systemd因其复杂性而饱受Unix哲学(做一件事并做好)拥护者的鞭笞,批评者为此发起了抵制Systemd的运动,呼吁抵制使用Systemd的Linux发行版。

抗议者更进一步的创建了Systemd分支Uselessd,以求简化Systemd的功能。
开发者表示,Uselessd不仅仅是一种政治抗议,他们的目标是创造出Systemd的可靠替代。
Uselessd是基于systemd 208 ,剥离被认为与初始化系统无关的功能如systemd journal和udev。
Systemd只支持Linux,而Uselessd将能移植到BSD。
但这仅仅是曾经的想法,该项目已与几年前暂停至今...

Systemd虽然饱受争议,但其方便使用,快速的优点让他在几年内被大部分发行版接受。

4. 主流Linux发行版使用的init列表

排名 Distribution Default
Init system
systemd
加入仓库日期
systemd
作为默认init日期
Runs
Without?
1 MX Linux SysV      
2 Manjaro systemd 2013-11 2013-11  
3 Mint systemd 2013-11 2013-11 Yes
5 Ubuntu systemd 2013-04 2015-04  
6 Debian systemd 2012-04 2015-04 Yes
7 Solus systemd 2016-10 2016-10 No
8 Fedora systemd 2010-11 2011-05 No
9 openSUSE systemd 2011-03 2012-09 No
15 CentOS systemd 2014-04 2014-04 No
16 Arch Linux systemd 2012-01 2012-10 Yes
21 Kali Linux systemd 2007-03 2015-08  
40 Red Hat Enterprise Linux systemd 2014-06 2014-06 No
43 Gentoo Linux[b] openrc 2011-07   Yes
59 GhostBSD openrc      
26 FreeBSD RC      
60 DragonFly RC      
31 Slackware BSD init scripts   N/A Yes

 

5. init对比

https://wiki.gentoo.org/wiki/Comparison_of_init_systems

特征 sysvinit OpenRC systemd launchd runit BSD rc.d SMF
Gentoo支持 partially (used by OpenRC)  Yes (default init)  Yes  No  Yes  No  No
包装 sys-apps/sysvinit sys-apps/openrc sys-apps/systemd - sys-process/runit - -
支持的平台 Linux / BSD Linux + BSD Linux MacOSX Linux / BSD / MacOSX BSD Solaris
主要编码语言 C POSIX shell (+ C) C C C POSIX shell (+ C) C
主要依赖 - init (sysv or BSD) D-Bus - - rcorder init(sysv?)
初始化脚本
/服务格式
single config file shell scripts config files (ini) plist shell scripts shell scripts XML (+ shell scripts)
每服务配置  No  Yes (conf.d)  Yes  ?  No  No  Yes (service instances)
作为守护
进程运行
 Yes (PID 1)  Yes (PID 1)  Yes (PID 1)  Yes (PID 1)  Yes (PID 1)  Yes (PID 1)  Yes (invoked)
跨服务
依赖/事件
 No  Yes  Yes  No  Yes  Yes  Yes
并行服务启动  Yes  Yes (optional)  Yes  Yes  Yes  Yes  Yes
让守护进程
保持活力
 Yes  Yes (optional v0.21+ via supervise-daemon)  Yes  Yes  Yes  Yes  Yes
首选服务
供应商
n/a Gentoo upstream MacOSX Void Linux NetBSD, FreeBSD, OpenBSD Solaris
执照 GPL v2+ 2-cl. BSD LGPL v2.1+ Apache License 2.0 BSD BSD ?


支持的服务(在Gentoo中)

特征 systemd OpenRC
文件系统加载 每个mountpoint两个单元 (fsck+mount),运行时生成依赖项 每组一个脚本 (root, local, network, swap...).
getty (终端提示) 每个控制台一个单元, 从模板按需实例化。 通过 /etc/inittab 或agetty脚本启动
网络设置 外部(NetworkManager, networkd, DHCP守护程序) 几个选项, 如dhcpcd  netifrc 或NetworkManager
X11显示管理器设置 单独的DM单位。 为所有人提供单一服务(需要自动重启)

 

6. 值得期待更好的init替代品

https://www.funtoo.org/FAQ:Do_You_Support_Systemd
常见问题:你支持Systemd吗? 本页面最后编辑于2018年11月20日 (星期二) 21:00。
Funtoo Linux的部分独特之处在于它的基于依赖性的OpenRC init系统,所以改变它会使它成为Funtoo Linux以外的东西。
所以我们不支持systemd作为Funtoo Linux的一部分。
感谢Dantrell B.和其他人的工作,我们完全支持在不依赖systemd的情况下运行GNOME 3.26。
我们正计划开发一种新的OpenRC风格的初始化系统,其中包含“下一代”功能,这些功能在功能上可与systemd相媲美。

https://www.funtoo.org/FLOP:No-systemd_system
systemd如何潜入Funtoo,以及删除它的可能解决方案。

https://www.funtoo.org/Mitigating_Systemd
Funtoo目前没有计划迁移或采用systemd作为它的默认init系统。这并不能阻止你使用systemd您的系统上。
例如,CoreOS是基于Gentoo的基于系统的系统。