MacBook Pro 2017 (MacBook Pro 14,3) にWindowsとGentoo Linuxを突っ込んでトリプルブートを試みる

様々な事情がありMacBook Pro 2017 15-inchを購入することにしたので、いまのAir 2013 Lateから環境を移行すべく、MacBook ProにWindows (BootCamp) とGentooをインストールしたときの備忘録になります。

先に言っておきますが、**Linuxをネイティブで (仮想マシンを使わず) 入れる**ことが前もってわかっている**ならば**、事情がない限り**MacBook Pro** (特に15-inch) **は避けるべき**でしょう。

キーボード・トラックパッド (解決法があるので下に書きます)、ビルトインの音声入出力[^1] [^41]、サスペンドおよびハイバーネーション、**15-inchに限って内蔵Wi-Fi** [^40] が**使い物になりません**。詳しくは [GitHub: Dunedan/mbp-2016-linux] のまとめを参照してください。

[^1]: **サウンドカードが内蔵された**USBオーディオジャックなどであれば、適切なカーネルモジュールが導入されていれば動くと思います。例えば http://amzn.asia/0PrSBfq (USB Type-Aなので変換が必要) http://amzn.asia/7NCMNpZ (USB Type-Cだが低音が出ない？ので音楽用途には使用できない)。サウンドカードが内蔵されていない、ただのUSB-Type Cとイヤホンジャックを変換するだけのケーブルを使用しても音声入出力は不可能です。
[^41]: https://github.com/leifliddy/snd_hda_macbookpro を導入すると内蔵サウンドカードを使えるようになるかもらしいです。なお当方未テスト。
[^40]: https://bugzilla.kernel.org/show_bug.cgi?id=193121#c62 にある通り、適切なfirmwareを導入すればWi-Fiが使えるようになる可能性があります。ただ、うちのWi-Fiのパスワードの打ち間違いなのかわかりませんが、接続するところまでは行けてないです。

## Windowsのインストール

macOS付属のBoot Camp アシスタントを使用して、Windowsをインストールするだけです。
嘘をつきました、WindowsをインストールするだけならばBoot Camp アシスタントを使えばきっと苦労しません。
念の為USBマウスとキーボードを用意しておいたほうがいいかもしれません。

わたしはLinuxをインストールすること前提で考えていたので、Boot Camp アシスタントを使う前に、macOS付属ディスクユーティリティでLinuxのパーティションを作成していました。
が、どうやらこの方法でインストールしようとするとBoot Camp アシスタントがエラーで失敗するようです。
macOSのパーティション構成に変更が加わっているのが原因のようですが、macOSのエラーメッセージは基本的にクソなので、詳しい理由はよくわかりません[^2]。

[^2]: 右のURLにも同じような情報があります。 http://fgimian.github.io/blog/2016/03/12/installing-windows-10-on-a-mac-without-bootcamp/

Windowsのパーティションを大きめにとって、BootCampでインストールしてから、Windowsのパーティションを (Ubuntuなどで) 切り分けるほうが早いのかも。

### ディスクユーティリティーでLinuxのパーティションを作ってから、Windowsをインストールする場合

#### 必要なもの

* Windows 10のインストールメディア
    * Windows 10のインストール専用USBスティックが手元にある場合はそれを使えばいいです。
    * ない場合はisoを落としてきてUSBに「焼く」必要があります。isoファイルをそのままコピーしてはいけません
* MacBookのドライバーを入れるUSBメモリ (など、Wi-Fiを使わない場所にファイルが置ければ、おそらくどこでもいい)
    * 2GB以上の空きが必要です
    * インストールメディアと共通で構いません (インストール専用USBスティックの場合は書き込み可能なメディアを別に用意する必要があります)
* USB接続のマウスとキーボード
* 諦めない心

#### 手順

