如何创建外部自修复 btrfs USB HDD RAID 1 阵列?

如何创建外部自修复 btrfs USB HDD RAID 1 阵列?

该硬件是外部 2TB 总线供电的 USB 磁盘。

我想要的是 2x 1TB btrfs 的 RAID1 设置。

这可能吗? 怎么做?

__

动机

我使用 RAID1 btrfs 的动机是因为我只是阅读文章谈论这样的设置将如何自动修复损坏的文件当一个卷上的校验和失败时。

仅翻转一位即可发生的情况的示例.jpeg(我为此使用了 vim。:%!xxd -b

在此处输入图片描述 在此处输入图片描述

答案1

这个答案可以作为我如何实现这一点的指南。

我的设置是:

  • 1 个外部 USB 驱动器(1 个外壳,带 1 个驱动器)

如何:

  1. 我使用 创建了一个 GPT 分区表,其中包含两个大小相同的主 btrfs 分区gparted。您可以随意命名分区,创建 RAID 时名称无论如何都会丢失。

    在此处输入图片描述

  2. 获取设备 ID:

    $ sudo btrfs filesystem show
    Label: none  uuid: 607b4153-7aa9-444d-bc15-c5fe9038f255
        Total devices 2 FS bytes used 28.00KB
        devid    1 size 1.82TB used 2.03GB path /dev/sdc
        *** Some devices missing
    Label: 'Max'  uuid: b6647427-9f27-4157-b47b-77f74054b885
        Total devices 1 FS bytes used 28.00KB
        devid    1 size 931.49GB used 2.04GB path /dev/sdc1        // first one
    Label: 'Moritz'  uuid: d0eaf97d-249e-4b7c-88a5-b60cc2d489d9
        Total devices 1 FS bytes used 28.00KB
        devid    1 size 931.49GB used 2.04GB path /dev/sdc2        // second one
    
  3. 创建 RAID:

    $ sudo mkfs.btrfs -L RAID-Datensicherung -m raid1 -d raid1 /dev/sdc1 /dev/sdc2
    
  4. 由于您还无法写入,因此您需要成为新设备的所有者并更改权限。在 natiilus 或其他程序中安装该设备,然后:

    $ cd /media
    $ sudo chown julien:julien RAID-Datensicherung
    $ sudo chmod 700 RAID-Datensicherung
    
  5. 卸载并重新安装设备后,您可以通过拖放操作复制文件。

在 Nautilus 中安装设备时会显示两个卷,但只有其中一个显示为已安装。

在此处输入图片描述

一旦您从另一个外部驱动器将文件复制到磁盘,您就会发现,由于 RAID 镜像,RAID 卷的写入速度是其他外部设备的读取速度的两倍。

在此处输入图片描述

我仍然需要找出如何检查自我修复是否有效,并将相应地更新这个答案。

更新 1

用户@Oli 正在询问相关问题关于只翻转一位就像他一样,我需要这样做隐秘的,即没有我的互动的时间戳或类似的东西。

如果在文件系统挂载时更改了某个位,则更改会被记录并立即镜像。更改/“损坏”的文件被视为单纯的更新 - 而不是比特罗

答案2

我假设您使用 2 个外部驱动器或 1 个包含 2 个或更多驱动器的外壳。理论上,设备是通过 USB 还是 SATA 连接的并不重要,btrfs 应该能够在找到各个驱动器/分区后组装阵列。

你应该看看btrfs 内核 维基。第一个用例似乎涵盖了您的要求:

mkfs.btrfs -m raid1 -d raid1 /dev/sda1 /dev/sdb1

但我不太清楚自我修复部分。我只知道 ZFS 有这个功能。

答案3

关于模拟 BitRot,为什么没有人告诉我可以dd在离线和在线 BTRFS 上使用 linux 命令轻松完成它?

https://man7.org/linux/man-pages/man1/dd.1.html

让我解释一下:

  1. 查找 BTRFS 使用的设备,假设它们是 /dev/sda1 和 /dev/sdb1,仅作为示例。
  2. 只需运行dd命令即可覆盖其中一个设备的一小部分

例如,在位置 N(以字节为单位)用随机数据仅覆盖一个字节:

dd bs=1 count=1 if=/dev/random of=/dev/sda1 seek=N

参数解释:

  • seek=N指示从设备开始写入的位置(用以字节为单位的位置替换 N
  • bs=1表示单位是字节的倍数
  • count=1表示只bs写入一个块(大小)
  • if=...指示从哪里读取数据(如果...是,/dev/random则是随机数据)
  • of=/dev/sda1表示写入数据的位置(用设备路径替换,而不是挂载路径)

就是这样,您已经在设备中的某个位置(在 BTRFS 链控制之外,又名 BitRot 模拟)写入了随机数据。

另一件事是如何计算 N 是否在特定文件内......但由于想要的是测试 BTRFS 的 Anti-BitRot,因此可以使用 BTRFS 中的随机 N 进行测试,其中包含一个巨大的文件(90%已使用,~10%可用)。

dd为了测试模拟的 BitRot 是否得到修复,您可以在命令前和命令后创建 MD5 总数dd,它们必须匹配。

所以:

  1. 创建两个设备的 BTRFS raid1(如果它们的大小不是很大则更好,只是为了测试 BTRFS 的 Anti-BitRot)
  2. 写入一个包含随机数据的文件,其大小约为 BTRF 总卷大小的 90%
  3. 创建文件的 MD5 值
  4. 执行dd命令
  5. 创建文件的 MD5 值
  6. 比较两者的 MD5 值,它们必须匹配

无论执行命令时 BTRFS 是在线还是离线(即已安装或未安装)dd,由于它是在其中一个设备上完成的,而不是在 BTRFS 的安装点上完成的,因此 BTRFS 不会对该写入有任何了解(模拟 BitRot)。

希望这可以帮助。

相关内容