2014年11月8日土曜日

ZFS bootを利用したFreeBSD 9.2で「Unable to load a kernel!」

先日、利用しているFreeBSD 9.2のサーバーを再起動したところ、
Loading /boot/defaults/loader.conf
Unable to load a kernel!
|
can't load 'kernel'
というメッセージが出て起動できなくなりました。
前兆はあり、利用中にファイルシステム(ZFS)にあるファイルがすこしずつ消えていっていたのです。最初はportupgradeが異常終了するようになり、原因を調べているうちに、ssl関連のファイルがなくなり、sshやsuが利用できなくなりました。
これではどうしようもないので、OSごと強制終了し、 再起動したところ、上記の状態になりました。
FreeBSDのインストールCDからコマンドなどを書き戻せば復旧できそうでしたが、設定ファイルなどを失ってしまう可能性があります。そうなると復旧には時間がかかります。
他に方法がないかと検索エンジンでいろいろと調べていると、以下のことを思いつきました。
  • 現象としてはファイルが消えたただけ
  • ファイルを復旧させれば動作するのではないか
  • ZFSでスナップショットをとっているので、よさそうな時点のスナップショットにroolbackすればよいのでは?
そこで
FreeBSD 9 ZFS the easy way
https://forums.freebsd.org/threads/freebsd-9-zfs-the-easy-way.31557/
にある
Boot back with the installation CD and choose "live CD" and import back your zpool:
zpool import -f -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot
You will now have access to your zfs file system on /mnt
という記述に従い、
  1. FreeBSDのインストールCDからLiveCDで起動
  2. ファイルシステムをインポート
としてファイルシステムを確認します。
そして、rollbackは
ZFS スナップショットにロールバックする
http://docs.oracle.com/cd/E19253-01/819-6260/gbcxk/index.html
にあるように
zfs rollback -r tank/home/ahrens@tuesday
などとしてスナップショットを指定してロールバックします。-rオプションは最新のスナップショットより前のものに戻るときに指定します。
スナップショットの一覧は、
ZFS スナップショットを表示してアクセスする
http://docs.oracle.com/cd/E19253-01/819-6260/gbiqe/index.html
にあるように、
zfs list -t snapshot
とすれば一覧を得ることができます。
上記の手順でなんとか回復することができました。ZFSの障害は、推測ですが、1週間ほど前にファイルシステムを溢れさせたことがあり、これで状態がおかしくなったように思います。そのときは
  1. 一度シャットダウン
  2. 再起動してファイルを削除
  3. 動くようになったので安心
とだけしていたのですが、このときにもう一度、再起動すべきだったのでしょう。