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

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

[前々回の投稿]: http://qiita.com/dankogai/items/ffc4f31a8a949bd7ec01
[前回の投稿]: http://qiita.com/dankogai/items/3107a3f95fd805e6ccd7

| Filename | [zfs-xenial-fbsd11r-20170215.ova] |
|:--|--:|
| Size | 4,050,796,544B (3.77GiB) |
| md5  | `612eba98ccc4d33ab9b6a7f822d23f4e` |
| sha1 | `41ade4c475ffd8a5a2d12ea180f165c15ed98e1b` | 

[zfs-xenial-fbsd11r-20170215.ova]: http://vps0.dan.co.jp/dist/zfs-xenial-fbsd11r-20170215.ova

## なんぞこれ?

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

<img width="640" alt="grub.png" src="https://qiita-image-store.s3.amazonaws.com/0/19227/6b00e2ac-2e53-a5b3-a947-47525aea6754.png">

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

* Username: freebsd
* Password: zfs

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

<img width="512" alt="freebsd-gnome3.png" src="https://qiita-image-store.s3.amazonaws.com/0/19227/b98085c6-07e8-a029-8592-332ddc393de0.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/grub`の`GRUB_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ブートに反映させたものなんですね。

* https://docs.oracle.com/cd/E26924_01/html/E25778/index.html
* http://yskwkzhr.blogspot.jp/2013/03/use-boot-environments-on-freebsd.html

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

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

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

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

* https://openzfsonosx.org/wiki/ZFS_on_Boot

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

[OpenZFS Project]: http://open-zfs.org/wiki/Main_Page

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

Dan the Unofficial ZFS Evangelist

## 追記

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

<img width="1136" alt="Screen Shot 2017-02-18 at 15.42.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/19227/7ada3465-3c13-c092-875b-da23fd3ed7f5.png">