zfsをつかうと簡単にファイルシステムが作れるため、df を実行すると33行にもなる状態になっている。

そんなわけで df しても最初に出てくる / の容量を目にすることはほとんどなく、空き容量を気にすることがない。

なにかの拍子に久々にdfを見てしまったところ空き容量が負になっていたので、「そうじそうじ」ってことでいつものように/boot/kernel.*のバックアップを消していたところ、気が向いて/boot.*も消そうしたらまちがえて /boot も消してしまった。

「やっちまった」とおもって、ちょっと悩んでから電源ボタン長押しで強制ダウンさせたが悩んだ時間+長押し時間のあいだにflushされてしまったようで、リブートすると boot がみつかりませんと表示されローダーのプロンプトで止まった。

/usr/srcでmake installkernenlすればいいよねってことで、裏パーティションにインストールしてあるWindows XPを起動させ8.0-RELEASE-amd64-livefs.isoのCDを焼いてブートさせてみたのだがzfsのversionが古くてzpool importが失敗する。

教訓: zpool upgradeやzfs upgradeはリリース版より新しいものはつかわないようにすべし。そうでなかったらopensolaris.koとzfs.koのコピーをUSBメモリかなにかにコピーしておくべし。

そんなわけでFreeBSD-9.0-CURRENT-amd64-livefs.isoをとってきて復旧。当然のようになれてないので結構たいへん。

  • fixitでCDのshellを起動する。
  • とにかくzfsをマウントしないことには先に進まない。
    • cd /mnt2/boot/kernel
    • kldload ./opensolaris.ko
    • kldload ./zfs.ko
  • そのまえに / パーティションをマウントして、いくつかスクリプトを実行しておく
    • mkdir /mnt0
    • mount /dev/ad4s2a /mnt0
    • chdoot /mnt0 tcsh
    • cd /etc/rc.d
    • ./hostid start
    • ./hostname start
    • ./zfs start
      • internal error: failed to initialize ZFS library
    • よくわからんが、うまくいってないのはたしか。
    • exit
  • 手動でzfsのマウントをこころみる。
    • zpool import
      • action: The pool can be imported using its name or numeric identifier.
    • どうもプール名は指定しないといけないようだ (-aでもよかったかも)
    • zpool import tank
    • zfs list
      • /lib/exec/ld-elf.so.1: Shared object "libzfs.so.2" not found, required by "zfs"
      • なんじゃそりゃー
      • どうやらzfs mountで/usr/libなどがすべて / 配下にmountされたため不整合をおこしているようだ。
  • だめもとで、いちどfixitを終わって、もういちどfixitを起動したらみえた。
  • いちどzfsはunmountして/mntzにマウントしなおすとといいのではないかとおもった。
    • zfs umount -a
    • mkdir /mntz
    • zpool import -R /mntz tank
      • cannot import 'tank': no such pool available
      • すでにpoolを読み込んでいるのでダメっぽい
    • zpool export tank
    • zpool import -R /mntz tank
      • できた。でもmntzって名前がきもちわるいのでmnt0にする。
    • zfs umount -a
    • zpool export tank
    • mkdir /mnt0
    • zpool import -R /mnt0 tank
    • chroot /mnt0 tcsh
    • cd /usr/src
    • make installkernel KERNCONF=ほげほげ
  • reboot
    • zfsがちゃんとmountできなくてrc.dのスクリプトがことごとく失敗。
  • 再度reboot後、zpool import tankすると
    • cannot import 'tank': pool may be in use from other system,it was last accessed by hogehoge (hostid: 0x81f4ec68) on Tue May 18 04:59:31 2010
  • zpool import -f tank
    • これでうまくいった。

isoイメージのダウンロード時間とかXPのwindows updateの時間も含めて、結局2時間くらいかかった。

rm -r boot したときすぐにmake installkernelしていれば、こんなに苦労しなくてすんだのに。

あとは nvidial.ko が消えていて X が立た上がらなかったので make reinstall + make deinstall で入れなおし。

virtualbox のモジュールも消えているとおもうが、とうぶんつかうよていはないのでわすれておく。

あとでバックアップとってないかとさがしてみたら、/var/backups/rootfsにコピーが残っていた。

DIR=/var/backups

/usr/local/bin/rsync --one-file-system --archive --hard-links / $DIR/rootfs || exit 1