如何在 btrfs 中在线验证校验和?

如何在 btrfs 中在线验证校验和?

长话短说:raid1 中的两个磁盘使用 btrfs。仅针对从中读取文件数据的磁盘验证校验和。如何偶尔强制验证所有校验和,例如在每周的 cron 中?


我在 raid1 ( ) 的 2 个磁盘上有一个 btrfs /dev/sd{b,c}1。为了测试纠错,我将一个文件写入磁盘,查找它存储在哪个扇区,并通过直接写入/dev/sdc1.由于我安装了/dev/sdb1,我认为写入将/dev/sdc1是一个很好的测试,看看它是否完全复制,以及是否会检测到更改。

读取文件时,没有发生错误,并且更改的位仍然存在于sdc1(它不存在于sdb1)中。直到卸载sdb1并安装sdc1,然后读取文件,错误才得到纠正。

如何定期验证两个磁盘上的校验和(例如每周一次,使用 cron)而无需卸载?

如果你想复制这种情况,我就是这样做的:

$ mount /dev/sdb1 /mnt && cd /mnt
$ yes | head -100 > yes
$ filefrag -e yes # Look up in which sector the file is stored
$ echo x | dd of=/dev/sdc seek=$((offset*4096)) bs=1 count=1 # offset*sector_size

$ grep x yes # no results, no errors
$ dmesg | tail # nothing relevant
$ dd if=/dev/sdc skip=$((offset*4096)) bs=1 count=10 # To verify the x is actually there, and it is

$ # Mount sdc1 instead of sdb1
$ cd .. && umount mnt && mount /dev/sdc1 mnt
$ grep x yes # no results, no errors
$ dmesg | tail
[3695509.439534] BTRFS warning (device sdc1): csum failed ino 466 off 469331968 csum 444003100 expected csum 3637724482
[3695509.555018] BTRFS warning (device sdc1): csum failed ino 466 off 469331968 csum 444003100 expected csum 3637724482
[3695509.590762] BTRFS info (device sdc1): read error corrected: ino 466 off 469331968 (dev /dev/sdc1 sector 3692728)
# Finally, it was detected and silently corrected

我的内核版本是 4.9。

答案1

BTRFS磨砂膏填补了这个角色:

BTRFS磨砂膏 用于清理 btrfs 文件系统,该系统将从所有设备读取所有数据和元数据块并验证校验和。如果有正确的副本可用,则自动修复损坏的块。

它仅对像您这样的 btrfs RAID 设置(或可能的设置)有用DUP,因为它需要另一个副本来纠正。通常建议将其作为计时器上的服务来运行。手册页建议默认每月一次,但也可以更频繁地进行。

相关内容