btrfs raid5なNASを数年来運用してきて今ハマっているところをいくつかメモ。
4.20.6-200.fc29.x86_64
で確認した挙動がベース。悲しいかな、英語力がないのでbtrfs wikiには上げていない・ML追い切れていない。
degraded状態のマウント
障害ドライブを抜いた場合自動マウントできなくなり、fstabにnoauto,degraded
マウントオプションなどをつけてブート続行させることになる。
このとき、
- 同一パーティションのfstabエントリ(subvolとか)があり
- noautoでマウントされないfstabエントリがある
場合、mountしたパーティションはそれを即座にsystemdがアンマウントしてくれる。noautoでsystemd管理下なんだからユーザーが手動でマウントしてもumountすべし。systemdの気遣い溢れるsystemd-mount使え。
btrfs replace
btrfs replace
コマンドはreplace先のパーティション(ないしドライブ)がreplace元のパーティションより大きくないと弾かれる。素直にbtrfs device delete
してからbtrfs device add
すること。
btrfs replace後のresize
btrfs replace
はreplace先のパーティションに大きなパーティションを要求するのに、maxにリサイズしてくれない。
btrfs resize $DEVID:max /mnt
で拡張を忘れずに。
btrfs balanceのフィルタ
追加したドライブにraid5を伸ばす(3xData+Parityから4xData+Parityなど)ために使うフィルタは以下のようになる。
btrfs balance start -dstripes=1..$(($DRIVES-1)),convert=raid5 /mnt
stripesを変えて試したところ、btrfsはstripeとしてデータだけでなく、パリティもカウントする方式。そのためRAID5ではドライブ数-1
を対象に取る必要がある。
convert=raid5
は冗長に見えるが必要。これがないと元のstripe数を増やしてはくれない。
なぜドライブ増やしたのにD:P比率変わらないのか?と思ったらこれが原因だったようだ。
subvolは削除
balanceの実行時間は現状subvol数にO(n)以上で依存しているらしい。
CPU性能が制限されているNAS環境では影響が大きいので直ぐに必要ないsubvolはbtrfs send
で固めて削除しておいたほうがいい。
deadlineスケジューラ
HDDかつR/W並行で必要なNAS用途ではcfqにしている。が、cfqだと自環境ではbalance/scrubスループットがかなり下がるようで、deadline/noopにすることで何割かbalance速度が向上した。
noopとdeadlineは見えるほど変わらなかったためdeadlineに。
ビット破損時は inspect logical
scrubを怠ってクラッシュ繰り返していたりするとビット腐敗している場合があり、破損データ部分でbalanceが止まってしまう。
BTRFS info (device sda2): relocating block group 23021619249152 flags data|raid5
BTRFS warning (device sda2): csum failed root -9 ino 2152 off 440008704 csum 0xc2427410 expected csum 0x4cb01ad5 mirror 1
対応するファイルパスはbtrfs inspect-internal logical
で取得できる場合がある。blockgroup + offsetで論理アドレスが得られるようだ。
対象ファイルをすべてのsubvolから削除してsyncし、同じinspect logicalでinodeエラーが返るようになれば、対象アドレスを含むextentを除去できている可能性が高い。balanceが通ればOK。
btrfs scrubしよう
scrub時30MB/sしかでなくても泣かないで頑張る。