ほーりーさんの日記

TrueNAS が起動しなくなった

TrueNAS が起動しなくなりました!!

failed to reclaim memory というメッセージを出して、プロセスが死んでしまいます。Kernel は生きてるらしく、Ping には応答するんですが、sh すら起動しないので、なーんにもできません。

この TrueNAS、VMware  のストレージにしてるので、仮想マシンの構成ファイルを抱き込んだまま起動できなくなるとかいう、最悪な状態。

さーて、どうしたもんか。

何が起こってる?

試行錯誤する中で、物理メモリが食いつぶされてることがわかりました。

TrueNAS のダッシュボードにある、メモリ使用率の画面です。物理メモリ 16GB を積んでるんですが、全容量が Services で食いつぶされてます。Cache だったらまだわかるんですが、Services で食いつぶす。はて?

この Services、ってなんじゃらほい?ということなんですが・・・・・よくわかりません。おそらくは Kernel とか Userland とかのシステム領域かな?と思います。そんなもんが 12GB も??異常ですね

ちなみに、この画面を表示したあと、Web サービスも死んでしまい、計測できなくなりました。

考察

エラーメッセージ、failed to reclaim memory ってなんじゃらほい?そのまま訳すと「メモリを取り戻すことに失敗しました」

メモリ不足でプロセスが死ぬときは、out of swap というエラーが出るはず。ということは、Swap を含めてメモリ容量を食いつぶしてるわけではない?

どうやら、Swap を含めたメモリ容量を使いつぶしたわけではなく、物理メモリが食いつぶされてる状態で Userland プロセスを動かしたいから、Swap 領域からメモリを戻そうとしたんだけど、物理メモリを奪い取れないからどうしようもなくプロセスが死んだ。とそんなシナリオではないかと。

はて?Swap があるんだから、どーしても必要なプロセスを動かすには、ほかの領域を Swap に追い出して必要なプロセスを走らせるのでは??

そういう動作をしないってことは、Swap 不可な領域ばっかりになってるってことか?

Swap 不可な領域ってことは、おそらく Kernel のメモリ領域。ZFS か!

ということで、ZFS の Kernel 領域がメモリを食いつぶしてるのではないかと思われます。ふつー、こういう起動不能なんて状態は致命的なんで、起こらないように制限とかかけてあるはずなんですが、パフォーマンスを出すためとか、そんな感じの理由で制限を外してるんでしょうね。

推論

おそらくこんなことが起こったのではないかと

  1. ZFS 領域になんらかの不整合が発生した
  2. TrueNAS の起動時に ZFS をマウントしようとする
  3. ZFS 領域が正常に Unmount されてないので、マウント時にチェック的なものが走る
  4. チェックが Kernel 内処理されていて、かつ、メモリ使用量が制限されていないので、全物理メモリを食いつぶす
  5. Userland が追い出されて、かつ復帰できないので死ぬ
  6. Kernel 処理もメモリ不足で止まる
  7. ハングアップ

対策

FreeBSD ともあろうものが、起動もできなくなって復旧処置ができなくなるようなものを作るか??

といういうわけで、これは TrueNAS の固有現象だろうと推測。つまり、オリジナルの FreeBSD Kernel なら正常に起動できるのでは?

というわけで、FreeBSD を起動してデータ領域をマウントしてみる。

実際には、別の HDD をつないで、そこにインストールしてやったんですが、LiveCD とか、インストールメディアの Shell でもできそう。

  1. なんとかして FreeBSD を起動する
  2. zpool import pool-Data
    • pool-Data は TrueNAS で作ってた Pool 名
    • import コマンドは1時間くらいかかる
  3. LiveCD の場合、マウントポイントが作れなくてマウントエラーになるので mount -t zfs pool-Data /mnt を実行
  4. マウントできてることを確認

こんな感じでファイルシステムにアクセスできるようにする。

この段階で ZFS 領域のチェック的なものは終わってるので、FreeBSD を reboot して、本来の TrueNAS を起動すれば、正常に起動できる。

念のため、Reboot する前に、データ領域のファイルを救出しておくべきでしょう。

あと、間違ってもここで電源を引っこ抜いたりしないように、FreeBSD から Unmount しないと、何のために復旧作業やったのかわからなくなります。