またまた Raspbery Pi 2 Mobel B で使っている32bit FreeBSD/arm7 が起動しなくなってしまいました。
今回は、SDメモリをファイルシステムとして使っているRaspberry Pi2 の話。
SDメモリの寿命を延ばすために、出来るだけSDメモリファイルシステム上でビルド作業は行わないようにしています。脆弱性が見つかった場合は NFSでマウントしたネットワークの向こう側にあるHDD上の /usr/src, /usr/obj, /usr/ports で作業して、最終的なパッチ作業だけSDファイルシステムに対して行っているのですが、NFSクライアントサーバーモデルを使っていると、サーバー側のファイルシステムが異常を起こすと、クライアント側も道連れにハングアップしてしまうことがあります。
今回これが発生。
ディスプレイレスで使っているため、突然ターミナルエミュレータ画面が消えて、再接続できなくなってしまうと、残る手段は再起動しかない!今回もやむなく、USBケーブルを抜き、Raspberry Pi2 の再起動を始めたものの、いつまで待ってもネットワークがつながず、Ping応答もない。こっちのラズパイは、特に作業はおこなっおらず、画面を見たらいきなりターミナルエミュレータが消え始めました。(そういう状況なので、原因が本当にNFSだったのかどうかは不明。)
やむを得ず、別PCのHDMIケーブルを抜いて、起動しないRaspberry Pi2 と接続。そして電源On。
しかし、画面が真っ暗なまま。RPI2またはファイルシステムのSDメモリのクラッシュが起きたようです。おそらく、RPI2ハードが突然故障したということはないでしょう。ということで、SDメモリを別のRPI3に接続してみたところ、やっぱり真っ暗。RPI3用のSDメモリファイルシステムを使うと、ブート画面まで進みます。(32bit/64bitの差があっても、ブートローダーまでは動くはず。)
電源ケーブル抜き差しによるRPI2の再起動により、SDメモリファイルシステムが壊れたみたい。SDメモリへの書き込み中にOSがクラッシュすると、電源抜き差しでSDメモリがダメージを受ける可能性があるので、リセットボタンが欲しいな~。
SDメモリファイルシステムを焼き直そうかと思ったものの、RPI2上の32bit FreeBSDはソースメンテナンスなので、ファイルシステムをイメージから作り直すと、脆弱性パッチが元に戻ってしまいます。そうすると、脆弱性をふさぐために二日コースの作業を行わなくちゃいけなくなるので、やりたくない作業。
症状から推測するとFreeBSDファイルシステムじゃなく、ブートローダーが飛んだ感じなので、私としては初めての試みで、ブートローダーだけの修復を試してみることにしました。
FreeBSD/arm7 のブートローダーは、SD上の /dev/msdosfs/MSDOSBOOT と決まっているので、正常動作しているSDファイルシステムから、クラッシュしたSDメモリファイルシステムをUSB SDアダプターで /dev/da01s1 にダンプすれば復旧するかもしれない!と仮定。
やってみました。実際には、USBブート可能なHDDファイルシステムを /dev/da0 に、クラッシュしたSDメモリを、SDアダプターで /dev/da1 にして作業しました。
root にて、
#dd if=/dev/da0s1 of=/dev/da1s1 bs=64k 800+0 records in 800+0 records out 52428800 bytes transferred in 9.029326 secs (5806502 bytes/sec)
数秒でコマンドは終了し、本当にコピーできたの?と思いながらも、SDアダプターから取り外し、RPI2 のSDスロットに差し込んで電源につないだところ、約10秒後、ping 応答が発生!
OSが起動したわ!
ダメだったら、SDメモリ焼き直しで、修復作業二日コースかと思っていたので、ブートパーティションを修復できたことは非常にうれしい。
Raspberry Pi上のFreeBSDは、まだ運用を始めて半年程度なので、ブート時トラブルの経験値が私に貯まっておらず、本当にこの方法でいいのか?と思うものの、u-boot が動かない場合の修復がうまくいって良かったです。
Raspberry Piを使っているのは、24時間システムの消費電力を減らすためなのですが、最近、ラズパイを24時間365日運用に使うのは、いい考えじゃなさそうと思い始めているところです。私が使っているパーツのせいかもしれないけど、クラッシュが多すぎる。SDメモリはもう3回以上吹っ飛び、SDメモリを2枚失いました。1枚は(一応)高耐久のドライブレコーダー用。経験値を貯めるために、もう少し使い続けようとは思いますが、データが心配。