1. Qiita
  2. 投稿
  3. ZFS

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

  • 0
    いいね
  • 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 loade

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

    レシピ

    ざっくりこんな感じで。

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

    ふつうに Disk Utility でできます。ボリュームのライブ縮小ができる点はZFSがHFS+やNTFSに劣る数少ない部分ですね。

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

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

    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で再設定してやれば元どおりになります。

    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スティックに標準で入ってます。