Edited at

zfs - 単一パーティションでマルチブート

More than 1 year has passed since last update.

前々回の投稿に引き続き前回の投稿も評判良かったので調子に乗ってやりました。後悔はしていないが公開はしてる。

Filename
zfs-xenial-fbsd11r-20170215.ova

Size
4,050,796,544B (3.77GiB)

md5
612eba98ccc4d33ab9b6a7f822d23f4e

sha1
41ade4c475ffd8a5a2d12ea180f165c15ed98e1b


なんぞこれ?

事実上パーティションが一つしかないのに、UbuntuだけではなくFreeBSDもブートできます。Debian kFreeBSDとかではなく正真正銘The FreeBSD Project謹製のFreeBSD 11-RELEASEです。

grub.png

FreeBSDの方は起動時はCLIのみですが、


  • Username: freebsd

  • Password: zfs

でログイン後にstartxするとgnome3が立ち上がります。

freebsd-gnome3.png

ubuntuの方は前回の投稿と同様です。というかそれが材料になってます。


作り方


  • すでにubuntuがインストール済みのVMを用意

  • FreeBSD-11-RELEASEのインストールディスクイメージをCDに指定してそこから起動

  • shellに入る

  • FreeBSD用のデータセットを追加。こんな感じで。

# zpool import -f -N -R /mnt rpool

# zfs create -o mountpoint=/ rpool/ROOT/freebsd
# zfs mountpoint=/usr -o canmount=off rpool/usr
# zfs create -o mountpoint=/usr/local -o canmount=off rpool/usr/local
# zfs mountpoint=/var -o canmount=off rpool/var
# zfs create -o mountpoint=/var/db -o canmount=off rpool/var/db
# zfs mount rpool/ROOT/freebsd
# zfs mount -a


  • FreeBSDのtarballをぶちまけ。baseとkernelだけでおk

# cd /usr/freebsd-dist/

# tar zxvf base.tzx -C /mnt
# tar zxvf kernel.tzx -C /mnt


  • FreeBSDのインストールCDイメージを外してubuntuで再起動


  • grubにFreeBSDのブートのしかたを教えてあげる。 /boot/grub/custom.cfgというファイルを以下の通り作成


menuentry "FreeBSD" --class freebsd --class bsd --class os {

insmod zfs
search --no-floppy --set=root --label rpool --hint hd0,gpt1
echo 'Booting FreeBSD...'
kfreebsd /ROOT/freebsd@/boot/kernel/kernel
kfreebsd_module_elf /ROOT/freebsd@/boot/kernel/opensolaris.ko
kfreebsd_module_elf /ROOT/freebsd@/boot/kernel/zfs.ko
set kFreeBSD.vfs.root.mountfrom=zfs:rpool/ROOT/freebsd
}GRUB_HIDDEN_TIMEOUT=0````



  • grubのメニューを必ず表示するように設定。



    • /etc/default/grubGRUB_HIDDEN_TIMEOUT=0をコメントアウトしてから

    • update-grub



  • 再起動後に上記の画面が出たらFreeBSDを選択


  • 我輩はFreeBSDである。root passwordはまだない;-)


  • のであとはあれこれ設定。今回の.ovaではfreebsdという初期ユーザーあり、root login不能というubuntu的設定にしてある



注意点



  • zpool upgradeしてはいけません。ZFS on Linuxのfeaturesの方がFreeBSDよりも古いので

  • それ以外であれば、ubuntuもFreeBSDも普通にアップデートをかけられます。

  • VMWareでvmmouseを使うには以下の通りにしてください。(cf. http://qiita.com/dankogai/items/fd76333876b5f8a89e21)

$ sudo -i

# cd /etc/X11/etc/X11/xorg.conf.d
# mv input.conf.vmmouse input.conf


  • ZFS on Linuxはシャットダウン前にpoolをexportするけど、FreeBSDはしないという重要な違いがあります。そのためそのままだとFreeBSDの後にubuntu起動すると、initramfsで止まっちゃいます。そのため /usr/share/initramfs-tools/scripts/zfs を以下のようにパッチして、root roolを問答無用でマウントするようにしています。

--- zfs.orig    2016-04-13 19:43:25.000000000 +0900

+++ zfs 2017-02-15 00:55:15.744039000 +0900
@@ -54,7 +54,7 @@

# At this point, the pool either imported cleanly, or we ran out of the
# allowed time (rootdelay). Perform the read-write import.
- ZFS_STDERR=$(zpool import -N "$ZFS_RPOOL" 2>&1)
+ ZFS_STDERR=$(zpool import -f -N "$ZFS_RPOOL" 2>&1)
ZFS_ERROR=$?

if [ "$ZFS_ERROR" -ne 0 ]

もうちょいエレガントなやり方、緩募。


Boot Environmentという発想

要はこれ、Boot Environmentという発想をそのままマルチOSブートに反映させたものなんですね。

難しいことは何もなくて、OSごとのパーティションがOSごとのデータセットになっただけ。しかしプールは共有しているので、/homeなどはどのOSからも見えますし、他のOSのパーティションの空きが使いたくても使えないということもありません。

まあbeadmとか使ってないので、あくまで「なんちゃってBE」ではあるのですが、やってることは同じです。

仮想マシンでこれやっても自己満足以上のご利益はほとんどありませんが、これでUSBメモリーを作っておくと、万能に近い rescue drive になります。UEFI対応にしておくと、MacにすらOKでした。

というかおそるべきことに、macOS boot on ZFSはすでに実現しているようなのです。ようなのです、と書いたのは残念ながら手元では再現できなかったから。

とはいってもubuntuやFreeBSDと異なり、ヴェンダーサポートは現状期待しようがありませんが。Apple、OpenZFS Projectサポートしてくんないかなあ。Microsoftがサポートしてくれたりして:-)。Windows 10 on ZFSだってありえなくはないはず…

勇者はぜひ上記に macOS と illumos も加えたクアッドブートディスクをこさえてみてください。

Dan the Unofficial ZFS Evangelist


追記

macOS boot on ZFS できちゃいまいした。VMWare Fusion上ではありますが、Terminal.appの画面に注目。O3XのWikiどおりとはちょっと行きませんでしたが。もしかしたら別記事にレシピ書くかも。

Screen Shot 2017-02-18 at 15.42.39.png