GRUB2 からZFS rootの FreeBSDの起動を試す
実は FreeBSD 10.0-RELEASE をインストールしたマシンには、ArchLinuxをインストールした別のHDDが接続してあり、そちらはGRUB2から起動するようにしてあった。
マシンのBIOSメニューに入ってbootドライブを変更してやることで、FreeBSDとLinuxの選択ができる。
でも、いちいち BIOSに入るのはメンドクサイ!
そこにGRUBがあるじゃないか
GPTパーティションからの起動なので MBM は使えない。というわけで、GRUBから FreeBSDの起動する設定を模索する。そもそもそのための GRUBだ。しかし、UFSならともかくZFS rootに設定したところからブートできるのか?
幸い、ArchLinuxから入れたので GRUB は最新(だと思う)の GRUB 2.02。ZFSにも対応しているらしい。
Google先生は役に立たない(こともある)
とりあえず grub zfs freebsdなどでググってみる
これはFreeBSDのportsからGRUBをインストールしてうまくいかなくてパッチを当てている話だ。っと、portsに GRUB があったんだ。知らなかった。しかし、今回の目的とは違うようだ。
これか? 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が起動できた
さて、どうすればよさそうか考える。
手元のマシンでは
なので、目の前にあるマシンの状態と先の例を見比べてできたのが以下の設定。
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
}
めでたし。