Linux 及其它类 Unix 系统的系统服务管理和控制程序(初始化系统/init system)简单梳理

范振海
2023-12-01

一、Linux 的启动过程

在我们打开 Linux 电脑的电源后第一个启动的进程就是 init。分配给 init 进程的 PID 是1。它是系统其他所有进程的父守护进程。 init 进程在 Start_kernel 执行完毕之后,也就是 Kernel 初始化完毕之后启 动,它是系统所有进程的起点,内核在完成核内引导以后,即在本进程空间内加载 init 程序。

当一台Linux电脑启动后,处理器会先在系统存储中查找BIOS,之后BIOS会检测系统资源然后找到第一个引导设备,通常为硬盘,然后会查找硬盘的主引导记录(MBR),然后加载到内存中并把控制权交给它,以后的启动过程就由MBR控制。

主引导记录会初始化引导程序(Linux上有两个著名的引导程序,GRUB和LILO,80%的Linux系统在用GRUB引导程序),这个时候GRUB或LILO会加载内核模块。内核会马上查找/sbin下的“init”程序并执行它。从这里开始init成为了Linux系统的父进程。init读取的第一个文件是 /etc/inittab,通过它init会确定我们Linux操作系统的运行级别。它会从文件 /etc/fstab 里查找分区表信息然后做相应的挂载。然后init 会启动 /etc/init.d 或者 /etc/rc.d/init.d 里指定的默认启动级别的所有服务/脚本。所有服务在这里通过init一个一个被初始化。在这个过程里,init每次只启动一个服务(串行启动),所有服务/守护进程都在后台执行并由init来管理。

关机过程差不多是相反的过程,首先init停止所有服务,最后阶段会卸载文件系统。

以上提到的启动过程有一些不足的地方。而用一种更好的方式来替代传统init的需求已经存在很长时间了。也产生了许多替代方案。其中比较著名的有Upstart,Epoch,Muda和Systemd。而Systemd获得最多关注并被认为是目前最佳的方案。

二、初始化程序

(一)System V init

System V init 是类 Unix 操作系统传统的也是首款初始化系统。

SysV init 守护进程是一个基于运行级别的系统,它使用运行级别(单用户、多用户以及其他更多级别)和链接(位于 /etc /rcN.d/ 目录中,分别链接到 /etc/init.d 中的 init 脚本)来启动和关闭系统服务。SysV启动是线性、顺序的。一个S20的服务必须要等待S19启动完成才能启动,如果一个启动要花很多时间,那么后面的服务就算完全无关,也必须要等。

在 SysV init 中,服务被分成两大类,一类是可独立运行的服务,另一类是受xinetd管理的服务,而xinetd本身是一个独立运行的服务,用来负责管理一些不常用的服务,当这些服务需要被使用时,由xinetd来唤醒它们,当服务使用完后,这些服务会被结束以减少系统资源的占用。

(二)Upstart init

Upstart init 是由 Ubuntu 的制造商开发的基于事件的初始化系统,用于替代 SysV init 初始化系统。它用于 Ubuntu 6.10 - 14.10 版本和基于 RHEL 6 的系统中,之后的被 systemd 取代了。

UpStart(Upstart init daemon)是基于事件的启动系统,它使用事件来启动和关闭系统服务。Upstart是并行的,只要事件发生,服务可以并发启动。这种方式无疑要优越得多,因为它可以充分利用现在计算机多核的特点,大大减少启动所需的时间。

Upstart是基于事件的,当系统中的什么情况发生变化时,它会运行某个特定的程序。这里被运行的程序多半是用来启动或终止服务的脚本。这个配置方式和System V在系统进入某个运行级别的时候运行init脚本的链接的概念实际上是非常类似的。只不过Upstart更加灵活一些,Upstart不仅能在运行级别改变的时候启动或终止服务,也能在接收到系统发生其他改变的信息的时候启动或终止服务。这些系统的改变被称为“事件”。例如,当Upstart从udev接收到运行时文件系统加载、打印机安装或其他类似的设备添加或删除的信息,并采取相应的行动。Upstart也可以在系统启动、关闭或某个任务状态改变的时候启动或关闭服务。

UpStart 系统初始化的过程是在工作和事件的相互协作下完成的,可以大致描述为:系统上电后运行 GRUB 载入内核。内核执行硬件初始化和内核自身初始化。在内核初始化的最后,内核将启动 pid 为 1 的 init 进程(即 UpStart 进程),init 进程运行后,init 进程自身会产生不同的事件,这些最初的事件会触发一些工作运行,而每个工作运行过程中又会释放不同的事件,这些事件又将触发新的工作运行。如此反复,直到整个系统正常运行起来。

UpStart 是一个由事件触发工作运行(事件驱动机制)的初始化系统,每一个程序的运行都由其依赖的事件发生而触发的。UpStart 核心模块就是 Job 和 Event。

(三)systemd

systemd 中文名叫“系统管理守护进程”,是旨在以并行方式启动进程的替换传统 init 系统的初始化系统,目前已经在许多标准发行版(Fedora,OpenSuSE,Arch,RHEL,CentOS 等)中应用。借鉴 Mac OS。

开发 systemd 的主要目的就是减少系统引导时间和计算开销。systemd 最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,它是如今讨论最热烈的引导和服务管理程序。如果你的Linux系统配置为使用Systemd引导程序,它取替传统的SysV init,启动过程将交给systemd处理。systemd 的一个核心功能是它同时支持 SysV init的后开机启动脚本。

(四)Launchd

launchd 是 Mac OS 下用于初始化系统环境的 init 系统,它是内核装载成功之后在 OS 环境下启动的第一个进程。其实 systemd 的很多概念来源于此。

(五)Epoch

一种基于简单性的管理服务的 init 替换守护进程,旨在启动单线程进程。

(六)Mudar

一种用Python编写的 init 替换守护进程,在 Pardus GNU / Linux上实现,旨在异步启动进程

 类似资料: