mike Asked: 2009-06-23 10:06:23 +0800 CST2009-06-23 10:06:23 +0800 CST 2009-06-23 10:06:23 +0800 CST 为什么你不能 fsck 一个挂载的分区? 772 众所周知,您永远不应该 fsck 已安装的分区。我可以理解如果fsck写入文件系统(例如,使用 -a 选项),这很容易导致损坏,但是为什么不能在已安装的磁盘上运行只读检查? unix filesystems 7 个回答 Voted Keith Smith 2009-06-23T13:39:35+08:002009-06-23T13:39:35+08:00 基本问题是文件系统检查器(通常)不是文件系统的一部分。相反,它是一个单独的程序,与内核中的文件系统代码读取和写入同一磁盘。因此,如果您在活动文件系统上运行 fsck,您将拥有两个不同的实体,它们正在读取(并可能修改)相同的数据(磁盘),但它们不会以任何方式相互协调。正如其他人所指出的那样,结果是大多数检查程序都希望在运行时没有其他人更改文件系统元数据。如果内核文件系统更改了检查器不期望的内容,他们会感到困惑和/或报告虚假错误。 有一些带有检查器的文件系统被明确设计为“在线”运行(即,当文件系统处于活动状态时)。较新版本的 FFS/UFS 通过针对文件系统的最新快照(只读、时间点、写时复制副本)运行 fsck 来做到这一点。如果它发现问题,例如分配位图中的不一致,它会通过系统调用来纠正它们,而不是通过写入原始磁盘。这使它与活动文件系统协调。 NetApp 的 WAFL 也有一个在线检查工具。可能还有其他人。 Best Answer MathewC 2009-06-23T10:20:04+08:002009-06-23T10:20:04+08:00 从: http://linux.die.net/man/8/fsck.ext3 “请注意,通常在已挂载的文件系统上运行是不安全的e2fsck。唯一的例外是如果指定了-n选项,并且未指定-c,-l或-L选项。但是,即使这样做是安全的,打印的结果e2fsck是如果文件系统已挂载则无效。如果e2fsck询问您是否应该检查已挂载的文件系统,唯一正确的答案是“不”。只有真正知道自己在做什么的专家才应该考虑在任何其他问题上回答这个问题方法。 ” Evan Anderson 2009-06-23T10:19:00+08:002009-06-23T10:19:00+08:00 即使 fsck 处于只读模式,在以读写方式安装的分区上运行 fsck 也是愚蠢的。文件系统将在 fsck 下更改,并且 fsck 从文件系统缓存的内存数据将变为无效(因此 fsck 将看到不一致)。您可以在只读模式下在只读挂载的文件系统上运行 fsck 并获得有效结果。在只读挂载的文件系统上以读/写模式运行 fsck,如果 fsck 在其运行过程中对文件系统进行更改,将导致内核看到文件系统结构在其下意外更改。那也会很糟糕。 Kamil Kisiel 2009-06-23T10:17:16+08:002009-06-23T10:17:16+08:00 除了它可能会扼杀您的 I/O 吞吐量这一事实之外,如果文件系统在 fsck 被修改时被修改,那么 fsck 无法跟踪更改并报告无常。 某些文件系统(如 XFS)允许您在文件系统以读写方式挂载时执行一致性检查,但需要注意的是可能会报告虚假错误。xfs_check建议在执行检查之前卸载文件系统或以只读方式安装文件系统。 sleske 2009-06-23T10:34:29+08:002009-06-23T10:34:29+08:00 好吧, fsck 的重点是报告文件系统不一致,即违反不变量。 然而,其中许多检查涉及不止一个 FS 结构。如果有人正在修改 FS(写入数据),这些结构可能会暂时不同步。fsck 会将此视为不一致,即使这并不是真正的问题。fsck 无法判断不一致是暂时的,还是需要修复的永久性问题。所以这不可能工作(除非 FS 是专门为允许在线检查而设计的。有些可以,但 ext3 不能)。 Sven 2009-06-23T10:16:49+08:002009-06-23T10:16:49+08:00 嗯,你可以。fsck -n /dev/sda1 会做到这一点,至少在 ext3 上是这样。我刚刚测试了它:) Zenham 2009-06-23T14:35:49+08:002009-06-23T14:35:49+08:00 你可以,就像你可以把手伸进一个移动的搅拌机,可能不会伤害自己,或者就像你可以从高楼上跳下来,同时瞄准你放在下面人行道上的一小堆垫子。 但是,除了测试你自己的死亡率之外,你为什么要这样做呢?因为当你的老板发现为什么邮件服务器现在不能识别根驱动器时,他肯定会再次测试它。
基本问题是文件系统检查器(通常)不是文件系统的一部分。相反,它是一个单独的程序,与内核中的文件系统代码读取和写入同一磁盘。因此,如果您在活动文件系统上运行 fsck,您将拥有两个不同的实体,它们正在读取(并可能修改)相同的数据(磁盘),但它们不会以任何方式相互协调。正如其他人所指出的那样,结果是大多数检查程序都希望在运行时没有其他人更改文件系统元数据。如果内核文件系统更改了检查器不期望的内容,他们会感到困惑和/或报告虚假错误。
有一些带有检查器的文件系统被明确设计为“在线”运行(即,当文件系统处于活动状态时)。较新版本的 FFS/UFS 通过针对文件系统的最新快照(只读、时间点、写时复制副本)运行 fsck 来做到这一点。如果它发现问题,例如分配位图中的不一致,它会通过系统调用来纠正它们,而不是通过写入原始磁盘。这使它与活动文件系统协调。
NetApp 的 WAFL 也有一个在线检查工具。可能还有其他人。
从:
http://linux.die.net/man/8/fsck.ext3
“请注意,通常在已挂载的文件系统上运行是不安全的
e2fsck
。唯一的例外是如果指定了-n
选项,并且未指定-c
,-l
或-L
选项。但是,即使这样做是安全的,打印的结果e2fsck
是如果文件系统已挂载则无效。如果e2fsck
询问您是否应该检查已挂载的文件系统,唯一正确的答案是“不”。只有真正知道自己在做什么的专家才应该考虑在任何其他问题上回答这个问题方法。 ”即使 fsck 处于只读模式,在以读写方式安装的分区上运行 fsck 也是愚蠢的。文件系统将在 fsck 下更改,并且 fsck 从文件系统缓存的内存数据将变为无效(因此 fsck 将看到不一致)。您可以在只读模式下在只读挂载的文件系统上运行 fsck 并获得有效结果。在只读挂载的文件系统上以读/写模式运行 fsck,如果 fsck 在其运行过程中对文件系统进行更改,将导致内核看到文件系统结构在其下意外更改。那也会很糟糕。
除了它可能会扼杀您的 I/O 吞吐量这一事实之外,如果文件系统在 fsck 被修改时被修改,那么 fsck 无法跟踪更改并报告无常。
某些文件系统(如 XFS)允许您在文件系统以读写方式挂载时执行一致性检查,但需要注意的是可能会报告虚假错误。
xfs_check
建议在执行检查之前卸载文件系统或以只读方式安装文件系统。好吧, fsck 的重点是报告文件系统不一致,即违反不变量。
然而,其中许多检查涉及不止一个 FS 结构。如果有人正在修改 FS(写入数据),这些结构可能会暂时不同步。fsck 会将此视为不一致,即使这并不是真正的问题。fsck 无法判断不一致是暂时的,还是需要修复的永久性问题。所以这不可能工作(除非 FS 是专门为允许在线检查而设计的。有些可以,但 ext3 不能)。
嗯,你可以。fsck -n /dev/sda1 会做到这一点,至少在 ext3 上是这样。我刚刚测试了它:)
你可以,就像你可以把手伸进一个移动的搅拌机,可能不会伤害自己,或者就像你可以从高楼上跳下来,同时瞄准你放在下面人行道上的一小堆垫子。
但是,除了测试你自己的死亡率之外,你为什么要这样做呢?因为当你的老板发现为什么邮件服务器现在不能识别根驱动器时,他肯定会再次测试它。