FreeNASを飛ばしかけた話

僕は FreeNASの8.0.3からのユーザですが、RAIDZ2で快適ファイルサーバ生活を続けています。途中1回のHDD交換を経験し、OSのバージョンも8.2.0p1まで順調に上げてきていました。

世の中はもう8.3.1まで来ていて、すでに9.1のRC版まで公開されています。ファイルサーバという性質上、バージョンを上げたことによってものすごいメリットを得られるかというと、そんなことはありません。しかし、新しもの好きの僕としては、例えば体感できないけどファイル転送スピードがほんのちょっと上がる、などというものでも、手元でそれを実現しておきたいものなのです。きっとリスクの方が大きいOSバージョンアップという行為を、新しいバージョンが出る度にすぐに行ってきました。

ある日、もう結構前ですが、8.2.0から8.3.0にGUIアップグレードできないことに気が付きました。「The firmware is invalid」と言われます。SHA256のハッシュ値もあってるし、バグレポート見ても「順にアップしていけばできたよ」とコメントが付いていたりします。でも、できない。

この前の土曜日(7/27)、こんな投稿を見つけます。

[ 8.3Beta2 to 8.3Beta3: The Firmware is invalid]

/var/tmp/firmwareの中で自分でアップグレードのためのコマンドを打ってやってみたら?という内容です。確かにそのディレクトリの中には、firmware.txzファイルがありました。これを展開してみると、install_worker.shファイルが出てきました。

  1. cd /var/tmp/firmware/ &&
  2. bin/install_worker.sh pre-install &&
  3. bin/install_worker.sh install 4.

正しい判断ができる人であれば、試しません。上記はきっと、やっちゃいけないことです。でも僕は、やってしまいました。

実行結果は、うまくいったようでした。「手順の4が書いてない」という超怪しい状況でも、アップグレードできた!という期待にウキウキします。あとは、再起動あるのみ。

・・・はい、起動しません。

途中でError: 〜というメッセージを何度も吐き、起動途中でシングルユーザモードになってしまいます。つまり、USBメモリに入れてあったFreeNAS 8.2.0は、完全に壊れたようです。

OSが壊れただけであれば、普通はまぁそこまで心配はしません。データまでは逝ってない、という自信があるからです。しかし、今回のデータストレージは、ZFSです。zpoolコマンドなどを簡単に叩ける知識しか持っていません。ZFSは、普通にmacやWindowsにマウントできません。もしUSBメモリ内のどこかに情報が書かれていて、それがないと使えないとしたら・・・?

それは、10年以上ためてきた僕の大事なファイル群が全て無に帰ったことを意味します。人間、こんな時って汗が出るんですね。マジで変な汗が出ました。

どっかのデータ復旧チームが ZFSからデータの復元に成功したってニュースを前に見たことがあります。そんなニュースになってしまうZFSですから、個人で誰かにデータ救出をお願いすることはほぼ不可能です。できたとしても、いくら請求されるかわからない。つまり、自分で何とかするしかありません。

自分でできる解決策として思いついたことはただひとつ。

「USBメモリにFreeNASを再度インストールして、RAIDZ2のプールを再マウントすること」

これです、これしかありません。まさかZFSがそんなヤワなわけはありません。手順が複雑なことを覚悟し、まずはネットでその方法を探します。

ありました。

[ FreeNAS 8.0.2を復旧]

結局のところ、今回僕が壊したのは、OS領域だけなはず。つまり、上の記事の内容と状況は同じはずです。見たところ、それほど必要なコマンド数も多くありません。意外と簡単に復活できそうです。

まずは、FreeNASの8.2.0p1のisoイメージをダウンロードし、USBメモリに書き込みました。そのUSBメモリは、先ほど僕が壊したものです。もちろん良い子は新しくUSBメモリを買って、そちらを使うべきですね。どこまで僕は男らしいのでしょう。USBメモリ内の設定情報の必要性を危惧しておきながら、真っ先にそれを消し去りました。そういう考えに及ばず、いとも簡単にUSBメモリにFreeNASのisoイメージを書いてましたからね。きっと精神状態が普通じゃなかったんだな、と今となっては思います。

さぁ、isoイメージを書き込んだUSBメモリで起動します!はい、起動しません。そりゃそうです。手順としては「CD-ROMにisoイメージを書き込んで起動し、そのインストーラからUSBメモリにFreeNASをインストールする」が正しいです。ダメダメですね。空いているCD-RWメディアを見つけて、isoイメージを書き込み、その後それで起動してUSBメモリに無事FreeNAS 8.2.0p1がインストールされました。

この作業をする直前に、「いきなり8.3.1を試してみようかな」と迷って思いとどまったことを、ここに残しておきます。もしかしたらそれでもうまくいったかもしれませんが、間違いなく思いとどまって正解です。きっと。。。

ネットワークの設定をして、Web管理コンソールでユーザを作成し、sshサービスを起動します。この時点では、Web管理コンソールにてZFSプールは見えませんでした。何もしなくても認識してくれるかな?とちょっと期待していたのですが、残念です。

OSが復活したところで準備体操は完了。次からが本番です。実際に復活させたいのは、ZFSです。sshでログインし、プールが見えるか確認します。打ったコマンドを完全には記憶してないのですが、何とか思い出してみます。

# zpool import

見えました!zpool statusした時の出力と同じような感じで、僕が求めていたtobuプール(東武動物公園にあるプールから命名)の存在を確認できました。やったぁ、何とかなりそうです。

# zpool import -f tobu

あれ、エラーが出ました。マウントポイントがない、とのこと。そうか、自分でディレクトリを作ってやらないといけないんだな?と思い、

# mkdir /mnt/tobu
# zpool import -f tobu

うーん、またエラーが出ました。/mnt/tobu下には何もありません。「ディレクトリを作っても意味なかったか、消そう」と思って、

# rm -rf /mnt/tobu

としてディレクトリを消し去り、プールの存在を確認しようと、再度以下のコマンドを打ちました。

# zpool import

マジでこの時、今度こそ全て消し飛んだと思いました。さっきよりも汗が出ました。見えていたtobuプールが見えなくなったのです。というか、zpool importの実行結果に何も出力されなかったのです!つまり、「tobuプールは既にインポート済みで、何らかの理由でファイルの実体は見えなかったけど、それらを全てrmコマンドで消し去った」と思ったのです。なんて愚かなんでしょう。よりによってrm -rfをしてしまうとは。。。

もうダメだ、終わった、とひとしきり思った後に、再度「zpool import -f tobu」を実行してみると、何とさっきと同じエラー内容。なんだ、tobuプールはまだ消し飛んでないじゃん。絶望して損しました。

結局のところ、ちゃんとマウントポイント先を指定してマウントしたら、うまくいきました。

# zfs set mountpoint=/mnt/tobu tobu
# zfs mount -a

良かった。。。これでOS Upgrade直前の元の状態に戻せました。ZFSさん、一瞬でも貧弱なファイルシステムだと思った僕をお許しください。そして、危ないことを自ら次々と繰り出した俺、反省すべきです。

さて、今回のFreeNASインストールし直しのおかげで、その後8.3.0、そして8.3.1へのアップグレードも、Webから無事行うことができました。zfsおよびzpoolのupgradeも成功し、現在最新の状況を保てています。

もし同じような状況になってしまった方がいたら、上記が参考になれば幸いです。

このエントリーをはてなブックマークに追加

関連記事

2023年のRemap

Remapにファームウェアビルド機能を追加しました

Google I/O 2023でのウェブ関連のトピック

2022年を振り返って

現在のRemapと今後のRemapについて