やるきなし

2016/07/02 23:54 / RAID5 resync が起動時に始まってしまい,いつまでたっても起動しない

Root file system を RAID5 (software RAID w/Intel Rapid Storage Technology)にしていて,再起動時にうまく clean な状態で再起動できず verify flag が立ってしまうと,initramfs の時点で resync が開始されてしまい,いつまで経ってもまともに起動しないという話.ファイルサーバなのでさくっと起動してもらわないと困る.

なんとかする方法は以下.

これでひとまずは起動するはず.起動した後は

# echo 5000 > /sys/block/md126/md/sync_speed_max
# echo idle > /sys/block/md126/md/sync_action
# ionice -c 3 -p (md126_resync's pid)

とかをしてじっくり resync する.resync の状況は /proc/mdstat で

md126 : active raid5 sda[3] sdb[2] sdc[1] sdd[0]
      8351277056 blocks super external:/md127/0 level 5, 128k chunk, algorithm 0 [4/4] [UUUU]
      [============>........]  resync = 63.3% (1763918288/2783759232) finish=3019.9min speed=5627K/sec

の様に確認できる.以下,試行錯誤の経緯.

Root file system は RAID5 かつ btrfs なのだが,当初は fsck.btrfs の箇所でなかなか終わらない状況だった.fastboot で fsck を skip しても,起動のあらゆるステップで時間がかかってしまい

INFO: task something blocked for more than 120 seconds.

的な warning が連発する.ということで resync を止めざるを得ないということになった.幸い initrd の backup があったので,適当な directory を掘ってそこで,

zcat /somewhere/initrd.img-4.X.X-something-amd64 | cpio -i

して眺めた感じ,boot option break の存在と

[scripts/local-top/mdadm] の最後の箇所
maybe_break post-mdadm

exit 0

というように RAID の認識が終わったところで,break=post-mdadm で break point を設定できることがわかったので,それでなんとか対処することにした.

RAID の resync を中断する方法は man mdadm 等で調査.mdadm 自体 initrd に含まれているが,直接/sys/block/md126/md/sync_actionにアクセスする方が簡便.ちなみにfrozenだと中断され,idle だと中断されはするがすぐに再開される.

あとはbtrfsのfsckがskipされて気持ち悪いが,

% sudo btrfs scrub start -r -c3 /

で scrub をして,しばらくの後に

% sudo btrfs scrub status /
scrub status for XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
        scrub started at XXXX and finished after 11487 seconds
        total bytes scrubbed: 2.96TiB with 0 errors

のように 0 errors を確認しておく.

Related articles