Linux操作系统如何关闭?

Linux操作系统如何关闭?

Gilles 在以下地址写了一篇关于 Linux 内核如何关闭的精彩回复:https://unix.stackexchange.com/a/122667/674

我想知道 Linux 操作系统如何关闭(在 systemvinit 和 systemd 的情况下)?我期待类似于 Linux 操作系统的启动顺序。我特别想知道进程如何通过 SIGTERM 和 SIGKILL 等信号或其他进程间通信方式相互通知?

谢谢。

有关的:

“当操作系统关闭时”和“当内核关闭时”有什么区别?

当操作系统关闭时,服务管理器如何知道它应该向其服务发送 SIGTERM 和 SIGKILL?

答案1

对于 systemdsysvinit和 systemd,关闭操作系统首先会通知init进程(pid 为 1 的进程)系统应该关闭(或重新启动或关闭电源)。

sysvinit这是通过使用/run/initctlFIFO 与 进行通信init,要求其切换到相应的运行级别来实现的。看联机init帮助页进行简要概述。

systemd 支持多种方法来执行此操作。各种各样的信号可用于以各种方式请求关闭、重新启动等;也可以通过 d-bus 请求(联机busctl帮助页解释了如何探索这一点)。

一旦 pid 1 被要求关闭,它就会遵循其配置和规范,并执行所有适当的步骤。这通常包括通知所有用户正在关闭、关闭所有正在运行的服务(使用 systemd 以托管方式;使用各种形式的关闭脚本sysvinit)、同步已挂载的文件系统、可能卸载它们、终止所有剩余进程(使用通常的TERMthenKILL序列),最后reboot使用适当的参数调用内核的系统调用。

这描述了一般顺序。所有这一切还有更多的曲折,包括访问控制(使用 Polkit)、各种可用的钩子、kexec突然断电处理、CtrlAltDel处理……systemd 文档涵盖了其中的许多细节。

相关内容