如何强制 ext3 分区进入“错误”状态?

use*_*834 7 ext3 testing

我有一个脚本,其中 fsck 被调用,以防文件系统仅处于“错误”状态。我想测试一下。不幸的是,我不知道如何在 ext3 分区上强制“错误”状态。

我唯一的想法是先在挂载的分区上运行 fsck。一旦出现文件系统可能损坏的警告,我希望它会有所帮助。需要尝试。同时,可能有人已经知道答案了吗?

use*_*834 10

好吧,这里是: debugfs -w -R "ssv state 2" /dev/sda1

debugfs 是 e2fsprogs 包的一部分,用于对 ext2/3 文件系统进行低级访问。

-w - work in r/w;
-R - run one command and exit;
ssv - set superblock value, self-describing;
state - just a name of the field containing state of filesystem.
Run Code Online (Sandbox Code Playgroud)

代码是:

0 - not clean
1 - clean
2 - not clean with errors
Run Code Online (Sandbox Code Playgroud)


loo*_*ver 4

我在虚拟机中简单地摆弄了这个。我最初的想法是用核武器攻击分区的主超级块。这样做不会导致 dumpe2fs 报告“错误”的“文件系统状态”,但它(显然)确实会破坏您的分区(“超级块中的错误幻数”)......所以也许这就是您测试所需的全部内容。在此状态下针对分区运行 fsck 并检查 的值$?将报告状态 8(操作错误)。

无论如何,这很危险,我不建议在任何拥有您关心的数据的系统上这样做。像我一样在虚拟机中尝试一下。

您可以获得有关文件系统的一些信息,如下所示:

dumpe2fs /dev/sda1 | egrep "state|superblock|Block size"
Run Code Online (Sandbox Code Playgroud)

您将看到文件系统有一个主超级块和一些备份超级块。如果您准备破坏某些东西,请注意该输出中的一些内容:

  • “块大小:X”:记下X
  • “Y 处的主超级块”:记下 Y
  • “Z 处备份超级块”:记下至少一个 Z

现在销毁你的主要超级块:

dd if=/dev/zero of=/dev/sda1 bs=X count=1 seek=Y
Run Code Online (Sandbox Code Playgroud)

恭喜!您的文件系统现在已损坏。

如果已安装则卸载它:

umount /dev/sda1
Run Code Online (Sandbox Code Playgroud)

然后运行 ​​fsck 并指定前面提到的备份超级块之一的位置:

fsck -b Z /dev/sda1
Run Code Online (Sandbox Code Playgroud)

现在将 /dev/sda1 安装到某处,您应该可以恢复正常工作了。