我最近不得不处理一个棘手的、间歇性的 NFS 客户端/服务器挂起挂载点问题。当问题发生在客户端上时,我无法卸载,还有一些其他奇怪的行为。到目前为止,我唯一的直接解决办法是重新启动客户端。
但根本shutdown -r now
不起作用。后来我发现reboot -f
做重新启动系统。为什么?我读过手册页,但似乎没有什么能回答我的问题。
为什么shutdown -r now
行为与不同reboot -f
?
(我正在继续解决 NFS 问题,但这不是我这里的问题。)
答案1
来自关机手册页:
一旦 TIME 时间过去,shutdown 就会向 init(8) 守护进程发送一个请求,让系统进入适当的运行级别。
init
在系统更改运行级别时启动和停止作业。由于重新启动而进入运行级别 6 时,系统将运行 /etc/rc6.d 中的所有脚本。由于您的系统没有响应shutdown
,很可能是 中的脚本/etc/rc6.d
(可能是K05nfs-common
由于您的 NFS 问题)卡住了,导致无法完成关机序列。事实上,在更改为运行级别 6 时 init 运行的最后一件事是reboot -d -f -i
。
reboot -f
跳过所有脚本并直接重启系统。
答案2
shutdown
指示init
开始关机程序,包括让登录用户知道系统正在关机、正常终止所有进程、卸载和同步驱动器等。您在这里被挂起是因为等待 IO 的进程往往很难终止,而您挂起的 NFS 挂载无法卸载。
reboot -f
另一方面,立即重新启动服务器而不执行任何操作。(reboot
程序init
调用来关闭服务器。如果没有该-f
标志,它将检查是否init
认为它当前正在重新启动,如果不是,它将调用shutdown
来启动该过程)。
答案3
因为“reboot -f”不会进入运行级别 0 - 它告诉操作系统直接重新初始化 CPU。我最近的 Linux 机器上的手册页显示:
-f Force halt or reboot, don't call shutdown(8)
关机手册页有更多解释。
答案4
如果您intr
在 NFS 挂载上使用该选项,则shutdown -r now
应该能够终止等待 NFS IO 完成的进程。这可能会导致文件损坏,但可能不会比shutdown -f
创建文件更多。