はじめに
FreeBSDの更新をしたら正常にコマンドを実行できない状態に陥ったので、ひとまずデータだけを復旧したっていう話
経緯
以前からhp microserverにFreeBSD 10.1をインストールして、ファイルサーバとして利用していた。ストレージにはZFSを利用。そこに今回思い付きでPT3を入れて録画サーバとしても利用しようかなと思ったのが事の発端。
https://hgotoh.jp/wiki/doku.php/documents/freebsd/freebsd-019
上記URLに書いてあることを愚直に実行してPT3の関連ソフトウェアを導入していこう、と考えていたがrecpt1のautogen.shを実行するところで、autoconfとautomakeが要求されるのだが、それらのインストールでP5関連のエラーが発生し、解消しない。
海外のサイト見てると/usr/portsの下のファイルをコピーしたりして対応しているworkaroundも見受けられたが、portsの実装の問題のようにも見えるので、OS環境更新してみるべと思って実行したのが以下コマンド。
freebsd-update -r 11.2-RELEASE upgrade
freebsd-update install
今にして思えば軽いノリでfreebsd-update を実行したのがすべての間違いだった。
上記コマンド実行後、リブートしてからもう一度freebsd-update install打ってね♡、って内容の文言が表示されたのでそのまま実行。するとその後から
# ls
/bin/csh: Exec format error.
# what /boot/kernel.old/kernel
ELF interpreter /libexec/ld-elf.so.1 not found, error 8
Abort
こんな感じのエラーが。どうもOS領域が破損してしまったらしい。こうなってくるとPT3の導入がどうというより、元々のファイル復旧が先決となってしまった。
ファイルを認識するまで
ここからはコンソール作業。まずはリブート後、kernel.oldで起動しようとしてみた。
が、あいにくエラーは解消されない。
仕方ないので FreeBSDをLiveCDから起動して、ファイルサーバとして使っていた領域だけでも解消しよう。
まずはZFSストレージプールをマウントせねば。
# zpool import
## 確認したidを指定する
# zpool import -f <id> mydata
とりあえずmydataにリネームしてインポートしてみた。なお、ちゃんとエクスポートしたストレージプールではないので、importには"-f"オプションが必要。
しかしながら、
# zpool list
ELF interpreter /libexec/ld-elf.so.1 not found, error 8
Abort
また、このエラーか、ELF。
これは、zpool import で/libexec下、というかルートのファイルシステム を上書きしているのかな。ZFSをルート領域に割り当ててたからさもありなん。
仕方ないので再起動後、今度は別のパスにインポート。手順は以下URLを参照した。
https://forums.freebsd.org/threads/mounting-and-editing-hard-disk-from-livecd.61726/
# mkdir /tmp/mydata
# zpool import -fa -R /tmp/mydata
# ls -l /tmp/mydata
~(ファイルの一覧)~
ひとまずこれでOK。
ファイルの退避
ファイルが参照できるようになったので、次はファイルの退避。この状況でSamba共有してWindowsなりUbuntuなりからコピーしようとしたけど、LiveCDで起動している状況でportsやpkgのインストールができないようだったので(うまいことやる方法あったら教えてください)、外付けUSB HDD(FAT32)にコピーすることにした。
それでもとりあえずネットワーク接続。
ifconfig bge0 inet 192.168.1.50 subnet 255.255.255.0
route add default 192.168.1.1
それでこの後、/etc/resolv.conf に nameserver 192.168.1.1 を追加してネットワーク接続OK。
次に以下ページを参考にしてフォント b16.fnt をダウンロードして利用。
http://april.fool.jp/blogs/2014/11/freebsd-10-1-release%E3%81%AEvt4%E3%81%A7console%E3%82%92%E3%81%86%E3%81%A4%E3%81%8F%E3%81%97%E3%81%8F/
ただ、fetchでダウンロードしようとすると、Authentication Errorとなったため、別PCでダウンロードしてFTP経由で取得した。ダウンロードURLは
http://people.freebsd.org/~emaste/newcons/b16.fnt
そのあと以下コマンド実行してコンソールで日本語表記可能となった。
# vidcontrol -f ./b16.fnt
次にFAT32のマウントは以下のコマンドで実行。手順は以下URLを参照した。
http://noichigo.moe.hm/freebsd/63.html
# mount -t msdosfs -o large,-L=ja_JP.UTF-8 /dev/da0s1 /mnt
-Lのオプション付けないと文字化けして、cpがInvalid Argumentになってコピー失敗となったので。
これでようやくファイルの退避が可能となった。
まとめ
結局freebsd-update の何がいけなかったのか、わからないままだけどとりあえずデータは救えたのでよしとしよう。
ファイルの退避が終わったら、改めてFreeBSD 11をインストールして、ZFSでRAID組もうかな。ふー、長い闘いだった。