Gilles 在以下地址写了一篇关于 Linux 内核如何关闭的精彩回复:https://unix.stackexchange.com/a/122667/674
我想知道 Linux 操作系统如何关闭(在 systemvinit 和 systemd 的情况下)?我期待类似于 Linux 操作系统的启动顺序。我特别想知道进程如何通过 SIGTERM 和 SIGKILL 等信号或其他进程间通信方式相互通知?
谢谢。
有关的:
答案1
对于 systemdsysvinit
和 systemd,关闭操作系统首先会通知init
进程(pid 为 1 的进程)系统应该关闭(或重新启动或关闭电源)。
sysvinit
这是通过使用/run/initctl
FIFO 与 进行通信init
,要求其切换到相应的运行级别来实现的。看联机init
帮助页进行简要概述。
systemd 支持多种方法来执行此操作。各种各样的信号可用于以各种方式请求关闭、重新启动等;也可以通过 d-bus 请求(联机busctl
帮助页解释了如何探索这一点)。
一旦 pid 1 被要求关闭,它就会遵循其配置和规范,并执行所有适当的步骤。这通常包括通知所有用户正在关闭、关闭所有正在运行的服务(使用 systemd 以托管方式;使用各种形式的关闭脚本sysvinit
)、同步已挂载的文件系统、可能卸载它们、终止所有剩余进程(使用通常的TERM
thenKILL
序列),最后reboot
使用适当的参数调用内核的系统调用。
这描述了一般顺序。所有这一切还有更多的曲折,包括访问控制(使用 Polkit)、各种可用的钩子、kexec
突然断电处理、CtrlAltDel处理……systemd 文档涵盖了其中的许多细节。