init 是 Linux 系统运行绝对必要的程序之一,但您仍然可以在很大程度上忽略它。 良好的 Linux 发行版会附带一个 init 配置,该配置适用于大多数系统,在这些系统上,您无需对 init 做任何事情。 通常,只有在您连接串行终端、拨入(而非拨出)调制解调器,或者想要更改默认运行级别时,才需要担心 init。
当内核启动自身(已加载到内存中、已开始运行并已初始化所有设备驱动程序和数据结构等)后,它通过启动用户级程序 init 来完成其自身部分的引导过程。 因此,init 始终是第一个进程(其进程号始终为 1)。
内核在一些历史上用于 init 的位置查找 init,但它在 Linux 系统上的正确位置是/sbin/init。 如果内核找不到 init,它会尝试运行/bin/sh,如果这也失败了,系统启动就会失败。
当 init 启动时,它通过执行许多管理任务来完成引导过程,例如检查文件系统、清理/tmp、启动各种服务,并为每个终端和用户应该能够登录的虚拟控制台启动一个 getty (参见第 10 章)。
在系统正常启动后,init 会在用户注销后为每个终端重启 getty(以便下一个用户可以登录)。 init 还会接管孤儿进程:当一个进程启动一个子进程并在其子进程之前死亡时,该子进程立即成为 init 的子进程。 这对于各种技术原因很重要,但了解这一点很好,因为它使理解进程列表和进程树图更容易。 有一些 init 的变体可用。 大多数 Linux 发行版使用 sysvinit(由 Miquel van Smoorenburg 编写),它基于 System V init 设计。 Unix 的 BSD 版本有不同的 init。 主要区别在于运行级别:System V 有运行级别,BSD 没有(至少传统上如此)。 这种差异不是本质的。 我们将只关注 sysvinit。