init system
参考:5 Best Modern Linux ‘init’ Systems (1992-2015)
参考:Linux开机流程
参考:《鸟哥的 Linux 私房菜:基础学习篇 第四版》第十七章、认识系统服务 (daemons)
前言
在Linux和其他类Uniux系统中,init process(初始化进程)是系统启动时由内核执行的第一个进程,其PID为1。init process静默运行在后台,直到系统关闭。
init进程负责启动所有其他进程,比如守护进程、服务和其他后台进程。因此,它是系统中其它所有进程之父。一个进程可以启动许多个子进程,如果在子进程没死之前父进程死了,孤儿进程(orphan process)的父进程会变成init进程。
本文所关注的init system就是内核之后的第一个程序,也就是init process。
如果init process无法启动,后面将不会启动任何进程,系统将进入一个名为“Kernel Panic”的阶段。
这么多年过去了,许多的init system在主流Linux发行版中脱颖而出。
System V Init
System V (SysV) 是一个在类 Unix 系统中最成熟最受欢迎的init system,也是第一个商业 Unix 系统的init system。除了 Gentoo 使用自主的init system、Slackware 使用 BSD 风格的init system外,几乎所有的 Linux 发行版都率先使用 SysV 作为init system。SysV是 Unix/Linux 系统中所有进程的父进程。很多时候我们说init进程,实际上指的就是SysV。操作系统内核第一个调用的程序就是init,然后init去唤醒所有系统必须服务(本机的或者远端的)。
随着时间的推移,SysV 由于一些设计上的缺陷,有几个 替代init scheme被开发出来。这些init scheme为 Linux 提供更加高效和完美的init system。 尽管这些替代方案都超越了 SysV 并提供了更多新特性,但它们仍然和原始 SysV 初始化脚本保持兼容。
CentOS 7.X后,便由systemd替代init。如果你去/etc/init.d/下面会有个README提示你
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
You are looking for the traditional init scripts in /etc/rc.d/init.d, and they are gone? Here's an explanation on what's going on: You are running a systemd-based OS where traditional init scripts have been replaced by native systemd services files. Service files provide very similar functionality to init scripts. To make use of service files simply invoke "systemctl", which will output a list of all currently running services (and other units). Use "systemctl list-unit-files" to get a listing of all known unit files, including stopped, disabled and masked ones. Use "systemctl start foobar.service" and "systemctl stop foobar.service" to start or stop a service, respectively. For further details, please refer to systemctl(1). Note that traditional init scripts continue to function on a systemd system. An init script /etc/rc.d/init.d/foobar is implicitly mapped into a service unit foobar.service during system initialization. Thank you! Further reading: man:systemctl(1) man:systemd(1) http://0pointer.de/blog/projects/systemd-for-admins-3.html http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities
SystemD
SystemD 即 System Management Daemon,Unix命名约定,喜欢在守护进程(daemon)后面加d。
在Linux 平台中,SystemD 是一个相对较新的init scheme。它由 Fedora 15 引入,集成了各类工具以便更好的管理系统。主要目的是:系统初始化、管理和跟踪OS启动过程中 和 OS运行时 所有的系统进程。
Systemd 全面有别于其他传统的 Unix 初始化系统,特别是在系统和服务管理方面。它同样兼容 SysV 和 LBS 初始化脚本。
其中较为突出的特性如下:
- 纯粹、简单、高效的设计
- 启动时的并发和并行处理
- 更好的 API
- 开启可选进程的移除功能
- 使用 journald 来支持事件日志
- 使用 systemd calender timers 来支持任务计划
- 以二进制文件存储日志
- 保存 systemd 的状态以待今后查看
- 与 GNOME 更好整合实现等
- 查看 Systemd 初始化系统简介:Understanding and administering systemd
The Story Behind ‘init’ and ‘systemd’: Why ‘init’ Needed to be Replaced with ‘systemd’ in Linux
Upstart
Upstart由 Ubuntu 的制作团队开发,是一个基于事件的初始化系统,用以替代 SysV。它可以启动不同的系统任务(system tasks)和进程、在系统运行时校验进程并在系统关闭时结束进程。
Upstart是一个使用 SysV 和 Systemd 启动脚本的混合初始化系统。
Upstart 中值得一提的特性如下:
- Ubuntu 的原生初始化系统,但可以运行在其他所有的发行版中
- 基于事件启动/结束的任务和服务
- 启动/结束任务和服务时生成事件
- 可以由其他系统进程发送事件
- 使用 D-Bus 和 init 进程通信
- 用户可以启动/结束其各自的进程
- 可以再现崩溃的进程等
- 访问 Upstart 主页:http://upstart.ubuntu.com/index.html
OpenRC
OpenRC 是一个基于依赖关系的类 Unix 系统初始化方案,兼容 SysV。基本可以说是 SysV 的升级版,但必须要清楚记住的是:OpenRC 并非只是完全替代 /sbin/init 文件。
它所提供的出色特性如下:
- 可运行在包括 Gentoo 和 BSD 在内的多数 Linux 系统之中
- 支持硬件触发的初始化脚本(LCTT 译注:如硬件热插拔所触发的)
- 支持单个配置文件
- 不支持单个服务配置文件
- 以守护进程的方式运行
- 并行服务启动等
- 访问 OpenRC 主页:https://wiki.gentoo.org/wiki/OpenRC
runit
runit 同样是一个跨平台初始化系统,可以运行在 GNU/Linux、Solaris、BSD 和 Mac OS X 中,可用于替代 SysV,同时提供服务监控。
相比于 SysV 和其他 Linux 初始化系统,它提供了一些好用和卓越的组件,如下:
- 服务监控:每个服务都关联一个服务目录
- 清理进程状态,以保证每个进程处于干净状态
- 可靠的日志机制
- 快速的系统启动和关闭
- 可移植
- 打包方便
- 代码体积小等
- 访问 runit 主页:http://smarden.org/runit/
总结
Linux 中的初始化系统负责启动和管理所有的进程。此外,SysV 是 Linux 系统中主要的初始化系统,但由于一些性能缺陷,系统开发者已经开发出几个替代品。 除了上面几种替代方案,还有其他方案未列出。