これをbtrfsでやってみた。結果としてはスクラブで検知してもう片方のミラーから復元する動きをした。
- イメージファイルをループバックデバイスとして登録し、BtrfsのRAID1を構成する
- イメージファイル上のデータを1byteいじる(HDDのデータ化けをエミュレーション)
- btrfsのスクラブで検知・復元できるか試す
ただ、壊れた際の縮退動作は確認できなかった。多分、手順が間違ってる、syncしないとダメとかありそう。ログに出ないだけでやっている気はするが。
内容自体は前回と一緒で面白みがない内容です。
環境情報。
ryozi@test3:~$ uname -a Linux test3 6.11.0-14-generic #15-Ubuntu SMP PREEMPT_DYNAMIC Fri Jan 10 23:48:25 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux ryozi@test3:~$ cat /etc/os-release PRETTY_NAME="Ubuntu 24.10" NAME="Ubuntu" VERSION_ID="24.10" VERSION="24.10 (Oracular Oriole)" VERSION_CODENAME=oracular ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=oracular LOGO=ubuntu-logo ryozi@test3:~$ btrfs --version btrfs-progs v6.6.3
btrfsを構成するまで一気にやる。
# ブロックデバイス用のファイルを用意 dd if=/dev/zero of=./vd1.img bs=1M count=1024 dd if=/dev/zero of=./vd2.img bs=1M count=1024 # ループバックデバイスとして対応させる sudo losetup /dev/loop0 ./vd1.img sudo losetup /dev/loop1 ./vd2.img # RAID1としてフォーマット sudo mkfs.btrfs -d raid1 -m raid1 -L btrfs-raid1 -n 32k -f /dev/loop{0,1} # マウント sudo mkdir /mnt/btrfs-raid1 sudo mount -L btrfs-raid1 /mnt/btrfs-raid1 # 確認 df /mnt/btrfs-raid1 # テストファイル書き込み echo "hello world 12345" | sudo tee /mnt/btrfs-raid1/hello.txt cat /mnt/btrfs-raid1/hello.txt # スクラブ動作確認(フォアグラウンド実行) sudo btrfs scrub start -B /mnt/btrfs-raid1
スクラブの結果。1ファイルなので一瞬で終わる。Error summaryもエラーは見つからなかったと出ているので問題なさそう。
$ sudo btrfs scrub start -B /mnt/btrfs-raid1 Starting scrub on devid 1 Starting scrub on devid 2 scrub done for 931b83df-6d56-4851-9c3e-221b7b917237 Scrub started: Wed Feb 19 14:57:44 2025 Status: finished Duration: 0:00:00 Total to scrub: 576.00KiB Rate: 576.00KiB/s (some device limits set) Error summary: no errors found
ここから壊すための下準備していく。書き込んだオフセットを探る(圧縮を有効にしていると見つからない可能性がある)
# オフセット位置を確認 grep -abo "hello world 12345" ./vd1.img grep -abo "hello world 12345" ./vd2.img
実行結果。オフセット位置がだいぶ違う。
ryozi@test3:~$ grep -abo "hello world 12345" ./vd1.img 30506561:hello world 12345 ryozi@test3:~$ grep -abo "hello world 12345" ./vd2.img 9535041:hello world 12345
./vd1.imgを壊す。
# オフセット値を設定 OFFSET1=30506561 # 検索文字の長さ PATTERN_LEN=17 # 前後 N byteを指定 N=16 # 内容確認 dd status=none if=./vd1.img bs=1 skip=$((OFFSET1 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C
実行結果。書き込まれている。
dd status=none if=./vd1.img bs=1 skip=$((OFFSET1 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C 00000000 00 00 00 12 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000010 68 65 6c 6c 6f 20 77 6f 72 6c 64 20 31 32 33 34 |hello world 1234| 00000020 35 0a 02 00 00 00 00 00 00 00 09 00 68 65 6c 6c |5...........hell| 00000030 6f 2e 74 78 74 08 00 00 00 00 00 00 00 08 00 00 |o.txt...........| 00000040 00 |.|
イメージファイル内にある"hello world 12345"の先頭の1文字を"i"にする
# 壊す! printf "i" | dd of=./vd1.img bs=1 seek=$((OFFSET1)) count=1 conv=notrunc # 壊したことを確認 dd status=none if=./vd1.img bs=1 skip=$((OFFSET1 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C
アクセスできるか確認。
cat /mnt/btrfs-raid1/hello.txt # ディスクキャッシュ削除 echo 3 | sudo tee /proc/sys/vm/drop_caches cat /mnt/btrfs-raid1/hello.txt
実行結果。普通に読めている?
ryozi@test3:~$ cat /mnt/btrfs-raid1/hello.txt hello world 12345 ryozi@test3:~$ echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryozi@test3:~$ cat /mnt/btrfs-raid1/hello.txt hello world 12345 ryozi@test3:~$ echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryozi@test3:~$ cat /mnt/btrfs-raid1/hello.txt hello world 12345
スクラブしてみる。-rで読み取り専用で検知のみできる。
sudo btrfs scrub start -r -B /mnt/btrfs-raid1
実行結果
$ sudo btrfs scrub start -r -B /mnt/btrfs-raid1 Starting scrub on devid 1 Starting scrub on devid 2 scrub done for 931b83df-6d56-4851-9c3e-221b7b917237 Scrub started: Wed Feb 19 15:16:56 2025 Status: finished Duration: 0:00:00 Total to scrub: 576.00KiB Rate: 576.00KiB/s (some device limits set) Error summary: verify=8 Corrected: 8 Uncorrectable: 0 Unverified: 0 WARNING: errors detected during scrubbing, corrected
異常を検知したっぽい?
サマリの意味は以下。
https://btrfs.readthedocs.io/en/latest/btrfs-scrub.html#man-scrub-start
- Corrected: 修復された不良ブロック数
- Uncorectable: 検出したものの、他のコピーをつかって修復できなかった
- Unverified: エラーなどで検証できなかった、一時的なエラーでリトライでうまくいった場合など
journalctl -bを見てみると、検知したログがベロっと出ていた。
Feb 19 15:19:12 test3 sudo[9658]: ryozi : TTY=pts/0 ; PWD=/home/ryozi ; USER=root ; COMMAND=/usr/bin/btrfs scrub start -r -B /mnt/btrfs-raid1 Feb 19 15:19:12 test3 sudo[9658]: pam_unix(sudo:session): session opened for user root(uid=0) by ryozi(uid=1000) Feb 19 15:19:12 test3 kernel: BTRFS info (device loop0): scrub: started on devid 1 Feb 19 15:19:12 test3 kernel: BTRFS info (device loop0): scrub: started on devid 2 Feb 19 15:19:12 test3 kernel: BTRFS warning (device loop0): tree block 30801920 mirror 1 has bad csum, has 0x480eded1 want 0x50835ea6 Feb 19 15:19:12 test3 kernel: scrub_stripe_report_errors: 14 callbacks suppressed Feb 19 15:19:12 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:19:12 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:19:12 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:19:12 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:19:12 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:19:12 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:19:12 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:19:12 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:19:12 test3 kernel: BTRFS info (device loop0): scrub: finished on devid 2 with status: 0 Feb 19 15:19:12 test3 kernel: BTRFS info (device loop0): scrub: finished on devid 1 with status: 0 Feb 19 15:19:12 test3 sudo[9658]: pam_unix(sudo:session): session closed for user root
正常化してみる。スクラブを読み取り専用オプションを外して実行すると復元も試みてくれるらしい。
sudo btrfs scrub start -B /mnt/btrfs-raid1
実行結果やログからは読み取り専用時と変わりがないように見えるが・・・。
$ sudo btrfs scrub start -B /mnt/btrfs-raid1 Starting scrub on devid 1 Starting scrub on devid 2 scrub done for 931b83df-6d56-4851-9c3e-221b7b917237 Scrub started: Wed Feb 19 15:20:19 2025 Status: finished Duration: 0:00:00 Total to scrub: 576.00KiB Rate: 576.00KiB/s (some device limits set) Error summary: verify=8 Corrected: 8 Uncorrectable: 0 Unverified: 0 WARNING: errors detected during scrubbing, corrected $ journalctl -b Feb 19 15:20:19 test3 sudo[9667]: ryozi : TTY=pts/0 ; PWD=/home/ryozi ; USER=root ; COMMAND=/usr/bin/btrfs scrub start -B /mnt/btrfs-raid1 Feb 19 15:20:19 test3 sudo[9667]: pam_unix(sudo:session): session opened for user root(uid=0) by ryozi(uid=1000) Feb 19 15:20:19 test3 kernel: BTRFS info (device loop0): scrub: started on devid 2 Feb 19 15:20:19 test3 kernel: BTRFS info (device loop0): scrub: started on devid 1 Feb 19 15:20:19 test3 kernel: BTRFS warning (device loop0): tree block 30801920 mirror 1 has bad csum, has 0x480eded1 want 0x50835ea6 Feb 19 15:20:19 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:20:19 test3 kernel: BTRFS info (device loop0): scrub: finished on devid 2 with status: 0 Feb 19 15:20:19 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:20:19 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:20:19 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:20:19 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:20:19 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:20:19 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:20:19 test3 kernel: BTRFS error (device loop0): fixed up error at logical 30801920 on dev /dev/loop0 physical 30801920 Feb 19 15:20:19 test3 kernel: BTRFS info (device loop0): scrub: finished on devid 1 with status: 0
イメージファイルを確認してみると・・・
dd status=none if=./vd1.img bs=1 skip=$((OFFSET1 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C
実行結果。イメージファイルを覗いてみると修復されている。おおー
$ dd status=none if=./vd1.img bs=1 skip=$((OFFSET1 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C 00000000 00 00 00 12 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000010 68 65 6c 6c 6f 20 77 6f 72 6c 64 20 31 32 33 34 |hello world 1234| 00000020 35 0a 02 00 00 00 00 00 00 00 09 00 68 65 6c 6c |5...........hell| 00000030 6f 2e 74 78 74 08 00 00 00 00 00 00 00 08 00 00 |o.txt...........| 00000040 00 |.| 00000041
修復不可能な傷を負わせたらどうなるのか…コピーも壊してみる
OFFSET2=9535041 # 壊す前に確認 dd status=none if=./vd1.img bs=1 skip=$((OFFSET1 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C dd status=none if=./vd2.img bs=1 skip=$((OFFSET2 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C # 壊す! printf "i" | dd of=./vd1.img bs=1 seek=$((OFFSET1)) count=1 conv=notrunc printf "j" | dd of=./vd2.img bs=1 seek=$((OFFSET2)) count=1 conv=notrunc # 壊したことを確認 dd status=none if=./vd1.img bs=1 skip=$((OFFSET1 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C dd status=none if=./vd2.img bs=1 skip=$((OFFSET2 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C
実行結果。
ryozi@test3:~$ dd status=none if=./vd1.img bs=1 skip=$((OFFSET1 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C 00000000 00 00 00 12 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000010 69 65 6c 6c 6f 20 77 6f 72 6c 64 20 31 32 33 34 |iello world 1234| 00000020 35 0a 02 00 00 00 00 00 00 00 09 00 68 65 6c 6c |5...........hell| 00000030 6f 2e 74 78 74 08 00 00 00 00 00 00 00 08 00 00 |o.txt...........| 00000040 00 |.| 00000041 ryozi@test3:~$ dd status=none if=./vd2.img bs=1 skip=$((OFFSET2 - N)) count=$((PATTERN_LEN + N * 3)) | hexdump -C 00000000 00 00 00 12 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000010 6a 65 6c 6c 6f 20 77 6f 72 6c 64 20 31 32 33 34 |jello world 1234| 00000020 35 0a 02 00 00 00 00 00 00 00 09 00 68 65 6c 6c |5...........hell| 00000030 6f 2e 74 78 74 08 00 00 00 00 00 00 00 08 00 00 |o.txt...........| 00000040 00 |.| 00000041
壊してもなぜか読める…
$ echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryozi@test3:~$ cat /mnt/btrfs-raid1/hello.txt hello world 12345
スクラブしてみると、復元できなかった模様
sudo btrfs scrub start -B /mnt/btrfs-raid1
ryozi@test3:~$ sudo btrfs scrub start -B /mnt/btrfs-raid1 Starting scrub on devid 1 Starting scrub on devid 2 scrub done for 99dd3b3c-e549-404d-8ac5-71d270672d58 Scrub started: Wed Feb 19 15:44:59 2025 Status: finished Duration: 0:00:00 Total to scrub: 576.00KiB Rate: 576.00KiB/s (some device limits set) Error summary: verify=16 Corrected: 0 Uncorrectable: 16 Unverified: 0 ERROR: there are uncorrectable errors
journalctl -b もこの結果
Feb 19 15:44:59 test3 sudo[9993]: ryozi : TTY=pts/0 ; PWD=/home/ryozi ; USER=root ; COMMAND=/usr/bin/btrfs scrub start -B /mnt/btrfs-raid1 Feb 19 15:44:59 test3 sudo[9993]: pam_unix(sudo:session): session opened for user root(uid=0) by ryozi(uid=1000) Feb 19 15:44:59 test3 kernel: BTRFS info (device loop0): scrub: started on devid 2 Feb 19 15:44:59 test3 kernel: BTRFS info (device loop0): scrub: started on devid 1 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): tree block 30474240 mirror 2 has bad csum, has 0xe288ed89 want 0xd292ec66 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): tree block 30474240 mirror 2 has bad csum, has 0xe288ed89 want 0xfa056dfe Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): tree block 30474240 mirror 1 has bad csum, has 0xe288ed89 want 0xfa056dfe Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): tree block 30474240 mirror 1 has bad csum, has 0xe288ed89 want 0xd292ec66 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): tree block 30474240 mirror 2 has bad csum, has 0xe288ed89 want 0xd292ec66 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): tree block 30474240 mirror 1 has bad csum, has 0xe288ed89 want 0xfa056dfe Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): tree block 30474240 mirror 2 has bad csum, has 0xe288ed89 want 0xfa056dfe Feb 19 15:44:59 test3 kernel: scrub_stripe_report_errors: 6 callbacks suppressed Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop1 physical 9502720 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): tree block 30474240 mirror 1 has bad csum, has 0xe288ed89 want 0xd292ec66 Feb 19 15:44:59 test3 kernel: scrub_stripe_report_errors: 6 callbacks suppressed Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop0 physical 30474240 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop1, physical 9502720: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop1 physical 9502720 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop0, physical 30474240: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop0 physical 30474240 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop1, physical 9502720: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop0, physical 30474240: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop0 physical 30474240 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop0, physical 30474240: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop0 physical 30474240 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop0, physical 30474240: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop0 physical 30474240 Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop1 physical 9502720 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop0, physical 30474240: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop1, physical 9502720: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop0 physical 30474240 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop0, physical 30474240: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS error (device loop0): unable to fixup (regular) error at logical 30474240 on dev /dev/loop0 physical 30474240 Feb 19 15:44:59 test3 kernel: BTRFS warning (device loop0): header error at logical 30474240 on dev /dev/loop0, physical 30474240: metadata leaf (level 0) in tree 5 Feb 19 15:44:59 test3 kernel: BTRFS info (device loop0): scrub: finished on devid 1 with status: 0 Feb 19 15:44:59 test3 kernel: BTRFS info (device loop0): scrub: finished on devid 2 with status: 0 Feb 19 15:44:59 test3 sudo[9993]: pam_unix(sudo:session): session closed for user root
この状態でアンマウントして再マウントしようとしてみたが失敗するようになってしまった。
$ sudo umount /mnt/btrfs-raid1
ryozi@test3:~$ sudo mount -L btrfs-raid1 /mnt/btrfs-raid1
mount: /mnt/btrfs-raid1: can't read superblock on /dev/loop1.
dmesg(1) may have more information after failed mount system call.
journalctl -b を見るとダメな様子だった。
Feb 19 15:52:17 test3 sudo[10070]: ryozi : TTY=pts/0 ; PWD=/home/ryozi ; USER=root ; COMMAND=/usr/bin/mount -L btrfs-raid1 /mnt/btrfs-raid1 Feb 19 15:52:17 test3 sudo[10070]: pam_unix(sudo:session): session opened for user root(uid=0) by ryozi(uid=1000) Feb 19 15:52:17 test3 kernel: BTRFS info (device loop0): first mount of filesystem 99dd3b3c-e549-404d-8ac5-71d270672d58 Feb 19 15:52:17 test3 kernel: BTRFS info (device loop0): using crc32c (crc32c-intel) checksum algorithm Feb 19 15:52:17 test3 kernel: BTRFS info (device loop0): using free-space-tree Feb 19 15:52:17 test3 kernel: BTRFS warning (device loop0): checksum verify failed on logical 30474240 mirror 1 wanted 0xe288ed89 found 0xfa056dfe level 0 Feb 19 15:52:17 test3 kernel: BTRFS warning (device loop0): checksum verify failed on logical 30474240 mirror 2 wanted 0xe288ed89 found 0xd292ec66 level 0 Feb 19 15:52:17 test3 kernel: BTRFS warning (device loop0): failed to read fs tree: -5 Feb 19 15:52:17 test3 kernel: BTRFS error (device loop0): open_ctree failed Feb 19 15:52:17 test3 sudo[10070]: pam_unix(sudo:session): session closed for user root
これだと1ファイルが壊れただけで全体が読めなくなってしまうのでは、という気がした。さすがにそんなことはなくて何らかの復元方法は持ってると思うけど… ちょっと不安は残るものの、いったんここまで。
後始末。
sudo umount /mnt/btrfs-raid1
sudo losetup -d /dev/loop{0,1}
rm -f ./vd{1,2}.img
感想
btrfsにはそういう仕組みがあるということで試したが期待通り動作してくれてよかった。スーパーブロックとかメタデータとかの異常はどうなんだとか細かいところはあるけどとりあえず…
ちょっと面白かったのは、2つのディスクの書き込み先で、Linux MDでは同じオフセット位置だったが、btrfsでは異なるオフセット位置だった。
RAIDを組む際のHDDは同じロットのものを使うと同じタイミングで故障するから、違うロットを使う、という話はよく聞いたことがある。 ただ、同じロットでも違う場所なら故障タイミングがずれるから、わざとずらしているのかな?とかちょっと思った。(多分そんなことはなくて、外周より内周のほうが遅くなるので、それを平坦化するために場所を散らしているだけとか?)
ちょっと関係ないが、LUKS(の実装のdm-crypt)で暗号化も行おうとしていたが、TPMでパスフレーズを自動入力させようとしたら詰まってしまって困っている。LUKS+btrfs vs ZFSの組み込みの暗号化と整合性の性能比較して、いい加減、最高のNASの運用を始めたい。
運用っていってもただSamba入れて動かすだけですけど…
おまけ
btrfs scrub start -Bのexit statusコード
https://btrfs.readthedocs.io/en/latest/btrfs-scrub.html#exit-status
- 0: 正常終了 (エラーなし、もしくは、コピーから復元成功を含む)
- 1: スクラブを実行できなかった
- 2: 再開するものがなかった
- 3: スクラブで修復不可能なエラーが見つかった
実際はバックグラウンド実行にするんだろうか?(異常時に通知とかやりたい場合どうすれば?)
btrfsのチェックサム
tl;dr: チェックサムで完全性を保っている。デフォルト(crc32c)のままでよい。ただ改ざんに弱いので、それが気になるならxxhashがよさそう。
crc32c xxhash, sha256, blake2 が選べる。チェックサムはあるだけで偉い。改ざん検知も大事ではあるが、それよりは書き込んだデータが化けていないかどうかが重要なので、強度は若干許せるはず。そう考えると省エネなものを選びたい。
なお、manにある通りcrc32cが速いらしい。以下はbtrfsのチェックサムはどれが一番パフォーマンスが良いかを調べた時のログ。
https://vlasov.pro/en/p/btrfs-checksum/
crc32cが最もよかったそうだ。
https://www.reddit.com/r/btrfs/comments/18oje8n/comment/kel8vl6/
コマンドベースのベンチマークなのであまり参考にならないが、xxhsum(-H1=64bit)が最も早く、次にcrc32cらしい。