内核会在 PID 命名空间中以 PID 1 启动第一个用户空间进程。在完整 Linux 系统上,这个 init 进程会建立服务环境。在容器中,PID 1 也可能是小型 init 包装程序或应用程序本身,但仍承担特殊的信号和子进程回收职责。
启动系统 · 第 5 课
启动过程:Init
了解 PID 1 如何初始化用户空间、监管服务、回收子进程并协调关机。
PID 1 的职责
Init 系统通常会:
- 启动并监管服务、登录、挂载和其他工作单元
- 根据依赖关系和配置的目标状态安排工作顺序
- 接管并回收孤儿子进程
- 根据策略响应服务失败
- 协调有序关机和重启
具体边界有所不同。设备管理、网络、日志和定时任务可以是由 init 监管的独立程序,而不是直接内置到 PID 1 中。
在自身 PID 命名空间中,哪项职责是 PID 1 所特有的?
System V Init 与运行级别
传统 sysvinit 使用 /etc/inittab 等配置,以及各运行级别对应的启动与关闭脚本。运行级别表示一种运行模式,但数字级别的含义可能因发行版而异。脚本顺序由约定决定,发行版工具也可以扩展或并行执行。
不能仅仅因为存在 /etc/init.d/ 就推断主机正在使用哪种 init 系统;即使 PID 1 是其他实现,兼容脚本也可能保留。
System V 运行级别表示什么?
基于事件和依赖的系统
Upstart 引入了事件驱动的作业模型,旧版 Ubuntu 和其他一些系统曾使用它。现在它主要只具有历史或旧系统运维意义。
Systemd 被当前许多通用发行版广泛使用。它把服务、套接字、挂载、定时器、设备、目标和其他资源建模为单元。声明式依赖关系和激活机制让独立工作能够并发推进,同时保留必要顺序。
其他仍在使用的 init 和监管设计包括 OpenRC、runit、s6 和 BusyBox init。“最新”并不是有用的兼容性规则;应识别实际系统运行的内容并使用其文档。
Systemd 如何表示服务和挂载等受管资源?
识别正在运行的 Init
应检查 PID 1,而不是根据已安装文件猜测:
$ ps -p 1 -o pid,comm,args=
$ readlink /proc/1/exe
权限、容器和命名空间会影响看到的内容。在容器中运行命令时,报告的是该命名空间中的 PID 1,不一定是主机 init。识别后,应使用其原生状态和日志工具,不要混用其他 init 家族的命令。
为什么检查 PID 1 比查看是否存在旧式脚本目录更可靠?
课程已完成
你已完成 启动过程:Init
现在,你可以把 init 理解为一种角色,而不是强制要求的单一实现。
理解 PID 1 与服务初始化、子进程回收和关机的关系。
把 System V 运行级别理解为发行版定义的运行模式。
理解 systemd 资源与依赖关系如何映射为单元。
选择工具前,检查相关命名空间中正在运行的 PID 1。