init

2024 年 8 月 29 日 | 阅读 3 分钟

它是内核在系统启动时执行的第一个进程。它是一个守护进程,一直运行到系统关闭。因此,它是所有进程的父进程。首先,init 读取存储在 /etc/inittab 文件中的脚本。init 命令读取初始配置文件,该文件基本上负责系统初始化时执行的所有操作,如设置时钟、初始化串行端口等。

通过读取此文件,init 确定系统在每个运行级别应如何设置,并设置默认运行级别。

确定系统的默认运行级别后,init 启动运行系统所需的所有后台进程。首先,它运行每个 kill 脚本(文件名以 K 开头),并带有一个 stop 参数。然后,它运行所有 start 脚本(文件名以 S 开头)以启动所有服务和应用程序。


运行级别

运行级别是 Linux 系统的软件配置,它只允许选定的一组进程存在。它定义了系统中运行的服务。

运行级别由数字标识。init 可以处于八个运行级别之一。它由特权用户通过运行 telinit 来更改,telinit 会向 init 发送相应的信号来更改运行级别。

运行级别函数
0关闭系统
1单用户模式
2无网络的多用户模式
3带网络的多用户模式
4未使用
5带网络和 X 窗口的多用户模式
6重启系统
S/s不直接使用
  • 0、1 和 6 是保留的运行级别。
  • 运行级别 S 或 s 是相同的。
  • 7-9 也是有效的运行级别,尽管它们没有被记录为传统的 Unix 变体,请不要使用它们。但它们与运行级别 S 或 s 相同。它们是别名。

更改运行级别

有许多方法可以更改运行级别。要使更改永久生效,请在 /etc/inittab 文件中更改默认级别。

在所有进程之后,init 等待其某个子进程死亡,等待电源故障信号。或等待直到 telinit 发出信号更改运行级别。当上述条件发生时,它会重新检查 /etc/inittab 文件。可以随时向此文件添加新条目。

init 不处于单用户模式并收到电源故障信号 (SIGPWR) 时,它会读取 /etc/powerstatus 文件。根据该文件的内容,init 会启动一个命令

  • F (FAIL)?当电源故障时,UPS 提供电源。执行 powerfail 和 powerwait 条目。
  • O (OK)?电源已恢复,执行 powerokwait 条目。
  • L (LOW)?电源正在衰减,UPS 电池电量低,执行 powerfailnow 条目。

如果文件 /etc/powerstatus 不存在或包含 F、O、L 以外的任何内容,则 init 的行为就好像它读取了字母 F。

要与 init 交互,应使用 /dev/initctl 控制通道,而不是 SIGPWR/etc/powerstatus。

当向 init 发送更改运行级别的请求时,init 会向新运行级别中所有未定义的进程发送警告信号 SIGTERM。然后等待 5 秒钟,之后通过 SIGKILL 强制终止进程。

所有这些进程都应保留在 init 创建的同一进程组中,否则它们将无法接收这些信号,并且需要单独终止。


Telinit

/sbin/telinit/sbin/init 链接。Telinit 接受一个参数并向 init 发送信号以执行相应的功能。

参数如下,每个参数为单个字符

参数函数
0,1,2,3,4,5,6切换到指定的运行级别
a,b,c仅处理 /etc/inittab 中具有运行级别 a、b、c 的文件条目。
Q 或 q重新检查文件 /etc/inittab
S 或 s切换到单用户模式
U 或 uinit 重新执行自身。不进行重新检查,运行级别应为 S、s、1、2、3、4、5,否则请求将被静默忽略。

默认情况下,在发送 SIGTERM 和 SIGKILL 信号之间等待的时间为 5 秒,但 telinit 也可以使用 -t sec 选项要求 init 更改此时间。

只有具有适当权限的用户才能执行 telinit。

init 二进制文件通过进程 ID 检查它是 init 还是 telinit,init 的 进程 ID 始终为 1。 因此,也可以使用 init 而不是 telinit 作为快捷方式。