如何翻转文件中的单个位?

如何翻转文件中的单个位?

我想故意损坏一个文件以进行测试声称 btrfs 可以自我修复。文章讨论了关闭文件系统,通过“翻转”单个位来损坏照片,然后重新安装它。在较旧的文件系统中,这只会被破坏,但它应该在 btrfs 中自行修复。从理论上讲,这是有道理的,但我真的想测试一下。

问题是这篇文章没有解释如何做任何这些。
我该如何改变文件系统中特定部分的一个位?

我还应该指出的是,必须在离线文件系统上完成,以便 btrfs 不会将我的写入视为故意的。

编辑:虽然问题(和讨论)谈了很多关于 btrfs 的事情,但我想知道是否有独立于文件系统的方法来实现这种损坏(以便可以在不同的 RAID 类型/控制器/等之间进行比较)。

答案1

我不是专家,但该btrfs-progs软件包实际上包含一个专门用于执行此操作的工具,尽管您可能必须从源代码构建。无论如何,一旦您安装或构建了btrfs-progs,您就应该能够使用该工具btrfs-corrupt-block,btrfs 开发人员使用它来测试文件系统。

现在,就像我说的,我没有太多时间玩 btrfs,所以我不知道这个工具的具体用法。但有了它,你应该能够破坏离线文件系统,当读取损坏的文件时,它将被修复(假设您已经设置了 RAID 或其他东西,以便有另一个副本可以使用)。

答案2

@Oli - 嗨,我是 Jim Salter,就是那篇文章的作者。我当时使用的是虚拟机,这样事情就简单多了。我所做的就是从一个 JPEG 文件开始,然后在十六进制编辑器中打开它。我使用的特定编辑器是 Bless,你可以在 Ubuntu 中用一个简单的apt-get 安装 bless

在 Bless 中打开 JPEG 后,我多次按下向下翻页键以深入了解 JPEG 的“实质内容”,然后突出显示大约 50 个字节的数据,并将其复制并粘贴到文本编辑器(在我的情况下是 gEdit)中。这给了我一些可以搜索的内容。

现在我将 JPEG 保存到虚拟机上的每个阵列中。阵列后面的存储是一系列 .qcow2 文件。将 JPEG 保存到阵列后,我可以将与每个阵列关联的 .qcow2 文件加载到 Bless 中,并搜索它们 - 它们不是很大,只是 JPEG 和一些元数据 - 查找我突出显示并从 JPEG 中复制出来的 50 字节模式。瞧,我有要破坏的块!此时,我可以使用 Bless 手动编辑存储在虚拟机虚拟磁盘上的 JPEG 的各个字节 - 而且,重要的是,在完全一样在每个阵列上。

唯一的问题是,在本文测试的 RAID5 阵列的情况下,我必须确保编辑的是条带中数据的实际副本,而不是条带本身的奇偶校验 - 它是空阵列上的一个小映像,因此条带中的以下块中没有任何数据,使得奇偶校验块包含与数据块未更改的数据。如果我意外编辑了奇偶校验块而不是数据块,则映像将显示为未更改。

最后一点 - 您不需要虚拟机来执行此操作 - 您可以用相同的方式对裸机执行相同的操作;这只会更加麻烦,因为您需要处理整个原始驱动器,而不是使用漂亮的小 .qcow2 文件,并且您要么必须拉出驱动器并将它们放在另一台机器中,要么启动到实时(或只是备用)环境中来处理它们。(我正是以这种方式测试了 ZFS 的数据修复,但在真正的裸机上,7 年前我第一次对下一代文件系统感兴趣。)

希望这可以帮助!

答案3

  1. 获取块设备(例如)上单个扇区的值,/dev/sda1偏移量为 100 万个扇区偏移量(仅为示例):

    sudo dd if=/dev/sda1 of=/root/mysector bs=512 count=1 skip=1M
    

    这个任意选择的 1M * 512 字节偏移量只是为了确保您超出文件系统的元数据部分,并且实际上位于包含数据的扇区上。

  2. 使用十六进制编辑器更改内容来编辑原始扇区数据。例如需要一个适用于 Linux 的优秀十六进制编辑器

  3. 将扇区放回驱动器,并将ifof参数反转:

    sudo dd if=/root/mysector of=/dev/sda1 bs=512 count=1 seek=1M
    

答案4

sudo hdparm --fibmap /PATH/TO/FILE

将为您提供文件所在的 LBA。此后,您可以使用@gertvdijk 的答案。

相关内容