创建 mdadm RAID5(最初使用 3 个磁盘)

创建 mdadm RAID5(最初使用 3 个磁盘)

我进行了以下设置:3 个 10Tb 大小的 HDD,采用 LVM Raid5 配置,在 LUKS2 加密之上,在 BTRFS 文件系统内。

由于我的存储空间不足,我添加了另一个 16TB HDD(比 10TB 便宜),将其添加为 LVM 中的物理卷,将其添加到卷组中,运行重新同步,以便 LVM 可以调整我的 RAID 的大小。我将 btrfs 分区的大小调整为最大。

我注意到,当我写入 btrfs 大小后不久,在 dmesg 中开始出现错误:

[53034.840728] btrfs_dev_stat_print_on_error: 299 callbacks suppressed
[53034.840731] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 807, rd 0, flush 0, corrupt 0, gen 0
[53034.841289] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 808, rd 0, flush 0, corrupt 0, gen 0
[53034.844993] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 809, rd 0, flush 0, corrupt 0, gen 0
[53034.845893] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 810, rd 0, flush 0, corrupt 0, gen 0
[53034.846154] BTRFS error (device dm-15): bdev /dev/mapper/data errs: wr 811, rd 0, flush 0, corrupt 0, gen 0

我可以排除硬件问题,因为我在虚拟机中的另一台计算机上尝试过。当我将更大的文件(400Mb)写入文件系统时,dmesg 中的问题确实会出现,但不是像文本文件那样的文件 - 从 raid 的一个文件复制到另一个文件后,校验和也是错误的:

gallifrey raid5 # dd if=/dev/urandom of=original.img bs=40M count=100
0+100 records in
0+100 records out
3355443100 bytes (3.4 GB, 3.1 GiB) copied, 54.0163 s, 62.1 MB/s
gallifrey raid5 # cp original.img copy.img
gallifrey raid5 # md5sum original.img copy.img            
29867131c09cc5a6e8958b2eba5db4c9  original.img
59511b99494dd4f7cf1432b19f4548c4  copy.img

gallifrey raid5 # btrfs device stats /mnt/raid5 
[/dev/mapper/data].write_io_errs    811
[/dev/mapper/data].read_io_errs     0
[/dev/mapper/data].flush_io_errs    0
[/dev/mapper/data].corruption_errs  0
[/dev/mapper/data].generation_errs  0

我已经重新同步了整个 lvm raid,多次进行了 smartctl 检查(不应该是硬件问题,但仍然如此),btrfs scrub start -B /mnt/raid5并且btrfs check -p --force /dev/mapper/data没有返回任何错误。

发生在内核 5.15.11 和 5.10.27 上

lvm版本:

gallifrey raid5 # lvm version  
  LVM version:     2.02.188(2) (2021-05-07)
  Library version: 1.02.172 (2021-05-07)
  Driver version:  4.45.0

我的目标是未来对驱动器的写入不会损坏,而已经损坏的文件可以删除,但我想保存或至少不删除好的文件。

从 btrfs 的手册页来看,这write_io_errs意味着下面的块设备写入失败。就我而言,这意味着 lvm 和/或 luks2 是这里的问题。

有什么建议或需要更多信息吗?

干杯

答案1

我找不到这个问题的根本原因,所以我决定完全放弃 LVM 并用 mdadm 替换它——第一次尝试就很有效。

创建 mdadm RAID5(最初使用 3 个磁盘)

  1. 使用三个磁盘创建(因此 raid-devices = 3):

mdadm --create mediaraid --level=raid5 --raid-devices=3 /dev/sda /dev/sdb /dev/sde

  1. (可选)检查您可以以什么速度(内存速度,而不是磁盘 IO)使用什么加密:

cryptsetup benchmark /dev/md/mediaraid

  1. 可选择加密整个 RAID(这样的构造不需要单独解密每个磁盘。整个 RAID 的一个密码):

cryptsetup luksFormat --hash sha512 --cipher aes-xts-plain64 --key-size 512 /dev/md/mediaraid

  1. 打开 LUKS 设备(格式化它所必需的):

cryptsetup luksOpen /dev/md/mediaraid

  1. 使用 btrfs 格式化 RAID:

mkfs.btrfs /dev/mapper/data -f

通过 1 个磁盘和底层 mdadm RAID5 来增长/扩展 btrfs 文件系统

前提条件:文件系统未挂载且 LUKS 设备已关闭:

umount /mnt/raid5 && cryptsetup close /dev/mapper/data

  1. 将 /dev/sdc (替换为您的驱动器)添加到 mdadm 作为备用磁盘:

mdadm --add /dev/md/mediaraid /dev/sdc

  1. 验证它是否显示(将在底部,表示它是备用磁盘):

mdadm --detail /dev/md/mediaraid

笔记:接下来的步骤会触发 RAID 重塑,事情变得真实,我的 10TB 硬盘花了大约 25-30 小时来重塑并从 3 到 4 个磁盘同步。我不确定在 respahe 期间重新启动是否安全 - 但我不会推荐它或至少在虚拟机中尝试它。

  1. 将 RAID 增加到磁盘数量(大多数时候您想在此处写入磁盘总数,3 + 1 = 4,现在我有 4 个可用驱动器,我想使用其中的所有 4 个):

mdadm --grow --raid-devices=4 /dev/md/mediaraid

  1. 监视重塑的进度(第一个更好):

cat /proc/mdstat或者mdadm --detail /dev/md/mediaraid

完成重塑后:

  1. 或者,如果您使用 LUKS解密 RAID - 否则继续下一步:

cryptsetup luksOpen /dev/md/mediaraid data

  1. 挂载 btrfs 文件系统:

mount /dev/mapper/data /mnt/raid5

  1. 将 btrfs 文件系统增长到 max 或您想要的任何值:

btrfs filesystem resize max /mnt/raid5

  1. 可能没有必要,但我在 btrfs 文件系统调整大小后卸载并重新安装了整个东西

umount /mnt/raid5 && mount /dev/maper/data /mnt/raid5

完毕。

答案2

关于 raid5+dm-crypt+btrfs 的警告。

mdraid 比 lvm raid 好得多。但raid5是最差的raid级别。

Raid5 的写入性能和稳健性都很糟糕。在降级模式下更糟。

btrfs 本身是冗余的,因此 raid5 之上的 btrfs 是有线使用。

但 btrfs 也很脆弱且不稳健,具有有线冗余行为。

所以 raid5+dm-crypt+btrfs 是更可怕的设置 - 你的写入性能最差,最终丢失数据。

当一个磁盘发生故障时,在 raid5 上同步 10tb 将变为无穷大。或者当操作系统由于 bug 或电源故障而崩溃时,btrfs 会自行损坏或由于 dm-crypt、raid5 损坏(操作系统页面缓存、磁盘硬件缓存、raid 写入漏洞)

btrfs 有什么问题

https://arstechnica.com/gadgets/2021/09/examining-btrfs-linuxs-perpetually-half-finished-filesystem/

答案3

您的问题可能是 btrfs-progs 中的这个错误吗?

https://lore.kernel.org/linux-btrfs/[电子邮件受保护]/

相关内容