为什么 Ubuntu 18.04 使用 `/sbin/init` 而不是 `systemd`?

Why Ubuntu 18.04 use `/sbin/init` instead of `systemd`?

首先,这是我的系统环境:

# cat /proc/version
Linux version 4.15.0-52-generic (buildd@lgw01-amd64-051) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #56-Ubuntu SMP Tue Jun 4 22:49:08 UTC 2019

# cat /etc/issue
Ubuntu 18.04.2 LTS \n \l

参考这个Ubuntu Wiki,ubuntu从15.04开始默认使用Systemd,Systemd以/sbin/init的PID 1运行。但是,我在 ubuntu 18.04:

上发现了不同的结果
# ps aux | awk '==1{print [=13=]}'
root         1  0.0  0.8 159692  8784 ?        Ss   Oct24   0:21 /sbin/init noibrs splash

# lsof -p 1 | grep txt
systemd   1 root  txt       REG              252,1  1595792     927033 /lib/systemd/systemd

那么,我的问题是:

  1. 为什么 Ubuntu 18.04 使用 /sbin/init 而不是 /lib/systemd/systemd

  2. 为什么PID 1的进程是/sbin/initlsof -p 1 | grep txtreturn/lib/systemd/systemd

/sbin/init 是一个符号 link 到 /lib/systemd/systemd

看看stat /sbin/initreadlink /sbin/init

的输出

这就是他们所说的 systemd "running as /sbin/init"。 systemd 二进制文件被 link 编辑为 /sbin/init 并以 link 名称启动。

更新

进一步解释 pslsof 输出之间的区别:ps 显示启动进程的命令,而 lsof 显示哪些文件进程已打开。

当 systemd 启动时,它被 /sbin/init noibrs splash 调用,文件系统将 link 解析为文件 /lib/systemd/systemd,然后从磁盘读取并执行。