我进行了以下设置: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 个磁盘)
- 使用三个磁盘创建(因此 raid-devices = 3):
mdadm --create mediaraid --level=raid5 --raid-devices=3 /dev/sda /dev/sdb /dev/sde
- (可选)检查您可以以什么速度(内存速度,而不是磁盘 IO)使用什么加密:
cryptsetup benchmark /dev/md/mediaraid
- 可选择加密整个 RAID(这样的构造不需要单独解密每个磁盘。整个 RAID 的一个密码):
cryptsetup luksFormat --hash sha512 --cipher aes-xts-plain64 --key-size 512 /dev/md/mediaraid
- 打开 LUKS 设备(格式化它所必需的):
cryptsetup luksOpen /dev/md/mediaraid
- 使用 btrfs 格式化 RAID:
mkfs.btrfs /dev/mapper/data -f
通过 1 个磁盘和底层 mdadm RAID5 来增长/扩展 btrfs 文件系统
前提条件:文件系统未挂载且 LUKS 设备已关闭:
umount /mnt/raid5 && cryptsetup close /dev/mapper/data
- 将 /dev/sdc (替换为您的驱动器)添加到 mdadm 作为备用磁盘:
mdadm --add /dev/md/mediaraid /dev/sdc
- 验证它是否显示(将在底部,表示它是备用磁盘):
mdadm --detail /dev/md/mediaraid
笔记:接下来的步骤会触发 RAID 重塑,事情变得真实,我的 10TB 硬盘花了大约 25-30 小时来重塑并从 3 到 4 个磁盘同步。我不确定在 respahe 期间重新启动是否安全 - 但我不会推荐它或至少在虚拟机中尝试它。
- 将 RAID 增加到磁盘数量(大多数时候您想在此处写入磁盘总数,3 + 1 = 4,现在我有 4 个可用驱动器,我想使用其中的所有 4 个):
mdadm --grow --raid-devices=4 /dev/md/mediaraid
- 监视重塑的进度(第一个更好):
cat /proc/mdstat
或者mdadm --detail /dev/md/mediaraid
完成重塑后:
- 或者,如果您使用 LUKS解密 RAID - 否则继续下一步:
cryptsetup luksOpen /dev/md/mediaraid data
- 挂载 btrfs 文件系统:
mount /dev/mapper/data /mnt/raid5
- 将 btrfs 文件系统增长到 max 或您想要的任何值:
btrfs filesystem resize max /mnt/raid5
- 可能没有必要,但我在 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 中的这个错误吗?