[Installing Windows 10 on a Mac without Bootcamp](http://fgimian.github.io/blog/2016/03/12/installing-windows-10-on-a-mac-without-bootcamp/)

* macOSのディスクユーティリティーでパーティションを切ります。Linuxのパーティションだけ作れば大丈夫です。[^3]
* Boot Camp アシスタントを起動して、インストールを試みます。エラー落ちしますが、気にしないでください。
* /Library/Application Support/BootCamp/WindowsSupport.dmg を開いて、中身をドライバーのUSBメモリにコピーします。
* シャットダウンします。必要のないUSBは外してください。インストールメディアをUSBに接続します。キーボードとマウスも接続します。
* Alt (macOS的に言うとOption) キーを押しながら電源を入れ、EFI Bootを選びます。(複数出てくる場合がありますが、その場合はWindowsインストール画面が出てくる方を当ててください)
* 画面のとおりにWindows 10のインストールを進めます。インストール先はBOOTCAMPと名前のついているパーティションをフォーマット指定して次へで大丈夫なはずです。間違っても違うパーティションを選んだりしないでください。死にます。
* Windowsのインストールが完了したらドライバーUSBメモリの中の、setup.exeを起動してドライバーをインストールします。

[^3]: EFIシステムパーティションはBoot Camp アシスタントかWindowsのインストール時に作られるので気にしなくていい……のかな？わたしは2013 LateのときにHFS+をEFIシステムパーティションの代わりに使用したので、そのときと同じように512MB HFS+パーティションを作りました。HFS+はジャーナリングなしとして作成しないと、Linuxからは書き込みができなくなるので注意しましょう (やらかした)。

日本語キーボードでかなと英数がキーとして認識されない場合は http://kuneoresearch.com/bootcamp-keyboard-driver-re-install/ を見るとどうにかなると思います。

Windowsシャットダウン→起動でTouchBarが使えなくなる場合は、高速スタートアップを無効にすると改善する場合があります。
無効にしてもTouchBarが使えないときがありますが、BootCamp Utilityのオプションから、キーボード→F1, F2,...のオプションに変更を加えて[^21]適用を押すとTouchBarが復活します。一度復活すれば元に戻しても大丈夫です。

[^21]: チェックが入っているならチェックを外す。チェックが入っていない状態ならチェックを入れましょう。

## Linuxをインストールする

さて本題の(Gentoo) Linuxを入れる手順です。

### 前提

[GitHub: Dunedan/mbp-2016-linux]のとおりですが、

* Linux 4.10より前のカーネルでは、追加のkernel boot parameter ```intremap=nosid```が必要です。
* 内蔵スピーカー、内蔵マイク、ビルトインイヤホンジャックは動作しません。
    * HDMIやサウンドカード内蔵USB[^1]などは動作します。
    * 2019年7月にout-of-treeではあるものの、kernel moduleが登場しました。[GitHub: davidjo/snd_hda_macbookpro](https://github.com/davidjo/snd_hda_macbookpro) これを書いている人はまだ試していません
* バッテリーは長持ちしません。
    * ```Battery life is still suboptimal, because power saving modes for several devices, like display (panel self refresh), SSD or the Thunderbolt controllers, aren't working yet. You can expected a battery life of less than 4 hours.```
    * macOSに比べてバッテリーの消耗が4倍くらい激しい気がします (macOSを普段使わないので参考程度に)。
* TouchbarがないモデルではBluetoothの処理でバグがあり、パッチを当てる必要があります。
* Linux <4.11 + without AMDGPUモデルでは、SSDの処理でバグがあるので[パッチかワークアラウンドが必要です](https://github.com/Dunedan/mbp-2016-linux#nvme)
* Linux >=4.18 <4.19.9 + AMDGPUで、[内蔵ディスプレイを見失います](https://github.com/Dunedan/mbp-2016-linux/issues/73)。4.19.9/4.20-rc4にはパッチが入って正常に動く模様 (まだ試していない)。[4.19系の該当コミット](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v4.19.12&id=3374518d4d1ae021dc60885f4ea8dca0a3ca290f)。詳しくは[Linux kernel 4.18 breaks display on 14,3](https://github.com/Dunedan/mbp-2016-linux/issues/73)。
* Thunderboltの動作にはLinux 4.13以上が必要です。
* キーボード、トラックパッドの動作には[カーネル外のモジュール](https://github.com/cb22/macbook12-spi-driver)が必要です。タッチバーモデルには[fork版](https://github.com/roadrunner2/macbook12-spi-driver)を使うといいと思いますが、Fnキーがモジュールに吸い込まるのか、Fnキーを押しても入力として扱われないことがあります。
* [15-inchモデルのWi-Fiは思うように動きません](https://github.com/Dunedan/mbp-2016-linux#wi-fi)。[ワークアラウンドはあるっぽい](https://bugzilla.kernel.org/show_bug.cgi?id=193121#c31)ですが、[5GHz帯が使えません](https://bugzilla.kernel.org/show_bug.cgi?id=193121#c25)。GNOMEで表示される電波強度も本来より小さく表示されるみたいです。

どうですか？~~嫌になりますね~~ 楽しくなってきますね！

### Ubuntu等でキーボード・トラックパッドを使用できるようにする

Ubuntuなどでは[GitHub: roadrunner2/macbook12-spi-driver](https://github.com/roadrunner2/macbook12-spi-driver/)にあるとおり、dkmsを使いましょう (Gentooは後述します)。Archは[macbook12-spi-driver-dkms](https://aur.archlinux.org/packages/macbook12-spi-driver-dkms/)でいいんじゃないでしょうか。

### Gentoo Linuxをインストールしよう

基本的には[Gentoo Linux amd64 ハンドブック: Gentoo をインストールする](https://wiki.gentoo.org/wiki/Handbook:AMD64/Full/Installation/ja)の通りにやればいいです。繰り返しますがUSB接続できるキーボードマウスは必要です。

UEFIが必要なので、Gentoo Minimal Installation CDは使用できません。UEFIモードで起動できるLinuxを使用する必要があります (Linux 4.11以上推奨)。Gentoo HybridISO (LiveDVD) はあまり更新されていなさそうなので、使わないほうがよさげな雰囲気があります。わたしはUbuntu 18.04 Desktop (Linux 4.15) をUSBに焼いて、Live環境を使用してインストールしました。

基本的にはハンドブックの通りに進めましょう。Linuxカーネルは、unstableでも最新に近いものを使いましょう

```console
# emerge \>=sys-kernel/gentoo-sources-4.16 -av
```

#### AMDGPUのカーネルコンフィグ

MacBook Pro14,3固有のカーネルコンフィグは、以下の項目は必要になるのではないでしょうか。面倒でconfigはあまり詰めない方針なので、お好きに取捨選択してください。

Genkernelを使えばここらへんやってくれそうな気がしますが、使ったことがないので私にはわからんです。

参考: [Gentoo Wiki: AMDGPU](https://wiki.gentoo.org/wiki/AMDGPU)

```
Device Drivers  -->
      IOMMU Hardware Support -->
        [*] AMD IOMMU support
        <*> AMD IOMMU Version 2 driver
      Graphics support  -->
        <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) -->
              [*] Enable legacy fbdev support for your modesetting driver
        < > ATI Radeon
        <M> AMD GPU
              [ ] Enable amdgpu support for SI parts
              [ ] Enable amdgpu support for CIK parts
                  ACP (Audio CoProcessor) Configuration  -->
                    [*] Enable AMD Audio CoProcessor IP support (CONFIG_DRM_AMD_ACP)
                  Display Engine Configuration  -->
                    [*] AMD DC - Enable new display engine
                    [*] DC support for Polaris and older ASICs
        <M> HSA kernel driver for AMD GPU devices
```

AMD GPUのモジュールをbuilt-inにする場合は[AMD GPU#Incorporating Firmware](https://wiki.gentoo.org/wiki/AMDGPU#Incorporating_firmware)のとおりkernelにfirmwareを組み込む必要があります。

MacBook Pro 14,3に搭載されているAMD GPUはPolaris 11 (Radeon Pro 555/560) なので、組み込むべきfirmwareは、

```
amdgpu/polaris11_ce.bin amdgpu/polaris11_k_smc.bin amdgpu/polaris11_mc.bin amdgpu/polaris11_me.bin amdgpu/polaris11_mec2.bin amdgpu/polaris11_mec.bin amdgpu/polaris11_pfp.bin amdgpu/polaris11_rlc.bin amdgpu/polaris11_sdma1.bin amdgpu/polaris11_sdma.bin amdgpu/polaris11_smc.bin amdgpu/polaris11_smc_sk.bin amdgpu/polaris11_uvd.bin amdgpu/polaris11_vce.bin
```

#### その他のカーネルコンフィグ

面倒でconfigはあまり詰めない方針＆ここにある以外でも結構オプション入れてるので、取捨選択ｒｙ

[Gentoo Wiki: Bluetooth](https://wiki.gentoo.org/wiki/Bluetooth)
[MBPに必要なBluetoothのモジュールのリスト](https://github.com/Dunedan/mbp-2016-linux/issues/29#issuecomment-368332604)

```
Device Drivers -->
      NVME Support -->
        [*] NVM Express block device
  [*] SPI support -->
        <M> PXA2xx SSP SPI master  # required for macbook12-spi-driver
      Characters devices -->
            Serial drivers -->
              <*> Support for Synopsys Designware 8250 quirks  # Bluetoothに必要らしい https://github.com/Dunedan/mbp-2016-linux/issues/29#issuecomment-368332604
        <*> Serial device bus  # Bluetooth
  [*] GPIO Support -->  # Bluetoothに必要らしい
      Multifunction device drivers -->
        <M> Intel Low Power Subsystem support in PCI mode  # required for macbook12-spi-driver
  <*> Sound card support  --->
        <*> Advanced Linux Sound Architecture  --->
              [*] PCI sound devices --->
                  HD-Audio  --->
                    <*> HD Audio PCI
                    [*] Support initialization patch loading for HD-audio
                    <*> whatever audio codec your soundcard needs  # 内蔵のaudioはここで何選んでも今のところ使えない (ことになっている)
                    <*> Build HDMI/DisplayPort HD-audio codec support
                    (2048) Pre-allocated buffer size for HD-audio driver  # recommended for pulseaudio
              [*] USB sound devices -->
                    <*> USB Audio/MIDI driver  # USBのサウンドカードを使う場合(？)
      HID support -->
            Intel ISH HID support -->
                  Intel Integrated Sensor Hub  # いるのか？
      USB support -->
        <*> USB Type-C Support -->
              <*> USB Type-C Port Controller Manager  # いるのか？
      Hardware Monitoring support -->
        <*> Apple SMC  # なくてもいい
        <*> Intel Core/Core2/Atom temperature sensor  # CPU温度
      Network devices support -->
            Wireless LAN -->
              [*] Broadcom devices
                    <M> Broadcom FullMAC WLAN driver  # linux-firmwareパッケージが必要、built-inにする場合はfirmwareの組み込みも必要、15-inchではfirmwareが不安定なので< >状態にすることを推奨
                          [*] PCIE bus interface support for FullMAC driver
  <*> Industrial I/O support -->  # 新しいapple-ibモジュールに必要
        [*] Enable buffer support within IIO
        [*] Enable triggered sampling support
            Accelerometers -->  # なんでもいいのですが、IIO_TRIGGERED_DRIVER (apple-ib-alsモジュールに必要) をyにできればいいです。
              [*] Bosch BMA180/BMA250 3-Axis Accelerometer Driver  # 上記参照
        
Networking support -->
  <*> Bluetooth subsystem support -->  # Bluetooth
        [*] Bluetooth Classic (BR/EDR) features
        <*>   RFCOMM protocol support
        [ ]     RFCOMM TTY support
        < >   BNEP protocol support
        [ ]     Multicast filter support
        [ ]     Protocol filter support
        <*>   HIDP protocol support
        [*]   Bluetooth High Speed (HS) features
        [*] Bluetooth Low Energy (LE) features
            Bluetooth device drivers -->
              <*> HCI UART driver
              [*] Broadcom device support
  -*- Wireless -->
        <*> cfg80211 - wireless configuration API
              [*] cfg80211 wireless extensions compatibility  # 15-inchのworkaroundに必要
```

#### macbook12-spi-driverのインストール (Gentoo)

[macbook12-spi-driver-9999.ebuild](https://github.com/turenar/portage-overlay/blob/26a6589f167a1719295c37d439afd249073e307f/sys-libs/macbook12-spi-driver/macbook12-spi-driver-9999.ebuild)みたいなものを用意してemergeすると、```KERNEL_DIR="/usr/src/linux-VERSION" emerge @module-rebuild```でモジュール再ビルドができるようになります。

```console
# mkdir /usr/local/portage{,/profiles,/metadata}
# echo 'local' > /usr/local/portage/profiles/repo_name
# echo 'masters = gentoo' > /usr/local/portage/metadata/layout.conf
# mkdir -p /etc/portage/repos.conf
# echo $'[local]\nlocation = /usr/local/portage\nmasters = gentoo\nauto-sync = no' > /etc/portage/repos.conf/local.conf
# mkdir /usr/local/portage/sys-libs{,/macbook12-spi-driver}
# wget https://raw.githubusercontent.com/turenar/portage-overlay/26a6589f167a1719295c37d439afd249073e307f/sys-libs/macbook12-spi-driver/macbook12-spi-driver-9999.ebuild -O /usr/local/portage/sys-libs/macbook12-spi-driver/macbook12-spi-driver-9999.ebuild
# ebuild /usr/local/portage/sys-libs/macbook12-spi-driver/macbook12-spi-driver-9999.ebuild manifest
# emerge macbook12-spi-driver -av
```

/etc/kernel/postinst.d/以下に実行可能ファイルを置いておくと、カーネルの```make install```で実行してくれる仕組み[^4]があるので、「カーネルアップデートしたらマウスとキーボードが使えなくなった」という事態を防ぐために、予防線を張っておくといいでしょう。

[^4]: /sbin/installkernel.shからrun-partsコマンドにより実行されます。引数\$1=カーネルバージョン、\$2=/boot中のkernel imageファイルパス

```sh:/etc/kernel/postinst.d/50-namae-omoitukanai
#!/bin/sh -e

make modules_install
KERNEL_DIR="/usr/src/linux-$1" emerge @module-rebuild
grub-mkconfig -o /boot/grub/grub.cfg
```

#### GRUBのインストール

ガイドブックのとおりやるだけ……だといいのですが、そうはいきません…………

基本的にはArchWikiの[HFS+のパーティションにインストールする場合](https://wiki.archlinux.jp/index.php/MacBook#GRUB_.E3.81.A7_Apple_.E3.81.AE.E3.83.96.E3.83.BC.E3.83.88.E3.83.AD.E3.83.BC.E3.83.80.E3.83.BC.E3.82.92.E4.BD.BF.E3.81.86)、[EFIパーティションにインストールする場合](https://wiki.archlinux.jp/index.php/MacBook#GRUB_.E3.82.92_EFI_.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3.E3.81.AB.E7.9B.B4.E6.8E.A5.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB.E3.81.99.E3.82.8B)のどちらかを参考にするといいでしょう。

ジャーナリングありのHFS+パーティションを作ってしまった人は残念ですが、ジャーナリングなしにするか一度WindowsなどのEFIパーティションにインストールしてからmacOSでコピーする必要があります。

そして、HFS+の場合は[blessコマンドを実行するのを忘れないようにしましょう](https://wiki.archlinux.jp/index.php/MacBook#bless_.E3.82.92.E4.BD.BF.E3.81.86)。EFIで必要になるのかは試してないのでわかりません.


たぶんここまでやれば、MacBookでも動くGentooが手に入る……はず。

#### 15-inchにおけるWiFi (2.4GHz) のワークアラウンド

https://bugzilla.kernel.org/show_bug.cgi?id=193121#c31

iwconfigのインストール

```console
$ sudo emerge wireless-tools -av
```

```console
$ sudo iwconfig wlp3s0 txpower 10dBm
```

再起動時に自動でやらせるなりお好みで

## トラブルシューティング

### GPartedでパーティションをいじったあと (？) にWindowsが起動しなくなる

Protective MBRではなくHybrid MBRになっているのが原因です。[Ensuring that a Hybrid MBR is not used](http://fgimian.github.io/blog/2016/03/12/installing-windows-10-on-a-mac-without-bootcamp/#ensuring-that-a-hybrid-mbr-is-not-used)に沿って対応しましょう。Linuxでやる場合はおそらく```/dev/nvme0n1```をgdiskの引数として渡せば良いはず。

## まとめ

つよくいきよう

[GitHub: Dunedan/mbp-2016-linux]: https://github.com/Dunedan/mbp-2016-linux