簡単に言うと:raid1の2つのディスクはbtrfsを使用します。チェックサムは、ファイルデータを読み取ったディスクに対してのみ確認されます。毎週クローンのように、すべてのチェックサムを強制的にチェックするにはどうすればよいですか?
raid1()の2つのディスクにbtrfsがあります/dev/sd{b,c}1
。デバッグをテストするためにディスクにファイルを書き、どのセクタに保存されているか探してから直接書き込みでコピーをしてみたのでコピーになるか/dev/sdc1
確認してみるのも書き込み/dev/sdb1
が良いテストになると思い、/dev/sdc1
変更が検出されるかどうか。
ファイルを読み取るときにエラーが発生せず、変更されたビットがまだ存在しますsdc1
(そうではありませんsdb1
)。を削除しsdb1
てインストールし、sdc1
ファイルを読み取る必要があるエラーを修正しました。
削除せずに定期的に(たとえば、週に1回、cronを使用して)、2つのディスクのチェックサムを確認するにはどうすればよいですか?
この状況を再現したい場合は、次のようにしました。
$ 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ファイルシステムをクリーンアップするために使用されます。正しいコピーがあれば、破損したブロックは自動的に回復されます。
DUP
変更するには別のコピーが必要なので、あなたと同じbtrfs RAID設定(または可能な設定)にのみ役立ちます。通常、タイマーからサービスとして実行することをお勧めします。マニュアルページではデフォルト値を月に一度推奨しますが、より頻繁に実行することもできます。