为什么你不能 fsck 一个挂载的分区?

mik*_*ike 43 unix filesystems

众所周知,您永远不应该 fsck 已安装的分区。我可以理解,如果文件系统是由 fsck写入的(例如,使用 -a 选项),这很容易导致损坏,但是为什么不能在已安装的磁盘上运行只读检查?

Kei*_*ith 32

基本问题是文件系统检查器(通常)不是文件系统的一部分。相反,它是一个单独的程序,与内核中的文件系统代码读取和写入同一个磁盘。因此,如果您在活动文件系统上运行 fsck,您将有两个不同的实体正在读取(并可能修改)相同的数据(磁盘),但它们不会以任何方式相互协调。正如其他人指出的那样,结果是大多数检查器希望在它们运行时没有其他人更改文件系统元数据。如果内核文件系统更改了检查器不期望的某些内容,他们将感到困惑和/或报告虚假错误。

有一些带有检查器的文件系统被明确设计为“在线”运行(即,当文件系统处于活动状态时)。较新版本的 FFS/UFS 通过对文件系统的最近快照(只读、时间点、写时复制副本)运行 fsck 来实现这一点。如果它发现问题,例如分配位图中的不一致,它会通过系统调用来纠正它们,而不是通过写入原始磁盘。这使它与活动文件系统协调。

NetApp 的 WAFL 也有一个在线检查工具。可能还有其他人。


Mat*_*ewC 28

从:

http://linux.die.net/man/8/fsck.ext3

“请注意,通常e2fsck在挂载的文件系统上运行是不安全的。唯一的例外是如果-n指定了选项,并且没有指定-c, -l, 或-L选项。但是,即使这样做是安全的,打印的结果e2fsck是如果文件系统已挂载,则无效。如果e2fsck询问您是否应该检查已挂载的文件系统,唯一正确的答案是“否”。只有真正知道自己在做什么的专家才应考虑在任何其他问题中回答这个问题道路。 ”

  • 一个例外:如果文件系统以只读方式挂载,并且 fsck 也处于只读模式,则一切正常 (3认同)

Eva*_*son 11

在以读写方式安装的分区上运行 fsck 会很愚蠢,即使 fsck 处于只读模式也是如此。文件系统将在 fsck 下更改,并且 fsck 从文件系统缓存的内存数据将变为无效(因此 fsck 将出现不一致)。您可以在只读模式下在只读安装的文件系统上运行 fsck 并获得有效结果。在只读挂载的文件系统上以读/写模式运行 fsck,如果 fsck 在其运行过程中对文件系统进行了更改,将导致内核看到文件系统结构在其下意外更改。那也会很糟糕。


Kam*_*iel 9

除了它可能会杀死您的 I/O 吞吐量这一事实之外,如果文件系统在被 fsck 处理时被修改,那么 fsck 无法跟踪更改并报告不一致。

某些文件系统(如 XFS)允许您在文件系统以读写方式挂载时执行一致性检查,但需要注意的是,可能会报告虚假错误。xfs_check建议在执行检查之前卸载文件系统或以只读方式安装文件系统。


sle*_*ske 6

好吧, fsck 的目的是报告文件系统不一致,即违反了不变量。

然而,这些检查中有许多涉及多个 FS 结构。如果有人正在修改FS(写数据),这些结构可能会暂时不同步。fsck 会将其视为不一致,即使这并不是真正的问题。fsck 无法判断不一致是暂时的,还是需要修复的永久性问题。所以这不可能工作(除非 FS 专门设计为允许在线检查。有些可以,但 ext3 不行)。