Root file system を RAID5 (software RAID w/Intel Rapid Storage Technology)にしていて,再起動時にうまく clean な状態で再起動できず verify flag が立ってしまうと,initramfs の時点で resync が開始されてしまい,いつまで経ってもまともに起動しないという話.ファイルサーバなのでさくっと起動してもらわないと困る.
なんとかする方法は以下.
-
grub でエントリ edit モードに入って(編集するエントリにカーソルをあわせて e),boot option に fastboot (もしくは fsck.mode=skip) と
break=post-mdadm
(jessie の場合) を追加して起動(C-x)注(2021/9/9):
post-mdadm
という break point は stretch 以降は存在せず,bullseye で止められる箇所は以下のポイント.% grep maybe_break /usr/share/initramfs-tools/init maybe_break top maybe_break modules maybe_break premount maybe_break mount maybe_break mountroot maybe_break bottom maybe_break init
stretch の場合は
break=mountroot
した後に以下の/sys/block/md126/md/sync_action
にアクセスできていた(他を試したかどうか失念).bullseye の場合はbreak=mount
の段階で/sys/block/md126/md/sync_action
にアクセスできる(fastboot
option なしでも問題なし). -
initramfs の shell が起動するので,
cat /sys/block/md126/md/sync_action
が resync になっていて,HDD のアクセスランプがついている状態を確認,
echo frozen > /sys/block/md126/md/sync_action
して,HDD のアクセスランプが消えることを確認する(resync が止まる).
-
C-d で initramfs shell を抜ける
これでひとまずは起動するはず.起動した後は
# 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 を設定できることがわかったので,それでなんとか対処することにした.
注(2021/9/9): bullseyd では scripts/local-top/mdadm
は存在しない.scripts/local-bottom/mdadm
と scripts/local-block/mdadm
は存在するが,ここに maybe_break は含まれない.
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 を確認しておく.