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的基于系统的系统。