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

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

阅读斯蒂芬的优秀回复之一,我想知道之间有什么区别

什么时候操作系统关闭。 ...

什么时候内核关闭,...(...我正在考虑使用外部命令关闭的变体不是内核)

“使用外部命令关闭的变体”是“当操作系统关闭时”还是“当内核关闭时”?

换句话说,“我正在考虑使用外部命令关闭的变体不是内核”是什么意思?

是否系统调用重启()重新启动操作系统或内核?

命令是否reboot重新启动操作系统而不是内核?

谢谢。

答案1

您引用的帖子实际上是这样说的:

当内核关闭或重新启动时,它不关心进程,也不会杀死它们(reboot()了解详情;我正在考虑使用外部命令关闭的变体不是内核)。

您的选择性编辑将不相关的句子拼接在一起,以造成错误的印象。

您保留的部分(分号之后)与分号之前的部分(您已删除)相关。也就是说,变体重启()出于斯蒂芬的目的,它使用外部命令来关闭(LINUX_REBOOT_CMD_RESTART2在文档中,已链接)被排除在考虑范围之外。

第一个引用不相关。

答案2

他似乎注意到内核本身与操作系统的其余部分(构建在内核之上的用户空间结构)之间的区别。

当您使用或等效命令(依次调用 systemd 或某些 init 脚本或其他东西)关闭系统时/sbin/reboot,它所做的不仅仅是要求内核关闭。用户空间工具几乎完成所有清理工作,例如卸载文件系统、发送SIGTERM到其他进程要求它们关闭等。

相反,如果您去致电reboot()系统调用直接以 root 身份运行,则不会发生任何清理操作,内核只会执行它被告知执行的操作并立即关闭(可能重新启动或关闭机器)。手册页指出,它reboot()甚至不执行与 相同的操作sync(),因此它甚至不执行可以在内核(文件系统驱动程序和 I/O 缓冲区所在的位置)内完成的清理工作。

作为手册页的示例:

LINUX_REBOOT_CMD_RESTART
       (RB_AUTOBOOT, 0x1234567).  The message "Restarting system." is
       printed, and a default restart is performed immediately.  If
       not preceded by a sync(2), data will be lost.

所以,

系统调用是否会reboot()重新启动操作系统或内核?

它要求内核关闭或重新启动,操作系统也会随之关闭。

命令是否reboot重新启动操作系统而不是内核?

它要求用户空间进程关闭,进行其他清理,并且只有那时要求内核关闭或重新启动。

系统reboot()调用有一种模式 ( LINUX_REBOOT_CMD_RESTART2),被描述为“使用命令字符串”。然而,它并不意味着用户模式命令,而是内核内部的一个命令,并且甚至在 x86 上都不使用。

请注意,虽然我们正在考虑内核和内核之上的操作系统之间的区别,但原则上您可以仅重新启动操作系统,但保持内核运行。您需要清理用户空间设置的所有内容并终止其他用户空间进程,然后重新启动init以再次恢复所有内容,而不是要求内核重新启动。但这可能不是很有用,而且很难可靠地重置内核中剩余的所有状态(您需要手动重置所有网络接口、清理 iptables 规则、重置 RAID 和循环设备等。很可能会错过一些事后可能会反噬的东西。)

相关内容