zfs - MacBook Air (13-inch, Late 2010) をオクタブート化

  • 17
    いいね
  • 0
    コメント

勇者がいないなら、自分が勇者になればいいのに。

前回記事

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

というわけでやりました。 illumos は後述の理由でないけどクワッドどころかオクタブートです。それもベアメタルで。

refind.jpg

MacBook Air (13-inch, Late 2010)。6年以上前のノートブックの未来、かつて私のメインノートで、その後長女のメインノート。だから裏蓋はこんな。

macbookair3,2.jpg

その長女のメインノートも、私と同じ MacBook Pro (Retina, 13-inch, Mid 2014) に変わって以来、しばらくお蔵入りしていたのを引っ張り出して来ました。

USB3はおろか、Thunderboltもない、CPUパワーは今日日のiPhoneに負けてしまうロートルですが、 Sierra も Windows 10 も動きます。もちろん Ubuntu だって FreeBSD だって。

というわけでこの子は

  1. ふつうの HFS+ 上の macOS Sierra
  2. ふつうの macOS Recovery1
  3. ふつうの Boot Camp な Windows 102
  4. ZFS上の macOS Sierra
  5. ZFS上の Ubuntu 16.04
  6. ZFS上の Ubuntu 16.10
  7. ZFS上の FreeBSD 11.0-RELEASE
  8. ZFS上の FreeBSD 12-CURRENT

という8種類のブートを現在サポートしています。

実は1から3までは、ふつうにBoot Camp化したMacと変わらず、OS X改めmacOSもWindowsもそのままアップグレードし続けて現在に至っています。つまり、元々あったものは何も失われていないのです。さすがに長女から戻って来たときにアカウントとユーザーは作り直していますが。

パーティション構成

しかしこの子には、パーティションはEFIを含めても6つしかありません。

macOS: diskutil list

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS root@dan-mba32          64.0 GB    disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
   4:       Microsoft Basic Data BOOTCAMP                64.0 GB    disk0s4
   5: 516E7CBA-6ECF-11D6-8FF8-00022D09712B               121.3 GB   disk0s5
   6:                 Apple_Boot boot                    650.0 MB   disk0s6

