Linux 上的 fsck(8) 联机帮助页包括以下退出代码表:
The exit code returned by fsck is the sum of the following conditions:
0 No errors
1 Filesystem errors corrected
2 System should be rebooted
4 Filesystem errors left uncorrected
8 Operational error
16 Usage or syntax error
32 Checking canceled by user request
128 Shared-library error
退出代码 2 已分配给“系统应重新启动”,因此我们可以假设它有某种用途。然而,原则上fsck
可以在检查某种对系统操作根本不重要的外部拇指驱动器后返回此退出代码。像这样的非必要文件系统中的错误需要重新启动似乎很荒谬,特别是如果文件系统仅被fsck
.
“系统应该重新启动”退出代码实际上是什么意思?
这意味着有问题的文件系统在执行检查时已安装,
fsck
必须实际修改磁盘上的数据以修复错误,并且在不重新启动系统的情况下无法手动重新安装文件系统。主要情况是在根文件系统上发现(并修复)错误。除非您有一个非常花哨的 initramfs 或恢复环境来检查文件系统,否则您在检查时正在运行根文件系统(因此它是以只读方式安装的)。
出于性能原因,内核不会为已挂载的文件系统重新验证缓存的元数据(因为什么都没有(除了
fsck
应该为已挂载的文件系统更改内核以外的磁盘上的数据),所以如果fsck
必须修复一些元数据,它要么需要通知内核(它不能在大多数 UNIX 系统上),要么告诉用户卸载文件系统,然后再次挂载它以让内核获取修改后的元数据。唯一的方法是使用根文件系统实际上是重新启动系统本身。这确实意味着应该重新启动系统。
fsck
实现通常会小心地仅在必要时返回此代码:例如,e2fsck
如果它纠正了根文件系统上的错误,则在它被挂载时返回它(它通常以只读方式挂载,直到它被检查)。你不应该把它放在外部驱动器上。请注意,您应该检查正在使用的特定检查器的文档。例如,
fsck.fat
不使用相同的退出代码,并且盲目地假设退出代码 2 意味着重新启动可能会导致意外。