BtrfsのRAID1はデータの異常を検知・修正できるか確認した

ryozi.hatenadiary.jp

これを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がよさそう。

btrfs.readthedocs.io

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らしい。