内容纲要

🗂 | 查看更多 关于 Linux 的内容


一旦内核被加载并完成初始化过程就会在用户空间创建「自发」(spontaneous)进程。

正常情况下现有进程发出请求时才会创建新进程,而自发进程是有内核自主启动,大多数自发进程是内核实现的一部分,在文件系统中未必有对应的程序,它们既不能配置也无需管理,在 ps 命令的输出中,自发进程的 PID 较低切进程名由中括号包裹:

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1 17.8  0.4 103812  9972 ?        Ss   10:38   0:03 /sbin/init
root          2  0.1  0.0      0     0 ?        S    10:38   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        I<   10:38   0:00 [rcu_gp]
...

这其中的一个例外就是「系统管理守护进程」(system management daemon),它的 PID 为 1 且通常以 init 为名,系统赋予了 init 一些特权,但在大部分时候它和其他守护进程一样是一个用户级的程序。

init 的职责及实现

init 的功能众多但其首要任务是确保系统在任何时刻都运行着正确的服务和守护进程。

为了实现这个目标 init 定义了系统操作模式的概念,其中常用的包括:

  • 单用户模式:只挂载少数的文件系统,不运行任何服务,在控制台中启动 root shell
  • 多用户模式:在该模式中挂载所有定制的文件系统,启动配置好的网络服务以及窗口系统,和控制台的图形化登陆管理器
  • 服务器模式:类似多用户模式,除了不启用图形化用户界面

每种模式都有与之相关的一组系统服务,初始化守护进程负责根据需求启动或停止服务,将系统带入当前制定的操作模式。另外还有一些标志性任务会在特定模式启用或结束时运行。

从引导到进入多用户模式的过程 init 通常需要操作:

  • 设置计算机名;
  • 设置时区;
  • 使用 fsck 检查磁盘;
  • 删除 /tmp 目录中的陈旧文件;
  • 配置网络接口
  • 配置分组过滤器
  • 启动其他守护进程和网络服务

init 本身对上述任务一无所知,只是简单地执行一组中特定环境下运行的命令或脚本。

目前普遍使用的系统管理方法:

  • UNIX System V 的 init,也被称为「传统 init」,在 systemd 出现前,这种 init 在 Linux 中占据主导地位
  • 源自 BSD UNIX 的 init 变体应用在大多数的 BSD 系统中(FreeBSD、OpenBSD 等),相较于 SysV 形式的 init 变得简单,但也是久经考验。
  • systemd,其目标是要一劳永逸地解决所有与守护进程及状态相关的问题。

除了上述还有一些其他的变体实现,如在使用 systemd 前 Ubuntu 使用的 Upstart、macOS 的 launchd 等等。

传统 init 与 systemd 之争

对于 systemd 有着旷日持久的争议,至今也能看到不少反对它的的声音。尽管目前许多主流的 Linux 发行版已经转向了 systemd,但你可能还会想了解一下。

反 systemd 阵营的人经常引用一个原则:「If it ain’t broke,don’t fix it.」,这其实也说明了传统 init 的确存在一些值得注意的缺点。

传统 init 自身并没有强大到能够满足现代系统的需求。它缺少一个能够描述服务之间依赖关系的通用模型,因而启动脚本和卸载脚本只能以串行方式运行,由系统管理员负责维护。后面的操作必须等到之前的操作全部结束之后才能执行,所以根本无法实现并行操作,系统需要花费大量的时间来改变状态。

而 systemd 定义了一个强健的依赖模型,不仅适用于服务之间还包括各种 target(对应于传统 init 的运行级),此外除了以并行方式管理进程,还负责管理网络、内核日志记录、用户登录。而这样大包大揽的控制操作系统如此之多的子系统,并不符合 UNIX 的哲学——「Keep simple,keep stupid.」,反 systemd 阵营的人认为应该保持各个系统组成部分的小巧、简单、模块化,而 systemd 此举在滋生复杂性的同时还引入了安全隐患,模糊了操作系统平台与运行在其上的服务之间的界限。

除此之外 systemd 还受到了诸多方面的批评,如果对于这块有兴趣了解可以查阅:
Arguments against systemd – Without Systemd (由于网站出现了问题这里放上 Internet Archive 的存档

互联网上相关的讨论也很多在此不一一赘述。

延伸