我在一台测试机器上安装了四个硬盘,并将它们配置为 RAID6。为了进行测试,我在安装卷并将数据写入其中时移除了其中一个驱动器 (/dev/sdk)。据我所知,这很有效。一些 I/O 错误被写入 /var/log/syslog,但卷仍在工作。不幸的是,命令“btrfs fi sh”没有显示任何丢失的驱动器。因此,我以降级模式重新安装了卷:“mount -t btrfs /dev/sdx1 -o remount,rw,degraded,noatime /mnt”。这样,有问题的驱动器就被报告为丢失。然后我再次插入硬盘(当然又是 /dev/sdk)并开始平衡:“btrfs filesystem balance start /mnt”。现在卷如下所示:
$ btrfs fi sh
Label: none uuid: 28410e37-77c1-4c01-8075-0d5068d9ffc2
Total devices 4 FS bytes used 257.05GiB
devid 1 size 465.76GiB used 262.03GiB path /dev/sdi1
devid 2 size 465.76GiB used 262.00GiB path /dev/sdj1
devid 3 size 465.76GiB used 261.03GiB path /dev/sdh1
devid 4 size 465.76GiB used 0.00 path /dev/sdk1
我如何重新启动 /dev/sdk1?运行“$ btrfs fi ba start /mnt”没有帮助。我尝试移除硬盘,但
$ btrfs de de /dev/sdk1 /mnt/
ERROR: error removing the device '/dev/sdk1' - unable to go below four devices on raid6
替换也不能这样进行:
$ btrfs replace start -f -r /dev/sdk1 /dev/sdk1 /mnt
/dev/sdk1 is mounted
还有其他方法可以更换/重新启动硬盘然后转换为 RAID 5 吗?
答案1
我已经在运行内核 4.3 的测试系统上重复了此测试。
像您一样,我创建了一个具有 4 个驱动器的 BTRFS RAID-6 阵列:
# mkfs.btrfs -m raid6 -d raid6 /dev/sdb /dev/sdc /dev/sdd /dev/sde
然后我将其安装起来并开始在其上写入数据。
在此期间,我移除了一个驱动器。当然,这导致日志和各处出现大量错误消息。但正如预期的那样,写入过程没有中断,也没有文件损坏。
更重要的是,BTRFS 增加了写入和刷新错误的错误计数 ( dev stats
)。因此,如果这是一个生产系统,它将受到监控,类似这样的 cronjob 会生成一封通知电子邮件:
[email protected]
@hourly /sbin/btrfs device stats /mnt/tmp | grep -vE ' 0$'
然后我就这么做了不是保持平衡,但擦洗,因为我希望 BTRFS 扫描整个文件系统并修复所有错误,这正是 scrub 所做的。
# btrfs scrub start -B /mnt/tmp
最后,我将 BTRFS 错误计数重置回零(如果该文件系统受到监控,这将停止警告消息):
# btrfs device stats -z /mnt/tmp
再次检查后没有发现其他错误。
并且我在测试时写入的文件是正确的。它的 MD5 值与原始文件匹配。
当然,每个测试都是不同的。如果为第三个驱动器 ( sdd
) 分配了一个新名称sdf
,如 ,则可以将其替换为其自身,从而有效地重新同步:
# btrfs replace start 3 /dev/sdf /mnt/tmp
顺便说一句,您提到删除驱动器。您不需要这样做,这只会混淆您的设备并且效率低下。replace 命令一直存在。
顺便说一句,在一种情况下,在我运行清理之前,当我尝试从受损文件系统读取数据时,BTRFS 导致测试系统崩溃。毕竟,与该文件系统的大多数部分不同,BTRFS RAID-5/RAID-6 仍被视为实验性的(尽管它不断得到改进,因此此声明可能已过时,这是针对 4.3 的)。但这只是一次,我重复了测试,它并没有崩溃。此外,这告诉我们,即使 BTRFS RAID-6 在仍处于实验阶段时可能会崩溃,但它可以保护您的数据,并且清理会可靠地告诉您是否有错误,因为它使用存储的校验和来验证文件。
我也重复了测试,导致 2 个驱动器出现错误。这是 RAID-6,因此这也按预期工作。清理后一切都很好。