今日は休日出勤だったのですが、だいたい午前中に目処が付いたので 午後は7.2Rのまま放置されているFreeBSDをアップグレードしてあげることにしました。FreeBSD7でも特に実害は無いのですが、メジャーバージョン間の移行はまとまった時間がほしいですし、最近知ったのですが、7系で出来なかったマウント中のzfs upgrade が8系では簡単にできちゃうんです。ヒマな時にやらなきゃ損です。
ということで、あらかじめ make buildkernel / buildworld を終えていたので、後はインストールするだけです。 make installkernel に続いて、 zfs root な構成なので 念のために
# make NO_FSCHG=true installworldしました。続いて mergemaster ・・・なのですが、システムコールのエラーが出ます。ということで、仕方なく再起動してシングルユーザモードで起動・・・すると何かがおかしい。ちゃんと
ブートローダ→シングルユーザモード選択→ZFSのrootをマウント→/bin/sh?まで動作するのですが、カーネルが入っている UFSがマウントできないのですね。で、このデバイスは下記のように認識されています。
ad6: 76319MB at ata3-master UDMA100 SATA 1.5Gb/s
GEOM: ad6: the secondary GPT table is corrupt or invalid.
GEOM: ad6: using the primary only -- recovery suggested.
もともと 7.2 では
ad6s1a /bootdir
ad6s1b swap
ad6s1d /backup
という従来通りのスライス切りをしていたドライブなのですが、GPTで認識されるというなんとも悲しい状況になってしまいました。
# gpart show ad6
=> 34 156301421 ad6 GPT (75G) [CORRUPT]
34 156301421 - free - (75G)
# ls /dev/ad6*
/dev/ad6
# disklabel ad6s1
disklabel: unable to get correct path for ad6s1: No such file or directory
さて、ここで認識されずにいる /dev/ad6s1 ですが、ad6s1a の中身は消えたわけではありません。なぜならその中にある /boot/kernel からちゃんと起動しているからです。ad6s1a自体は生きてるのだけれど、FreeBSD8で認識させる方法がわからない。手元にシリアルATAを別のPCに接続するUSBアダプタも無い。困った・・・。
で、一時はおうちに持って帰って処理しようかと思ったのですが、次の方法を試してみました。
これで、今までぜんぜん見られなかった ad6s1 が見えました。幸い SATAドライブが余っていたので、これをad6s1a の代わりにすることにしました。
はぅ、一時はどうなることかと。なんとかおうちに持って帰らずに処置できました。本当はfixitからGPTでパーティションを作成したかったのですが、残念ながら /boot/gptboot が見当たらなかったので今回はスライスにしました。近いうちに zpool のドライブを交換するので、その時に起動ドライブのgpart 化も含めて整理する予定です。
ちなみに、どうしてこういう自体に陥ったのかというと、おそらくおうちで gpart の実験てことでごにょごにょいじくったドライブを会社に持っていって使ったからです。以前なら先頭から幾つかのセクタを消しておけば全く問題無かったのですが、GPTでは後ろにもパーティションテーブルがありますし、時間はかかるけど全域ゼロクリアでもしたほうが良いのかもしれませんね。