FreeBSD 11.0 にアップデートしたら起動しなくなった
自宅サーバのアップデートをサボっていたら、security update の提供が終了してしまったので、慌ててアップデートしました。
FreeBSD 10.1 から 10.2
10.2 から 10.3
満を持して 10.3 から 11.0
ということで、見事にアップデートに失敗して起動しなくなってしまいました。
この時画面に表示されていたエラーメッセージを抜粋するとこんな感じ。
Solaris: NOTICE: Cannot find the pool label for ‘tank’
Mounting from ifs:tank/root failed with error 5.
Loader variables:
vfs.root.mountfrom="zfs:tank/root"
Manual root filesystem specification:
<fstype>:<device> [options]
(snip)
mountroot>
何らかの原因で zfs pool “tank” が mount 出来なくなったようでした。
復旧を試みる
エラーメッセージにもあるように、/boot/loader.conf に vfs.root.mountfrom="zfs:tank/root" と指定してあるので、とりあえずそこら辺をいじってみます。
まず、single user mode にすら入れなくて困ったので、 FreeBSD 11.0-RELEASE Announcement で頒布されているメモリースティック版インストーラーイメージをダウンロードして、リンク先に記載の dd コマンドで usb memory stick に書き込みます。
usb memory stick を挿してマシンをリセットすると、無事 installer が起動したので、shell メニューを選択して shell に入ります。
boot パーティションだけは ufs にしてあって、boot 時に zfs をルートにマウントし直す構成にしてあったので、ls /dev して boot パーティションはどれだったか迷いつつ mount しました。
で、/boot/loader.conf を色々いじった結果なのですが、vfs.root.mountfrom は問題無かったようで、以下が怪しかったのでコメントアウトしました。
if_msk_load="YES"
hw.pci.enable_msi="0"
hw.pci.enable_msix="0"
(多分、本当に問題だったのは下の2つ)
セーブして再起動したら、エラーが変わりました。
ドライブ名が変わっているんですが
次に出たエラーは明快で、/etc/fstab に記載してある swap と boot パーティションのドライブが見つからないというものでした。 確認すると、確かにドライブ名が変わっていました…。
ということで、zfs プールを import して /etc/fstab を修正して再起動。
めでたく起動しました!
ネットワーク不調
起動したのは良かったのですが、時間が立つと msk0 が、watchdog timeout で通信できなくなる現象が発生しました。
Jan 3 14:15:27 server msk0: watchdog timeout
そもそも msi, msix を 0 にしていたのは、この対策のためだったのですが、FreeBSD 11.0 でもこの事象は発生するみたいでした。
なので、適当にぐぐってみたところ、
hw.msk.msi_disable="1"
という設定があるらしいので、その設定に変更して解決しました。