/dev/disk1 (external, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                            Sierra                 +549.8 GB   disk1

Windows: diskpart

DISKPART> list partition

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    Primary            200 MB    512 B
  Partition 2    Primary             59 GB   200 MB
  Partition 3    Primary            619 MB    59 GB
  Partition 4    Primary             59 GB    60 GB

Linux: fdisk -l

Device         Start       End   Sectors   Size Type
/dev/sda1         40    409639    409600   200M EFI System
/dev/sda2     409640 125409639 125000000  59.6G Apple HFS/HFS+
/dev/sda3  125409640 126679175   1269536 619.9M Apple boot
/dev/sda4  126679176 251679175 125000000  59.6G Microsoft basic data
/dev/sda5  251679176 488657351 236978176   113G FreeBSD ZFS
/dev/sda6  488657352 489926887   1269536 619.9M Apple boot

FreeBSD: gpart show

=>       34  490234685  diskid/DISK-906A52MPK0YK  GPT  (234G)
         34          6                            - free -  (3.0K)
         40     409600                         1  efi  (200M)
     409640  125000000                         2  apple-hfs  (60G)
  125409640    1269536                         3  apple-boot  (620M)
  126679176  125000000                         4  ms-basic-data  (60G)
  251679176  236978176                         5  freebsd-zfs  (113G)
  488657352    1269536                         6  apple-boot  (620M)
  489926888     307831                            - free -  (150M)

そして8つあるブート環境(boot environment)のうち5つは、ZFSパーティションの中に存在します。

zfs list

NAME                    USED  AVAIL  REFER  MOUNTPOINT
rpool                  30.4G  78.1G    88K  none
rpool/ROOT             30.3G  78.1G    88K  none
rpool/ROOT/Sierra      11.3G  78.1G  10.6G  /
rpool/ROOT/freebsd11r  3.39G  78.1G  3.31G  /
rpool/ROOT/freebsd12c  9.43G  78.1G  8.76G  /
rpool/ROOT/xenial      2.76G  78.1G  2.41G  /
rpool/ROOT/yakkety     3.42G  78.1G  3.69G  /
rpool/Users             352K  78.1G    88K  /Users
rpool/Users/Shared       88K  78.1G    88K  /Users/Shared
rpool/Users/dankogai     88K  78.1G    88K  /Users/dankogai
rpool/home             36.0M  78.1G   332K  /home
rpool/home/dankogai    32.2M  78.1G  24.6M  /home/dankogai
rpool/home/root         876K  78.1G   608K  /root
rpool/tmp                88K  78.1G    88K  /tmp
rpool/usr               464K  78.1G    88K  /usr
rpool/usr/local          88K  78.1G    88K  /usr/local
rpool/usr/obj            96K  78.1G    96K  /usr/obj
rpool/usr/ports          96K  78.1G    96K  /usr/ports
rpool/usr/src            96K  78.1G    96K  /usr/src
rpool/var                88K  78.1G    88K  /var

zfs get -t filesystem canmount

NAME                   PROPERTY  VALUE     SOURCE
rpool                  canmount  off       local
rpool/ROOT             canmount  off       local
rpool/ROOT/Sierra      canmount  noauto    local
rpool/ROOT/freebsd11r  canmount  noauto    local
rpool/ROOT/freebsd12c  canmount  noauto    local
rpool/ROOT/xenial      canmount  noauto    local
rpool/ROOT/yakkety     canmount  noauto    local
rpool/Users            canmount  off       local
rpool/Users/Shared     canmount  off       local
rpool/Users/dankogai   canmount  off       local
rpool/home             canmount  on        default
rpool/home/dankogai    canmount  on        default
rpool/home/root        canmount  on        default
rpool/tmp              canmount  off       local
rpool/usr              canmount  off       local
rpool/usr/local        canmount  off       local
rpool/usr/obj          canmount  off       local
rpool/usr/ports        canmount  off       local
rpool/usr/src          canmount  off       local
rpool/var              canmount  off       local

実のところ、UEFIとZFS rootをサポートしたOSであれば、rpoolにいくらでも足して行けます。今回illumosを見送ったのは、残念ながら現状ではUEFIがサポートされていないから。

https://wiki.illumos.org/display/illumos/Architecture

Currently not ported as Illumos kernel does not support UEFI. The UEFI boot will read efi boot program from EFI System partition (fat file system), and efi boot program will load the loader.

BIOS方式だと、使えるパーティションはBoot Campまでで食い潰されちゃってるわけです。

レシピ

ざっくりこんな感じで。

HFS+パーティションの縮小

ふつうに Disk Utility でできます。ボリュームのライブ縮小は、HFS+やNTFSにあってZFSにない数少ない機能ですね。APFSはどうなんだろう…

Windowsパーティションの引越し

ddgparted3を駆使しても出来るのですが、私はたまたま昔買ったWincloneを使いました。これだと Bootcamp Partition を圧縮して保管してくれるのでずいぶんと楽です。余談ですが、Windows 10からやっとライセンスの紐付けがハードウェア単位からユーザー単位になったようなので、(DSP版とかでなければ)この方法で別種のMacにもBoot Campを引っ越せるかもしれません4

ZFSプールおよびmacOS on ZFS root用のブートパーティションの準備

基本的にo3xのWikiページZFS on Bootの通りです。ZFS on Bootとはいっても、厳密にはZFS on Rootまでで、カーネルはHFS+なブートパーティションから読みます。私の場合、macOS Recoveryと全く同じサイズのパーティションを作りました。そして残った部分をすべてZFS用に。

  • macOS on ZFS root環境構築

これまたほぼZFS on Bootの通りなのですが、相違点もいくつか。

  • rpool作成時に、-O casesensitivity=insensitiveはつけない。他のOSとの共存で問題になるので。一方-O normalization=formDはmacOSのために必須。ファイルネーム的にはHFSXとほぼ同等。
  • ZFSのインストールは、o3x 1.6.1があればビルド不要
  • mount_zfsコマンドを/Library/Filesystems/zfs.fs/Contents/Resourcesディレクトリ内に用意しておかないとrootマウントに失敗する。環境構築時に/Volumes/SierraにmacOS on ZFS rootがマウントしてあるとして
$ cd /Volumes/Sierra/Library/Filesystems/zfs.fs
$ sudo cp -a /usr/local/bin/mount_zfs ./Contents/Resources
$ sudo ln -s ./Contents/Resources/mount_zfs .

として修正。

残りのOSのインストール

あとはちょろいものです。OSは「インスートル」せず、すでに出来上がっている環境(仮想マシンでもUSBメモリーでもOK)をzfs sendしてrpool/ROOT以下にreceiveすればいいのですから。

やや難しいのはブートローダーの構築なのですが、UEFIとrEFIndおかげで少し楽です。基本的にEFIパーティションの中にブートローダー放り込むだけでOKなので。

FreeBSD

# mkdir /boot/efi
# mount -t msdosfs /dev/ada0p1 /boot/efi
# mkdir -p /boot/efi/EFI/freebsd
# cp -a /boot/boot1.efi /boot/efi/EFI/freebsd

てな感じでいけます。なお、バージョン違いのFreeBSDをインストールする際には

# pkg install beadm
# beadm create freebsd12c
# beadm activate freebsd12c

などとしてBoot Environmentをcloneしてから再起動してからアップグレードすると楽です。

Ubuntu (and other Linuxen)

Ubuntu 16.04 Root on ZFSのTroubleshootingの方法にのっとってchrootした後に、grubを再構築すればOK。その際に

# bootid=xenial
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=$bootid --recheck --no-floppy

などとして、distroごとにgrubx64.efiが別ディレクトリーに入るようにしておくと、rEFIndで容易に切り替えられるようになります。

FreeBSDと違い、ZFS on Linux の grub は Boot Environment をサポートしておらず、root datasetはgrub.cfgに決め打ちになるのですが、rEFIndのおかげでかえってラクかも。

FreeBSD同様、root datasetをcloneしてからdist-upgradeすると楽ちんです。

CAVEAT

  • macOSとFreeBSDのブートローダーはプールのbootfsプロパティを見てどのデータセットを/にマウントするかを決めているので、これの変更を忘れてOSを切り替えると泣きを見ます。変更前に
# zpool set bootfs=rpool/ROOT/$nextboot rpool

しておくこと。

  • 他OSからLinuxに切り替えると、busyboxに落ちます。これはZFS on Linuxではブートごとにルートプールをimportし、シャットダウンごとにexportしているため、「まだexportされていないプールはimportしませんっ」ってのが理由なので、zpool import -f -N -R / rpoolと呪文を唱えてからctrl-Dすればおk。

OSごとの所感

macOS

ZFS上でも無問題。o3xのバージョンアップ以外なら、ふつうにソフトウェアアップデートもかけられますし、o3xのバージョンアップの場合にも、HFS+側をアップデートしてから/Library/Filesystems/usr/localrsyncしてからbootパーティションを再構築すればいけるはず。

Windows

UEFI時代前のWindows 7時代のBoot Campだけあって、BIOSモードでブートしているのですが、その点を除けばふつうに使えます。Windows 10の「メイジャーアップデート」(例えばAnniversary Editionとか)の際にトラックパッドを見失うのですが、この場合はDevice Managerで再設定してやれば元どおりになります。

cf. http://www.msitgeek.com/fixing-windows-8-trackpad-driver-in-bootcamp/

Ubuntu

さすがに枯れたマシンだけあって、wifi含め問題なし。唯一の問題はサスペンド時にディスプレイが戻らないことですが、これも/etc/pm/config.d/defaults

ADD_PARAMETERS="--quirk-reset-brightness"
DROP_PARAMETERS="--quirks-none"

を追記するだけでOK。こちらをメインに使いたい人も結構いるのでは。でもキーボード叩いてる時にトラックパッドきちんと無視してくれない…

FreeBSD

内臓wifiはダメですが、あとはまあまあ動きます。一応wspドライバーのおかげでマルチタッチもいけるはいけるのですが、Ubuntuほど自然ではないです。USB EthernetはAX88178A/AX88179を使ってるものであればaxgeドライバーで動きます。私の場合LUA4-U3-AGTを使ってます。/etc/rc.conf

ifconfig_ue0="DHCP"

としてから再起動するなりservice netif restartするなりすればOK。

macOSでもWindows 10でも使えますし、純正のThunderbolt Ethernet Adapterと違ってMac以外でも抜き差しOKでしかも安価(いずれも2000円弱)なので、一つ用意しておくといざという時「こんなこともあろうかと」できます。

さいごに

仮想マシンが散歩だとするとベアメタルは登山という感じですが、これくらいなら高尾山ぐらいかな。大昔のOSごとに実パーティションを切るマルチブートと比べたら、ZFSのマルチブートはほんとラク。

仮想マシンとコンテナに慣れきったみなさんも、たまにはベアメタルと戯れましょう。

Dan the Unofficial ZFS Advocate


  1. ふつうにcmd-Rで上がります 

  2. 厳密にはAppleのサポート切れ。BIOSエミュレーションのBoot CampはWindows 10をサポートしていないことになっている。がふつうにWindows 7をアップグレードすればほぼ無問題。 

  3. UbuntuのライブDVD/USBスティックに標準で入ってます。 

  4. cf. http://pc.watch.impress.co.jp/docs/topic/review/1008323.html