とりあえず TBD

とりあえず、いきあたりばったり

GRUB2 からZFS rootの FreeBSDの起動を試す

 実は FreeBSD 10.0-RELEASE をインストールしたマシンには、ArchLinuxをインストールした別のHDDが接続してあり、そちらはGRUB2から起動するようにしてあった。

 マシンのBIOSメニューに入ってbootドライブを変更してやることで、FreeBSDLinuxの選択ができる。

 でも、いちいち BIOSに入るのはメンドクサイ!

そこにGRUBがあるじゃないか

 GPTパーティションからの起動なので MBM は使えない。というわけで、GRUBから FreeBSDの起動する設定を模索する。そもそもそのための GRUBだ。しかし、UFSならともかくZFS rootに設定したところからブートできるのか?

幸い、ArchLinuxから入れたので GRUB は最新(だと思う)の GRUB 2.02。ZFSにも対応しているらしい。

Google先生は役に立たない(こともある)

 とりあえず grub zfs freebsdなどでググってみる

 これはFreeBSDportsからGRUBをインストールしてうまくいかなくてパッチを当てている話だ。っと、portsGRUB があったんだ。知らなかった。しかし、今回の目的とは違うようだ。

 これか? ZFS root から起動しているようだ。真似していろいろ試みるが、うまくいかない。2011年の記事だし。  よく読んでみると /boot は UFS に置いているようだ。ダメではないか。今回 /bootはZFS の中にあるのだ。

灯台下暗し。困ったときは源典へ。GNU のドキュメントは info を見る

 GRUB そのものについても検索するも、よくわからない。man grub はありません。GRUB のドキュメントはいったいどこに?

 あぁ、忘れてたよ info だ。 info grub だ。

 info grub → Configuration → Multi-boot manual config とたどると、探していたそのものの例があった。

menuentry "FreeBSD" {
          insmod zfs
          search --set=root --label freepool --hint hd0,msdos7
          kfreebsd /freebsd@/boot/kernel/kernel
          kfreebsd_module_elf /freebsd@/boot/kernel/opensolaris.ko
          kfreebsd_module_elf /freebsd@/boot/kernel/zfs.ko
          kfreebsd_module /freebsd@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
          set kFreeBSD.vfs.root.mountfrom=zfs:freepool/freebsd
          set kFreeBSD.hw.psm.synaptics_support=1
}

insmod zfs の指定とパーティション指定、ルートディレクトリへのpathの指定がキモのようだ。 synapticsは関係ない。

GRUBからZFS中のFreeBSDが起動できた

 さて、どうすればよさそうか考える。

手元のマシンでは

  • プール名 zroot

  • ルートディレクトリ zroot/ROOT/default

  • zfsパーティションはドライブ0 の GPTインデックス3 (hdd0,gpt3)

なので、目の前にあるマシンの状態と先の例を見比べてできたのが以下の設定。

menuentry "FreeBSD load kernel zroot" --class freebsd --class bsd --class os {
        insmod zfs
        search --no-floppy --set=root --label zroot --hint hd0,gpt3
        echo 'Loading FreeBSD kernel in zroot ...'
        kfreebsd /ROOT/default@/boot/kernel/kernel
        kfreebsd_module_elf /ROOT/default@/boot/kernel/opensolaris.ko
        kfreebsd_module_elf /ROOT/default@/boot/kernel/zfs.ko
        kfreebsd_module /ROOT/default@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
        set kFreeBSD.vfs.root.mountfrom=zfs:zroot/ROOT/default
}

grub.cfg は custom.cfg というファイルがあれば、それを読み込むようなので、 こいつを grub.cfg と同じディレクトリの custom.cfg に書いてやった。

成功! 起動した。

 --label zroot する代わりにUUID指定で --fsuuid xxxxxxxx でもよいかもしれない。UUIDを調べるのは ArchLinuxから lsblk -o NAME,UUID /dev/sda でよいかもしれない。うまくいっちゃったので未確認。

 /boot/kernel のところを /boot/kernel.old などとしたものを作っておけば、腐った kernelをインストールして起動しなくなっても、前のカーネルに切り替えられて便利かもしれない。

FreeBSD のローダーメニューは出せないか?

 試してみたらできてしまった。見慣れた BSD のブートメニューが現れた。

kernel を指定する代わりに zfsloaderを指定する。設定は以下の通り。さっきより行数が減った。

menuentry "FreeBSD load zfsloader in zroot" --class freebsd --class bsd --class os {
        insmod zfs
        search --no-floppy --set=root --label zroot --hint hd0,gpt3
        echo 'Loading FreeBSD ZFSloader in zroot...'
        kfreebsd /ROOT/default@/boot/zfsloader
        set kFreeBSD.vfs.root.mountfrom=zfs:zroot/ROOT/default
}

 めでたし。