我想故意损坏文件以测试btrfs 可以自我修复的说法。这篇文章讨论了关闭文件系统,通过“翻转”一个位然后重新安装它来损坏照片。在较旧的文件系统中,这只会被破坏,但它应该会在 btrfs 中自行修复。从理论上讲,这是有道理的,但我真的很想测试一下。
问题是这篇文章没有解释如何做到这一点。
我将如何更改文件系统非常特定部分中的单个位?
我还应该指出,这必须在离线文件系统上完成,以便 btrfs 不会将我的写入视为故意的。
编辑:虽然问题(和讨论)谈论了很多关于 btrfs 的问题,但我想知道是否有实现这种损坏的文件系统独立方法(以便可以在不同的 RAID 类型/控制器/等之间进行比较)。
str*_*gee 20
我不是专家,但该btrfs-progs软件包实际上包含一个专门用于执行此操作的工具,尽管您可能必须从源代码构建。在任何情况下,一旦您安装或构建了btrfs-progs,您应该能够使用btrfs-corrupt-blockbtrfs 开发人员用来测试文件系统的工具。
现在,就像我说的,我没有太多时间玩 btrfs,所以我不知道这个工具的确切用法。但是有了它,您应该能够损坏脱机文件系统,这将在读取损坏的文件时修复(假设您已经设置了 RAID 或其他东西,以便有另一个副本可供使用)。
Jim*_*ter 17
@Oli - 嗨,我是 Jim Salter,实际上是写那篇文章的人。我正在使用虚拟机,这使事情变得更简单。我所做的是从一个 JPEG 文件开始,然后在十六进制编辑器中打开它。我使用的特别是 Bless,您可以使用简单的apt-get install bless在 Ubuntu 中安装它。
在 Bless 中打开 JPEG 后,我点击了几次页面以深入了解 JPEG 的“内容”,然后突出显示大约 50 字节的数据,并将其复制并粘贴到文本编辑器中(在我的案例,gEdit)。这给了我一些寻找的东西。
现在我将 JPEG 保存到 VM 上的每个数组中。阵列背后的存储是一系列 .qcow2 文件。一旦我将 JPEG 保存到数组中,我就可以将与每个数组关联的 .qcow2 文件加载到 Bless 中,然后搜索它们——它们不是很大,只是 JPEG 和一些元数据——对于那个 50 字节的模式我已经突出显示并从 JPEG 中复制出来。瞧,我有块要腐败!在这一点上,我可以使用 Bless 手动编辑存储在 VM 虚拟磁盘上的 JPEG 的各个字节 - 重要的是,在每个阵列上以完全相同的方式进行编辑。
唯一的问题是,在文章中测试的 RAID5 阵列的情况下,我必须确保我编辑了条带中数据的实际副本,而不是条带本身的奇偶校验 - 它是一个小图像否则为空数组,因此条带中的 FOLLOWING 块中没有任何数据,从而使奇偶校验块包含未从数据块更改的数据。如果我不小心编辑了奇偶校验块而不是数据块,图像将显示为未更改。
最后一点——你不需要虚拟机来做这件事——你可以用同样的方式用裸机做同样的事情;这只会更麻烦,因为您需要使用整个原始驱动器而不是漂亮的小型 .qcow2 文件,并且您要么必须拉动驱动器并将它们放在不同的机器中,要么启动到实时(或只是备用)环境以与它们混为一谈。(我完全以这种方式测试了 ZFS 的数据修复,但是在真正的裸机上,7 年前当我第一次对下一代文件系统感兴趣时。)
希望这可以帮助!
ger*_*ijk 16
获取块设备上单个扇区的值(例如/dev/sda1),偏移量为 100 万个扇区偏移(仅举个例子):
sudo dd if=/dev/sda1 of=/root/mysector bs=512 count=1 skip=1M
Run Code Online (Sandbox Code Playgroud)
这个任意选择的 1M * 512 字节偏移量只是为了确保您不在文件系统的元数据部分并且实际上在包含数据的扇区上。
通过使用十六进制编辑器更改内容来编辑原始扇区数据。例如,请参阅需要一个适用于 Linux 的良好十六进制编辑器。
将if和of参数颠倒后将扇区放回驱动器上:
sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
8424 次 |
| 最近记录: |