木炭価が高いブログ

めっちゃ木炭(`・ω・´)

Mac を macOS + Windows + Linux (Gentoo) のトリプルブートにする(`・ω・´)

Mac をトリプルブートしたい方は「なんでトリプルブートするんだろう?」ということに疑問を持つことはないと思いますので、前置きはこの辺にしておきます(`・ω・´)

Linuxディストリビューションの選び方

結論: Gentoo がよいのではないでしょうか(`・ω・´)?

Mac に 3 つの異なる OS を動かそうとすると一番問題なのはブートローダをどうするかということです。 ESP に各 OS のブートローダを相乗りさせたいところですが、ESP は正直手動でいじりたいパーティションではないです。 OS のインストーラは勝手にパーティションをいじったり ESP にファイルを配置したりして管理上良くないので、 Live CD から手動でインストールするタイプの Arch LinuxGentoo Linux がよいかと思われます(`・ω・´)

ところで最近 M1 Mac というものが登場しました。 これは amd64 ではないので本家の Arch Linux をインストールすることはできません。 いま自分の手元にある Mac はすべて Intel Mac ですが、将来のことを考えたときに、 Gentoo Linux が最も未来があるのではないでしょうか(`・ω・´)

環境

  • iMac 2019 (19,2)
  • Big Sur 11.2.3

今回の目標

  • すべての OS でディスクを暗号化して使う
  • Gentoo は Btrfs を使っていいかんじにする
  • Gentoo は Genkernel を使う(Genkernel はハマりポイントが多い)

手順

  1. macOS をディスク全体にインストールする
  2. Boot Camp を用いて Windows 10 をインストールする
  3. Windows 10 から Windowsパーティションを縮小して Gentoo のための空き領域を確保する
  4. Mac から rEFInd をインストールする
  5. Gentoo をインストールする
  6. Gentoogrub を使わずに rEFInd から直接起動する

macOS のインストール

macOS は最初からインストールされていると思います。 ここでのポイントはディスクユーティリティなどを使ってパーティションを切ったりしておかないことです。

macOS を暗号化するには FileVault を使えばよいのでらくちんです(`・ω・´)

Windows 10 のインストール

Boot Camp を用いて Windows 10 をインストールしましょう。 ここでのポイントは Windows の領域を大きめにとっておくことです。 Windows + Linux の大きさの領域を準備しておきましょう(`・ω・´)

Windows を暗号化するには BitLocker を使います。 Mac で BitLocker を使うときに TPM が使えないので代わりに USB メモリを使うことになります。 このとき USB メモリは FAT でフォーマットしておきましょう。 私は exFAT にしてしまったのですが、これは Linux で暗号化するときに面倒なことになります(なりました)

Gentoo のための空き領域を確保する

Windows を起動して Windows から Windowsパーティションを縮小します。 これは Windows の標準機能で操作が可能です(`・ω・´)

Mac から rEFInd をインストールする

rEFInd をブートに使うのが安定です。 rEFInd のインストールには SIP を無効にする必要があるので気をつけましょう。 Mac からインストールするのがよいと思います。 Gentoo の /boot に Btrfs を使いたい場合は Btrfs のドライバもインストールするようにしましょう(`・ω・´) (これはめんどくさいので /boot は ext4 にするのがよいと思われます)

Gentoo をインストールする

Gentoo Wiki を見ながらインストールします。 今回は、

  • Dm-crypt を使ってルートを暗号化する
    • key file を使う
  • Btrfs の透過圧縮を使う
  • Btrfs の subvolume を使ってスナップショットを簡単に取れるようにする
  • Genkernel を使ってカーネルをビルドする
  • Grub は使わない

という路線でいきます。

