在linux中替换PID 1

Agy*_*yol 0 linux process init

我知道 PID 1 是 init。现在我想知道,我可以将 init 进程 ID 替换为另一个,并为 PID 1 分配一个新进程。如果是,我该怎么做?

Gil*_*il' 7

在引导时启动的第一个进程接收 PID 1。

在启动时启动的第一个进程有一个工作:它必须直接或间接启动所有其他进程。所有进程¹最终都是它的后代,因为除了在启动时运行程序的内核之外,创建进程的唯一方法是某些进程执行系统调用以创建新进程。

PID为1的进程有任务:如果一个进程在运行子进程时死亡,则子进程的父进程ID设置为1。当子进程死亡时,PID 1应该收割它们,即调用wait系统调用,否则a子进程的僵尸留在后面。

调用的各种程序init(有多种实现)执行这两项工作。

Linux 内核有一个命令行参数来更改作为第一个进程执行的可执行文件²。它可用于运行任何可执行文件,但如果该可执行文件不执行 init 的作业,则系统将无法正常运行。此功能主要用于进入系统修复模式,例如仅在控制台上运行 shell 而没有其他任何内容。

一旦系统正常启动,就不可能更换PID 1,因为init不会死。init 不仅不会死,因为它被编程为永远运行(init 应该一直运行直到系统关闭),而且它甚至得到了一个特殊的保护,防止信号杀死其他进程,例如 SIGKILL。

Linux 有一个PID 命名空间特性,允许使用它自己的一组进程 ID 定义一个子系统。从命名空间内部和命名空间外部查看时,PID 命名空间中的进程具有不同的 PID。命名空间中的第一个进程在命名空间中获得 PID 1。在命名空间之外,它不会有 PID 1(除非 init 选择输入新的 PID 命名空间,但 init 不会这样做,因为这会阻止它完成其工作)。

¹这并不完全正确,某些内核有其他方式来启动进程。例如,modprobe当某些硬件在某些情况下被发现时,Linux 就会启动。但是 init 的后代占了绝大多数进程。
²首先在initramfsinitrd 之后