他似乎注意到内核本身和操作系统的其余部分,内核之上构建的用户空间构造之间的区别.
当您使用/ sbin / reboot或等效系统关闭系统时(后者又调用systemd或某些init脚本或其他东西),它不仅要求内核关闭.用户空间工具几乎可以完成所有清理工作,例如卸载文件系统,将SIGTERM发送到其他进程,要求它们关闭等等.
相反,如果您直接以root身份调用reboot() system call,则不会发生任何清理,内核只会执行它所做的事情并立即关闭(可能重新启动或关闭计算机).该手册页指出,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.
所以,
Does system call reboot() reboot the OS or kernel?
它要求内核关闭或重新启动,操作系统随之关闭.
Does command reboot reboot the OS but not the kernel?
它要求用户空间进程关闭,进行其他清理,然后才要求内核关闭或重新启动.
reboot()系统调用具有一种模式(LINUX_REBOOT_CMD_RESTART2),该模式被描述为“使用命令字符串”.但是,它并不意味着用户模式命令,而是内核的一个命令,以及甚至不在x86上使用的命令.
请注意,虽然我们正在考虑内核与内核操作系统之间的区别,但原则上您可以重新启动操作系统但保持内核运行.您需要清理用户空间设置的所有内容并终止其他用户空间进程,然后重新启动init以重新启动所有内容,而不是要求内核重新启动.这可能不是很有用,并且很难可靠地重置内核中的所有状态(您需要手动重置所有网络接口,清理iptables规则,重置RAID和循环设备等等.很有可能错过了之后可能会咬回去的东西.)