そうだ、Gentoo をインストールするときは tmux を使っておくと色々はかどります。 Live CD にインストールされているので使わない手はない(`・ω・´)!

Gentoo の暗号化には dm-crypt を使うのがよいと思います。 パーティション構成は

/dev/nvme0n1p1    (EFI) (Linux からいじらない)
/dev/nvme0n1p2    (macOS)
/dev/nvme0n1p3    (Windows)
/dev/nvme0n1p4    /boot    ext4
/dev/nvme0n1p5    /        btrfs

にするのがよいでしょう。

ここでのポイントは /boot を ext4 でフォーマットすることです。 rEFInd は普通のインストールで ext4 のドライバのみがインストールされます。 Btrfs もブート可能ですが操作がちょっと面倒になるので ext4 が簡単でよいです(`・ω・´)

/dev/nvme0n1p5 を dm-crypt で暗号化することになります。 ここでのポイントは cryptsetup open をするときに root という名前で open することです。

# cryptsetup open /dev/nvme0n1p5 root

Arch Wiki を見ると cryptroot という名前になっていますが、root にしないと Genkernel がルートを開けない(もしくは追加のカーネルパラメータが必要になる?) みたいです。 ちゃんと調べてないですが cryptroot だとハマったので root がよいみたいです(`・ω・´)

ここで Gentoo の起動時に毎回パスワードを打ち込みたくないという気持ちになります。 このとき key file を使うとよい気分になれます。 ちょうど Windows の BitLocker のために準備した USB メモリがあるのでこれを使いましょう。 USB メモリは FAT でフォーマットされていることだと思うので、ここに key file を設置しておきます。 Genkernel でビルドした initramfs からは exFAT を見に行くことができないので、 FAT でフォーマットすることはとても大事です(`・ω・´)

Btrfs の便利機能に透過圧縮があるので今回は使うことにします。 透過圧縮のアルゴリズムは lzo がよさそうです。 zstd も試してみましたが、カーネルのビルド時間が倍になりました。 透過圧縮を使うときはマウントしたあとに remount することでできます。

# mount /dev/mapper/root /dev/mnt
# mount -o remount,compress=lzo

Btrfs の便利機能に subvolume を用いたスナップショット作成があります。 Subvolume の配置は Arch Wiki を参考にしました。 ルートディレクトリに / が配置されないのはなんか面白いですね。 Btrfs Wiki も参考にしました。 fstab は

UUID=****  /var/lib/docker  btrfs noatime,subvol=/var/lib/@docker 0 0

みたいな雰囲気になります。 ところで fstab で思い出しましたが、NVMe の SSD では discard にしないほうがよいらしいです(Should TRIM be avoided for NVMe drives?) あと fsck も 0 がよいらしいです(`・ω・´)

Genkernel を使ってカーネルと initramfs をビルドします。 Genkernel を使えば楽ができてよいですね〜〜とおもっていたのですが案外ハマりポイントが多いです。 Genkernel は次のオプションを付けて実行します

# genkernel all --keymap --luks --btrfs --microcode

Genkernel のハマりポイントを上げていきます。

  • cryptsetup がインストールされていなくてもルートをマウントできてしまう

これまじでなんで?? ってなります。お前 cryptsetup インストールしてないやん。 cryptsetup のインストールを忘れずに行いましょう。

まじかーって感じです。FAT にしましょう。

そしてこれは Mac 特有の問題ですがカーネルソースコードをいじらないと Bluetooth が使えるようにならないらしいです(State of Linux on the MacBook Pro 2016 & 2017カーネルソースコードに書き加えるコードは数行なので、 Genkernel する前に書き換えておくとよいですね(?)

最後にブートローダですが Grub のかわりに rEFInd を使います。 /boot/refind_linux.conf を設置してカーネルパラメータを書いていきましょう。 今回は Genkernel を使ったので man genkernel しながらパラメータを書いていきます。 ポイントを上げていきます。

  • cryptroot=UUID=**** する
  • root_key=path/to/key する
  • root_keydev はなくても keyfile を探してくれる(あったほうがよい)

終了

OS をインストールすることと OS を便利に使うことは違うと思いますが、 すべての OS がひとつの PC で動くようになって満足です(`・ω・´)

© 2015 high-moctane