2016年以降のMacBookAir/MacBookProへのUbuntu 20.04のインストール

こちらは、MacBookAir9,1(2020)で実践しましたが、MacBookProでも動作すると思います。
2016年以降のMacには、T2セキュリティチップがあり、単純にはLinuxを実行できなくなりました。
しかし、有志でドライバやLinuxカーネルへのパッチが作られ、おおよそのハードウェアは動作するようになっています。

各世代のMacBookAir/Proで動作するものリスト https://github.com/Dunedan/mbp-2016-linux

なお、自分の環境では、以下は動作しませんでした。

- WiFi : USBの外付けWiFiアダプタで代用

## 資料

- https://gist.github.com/gbrow004/096f845c8fe8d03ef9009fbb87b781a4
- keyboard,touchpad driver https://github.com/roadrunner2/macbook12-spi-driver/tree/mbp15
- T2 Driver https://github.com/MCMrARM/mbp2018-bridge-drv/
- トラックパッドを快適に使うためにカーネルパッチを当てる https://github.com/aunali1/linux-mbp-arch
- 各世代のMacBookAir/Proで動作するものリスト https://github.com/Dunedan/mbp-2016-linux

## 必要なもの

- USB メモリ
- USB キーボード
- USB マウス
- USB WiFiアダプタ、もしくは、Ethernetアダプタ

USBキーボードとマウスは、ドライバが動作するまで必要になります。

## パーティションの分割

macOS を起動し、Utilities -> Disk Utilities からパーティションを作成。

- MacintoshHD 50G
- Linux exfat 200G

( exfat にしたのは特に理由はありません )

## Boot 可能な USB メモリの作成

Ubuntu 20.04 Desktop を使用。USB メモリの作成手順については、Ubuntu サイトの上部の Download タブを開き、TUTORIALS の Create a bootable USB stick on ...を参照。

## BIOS の設定的なの

macOS を再起動し、 Cmd+R をおしながら起動する。

macOS Utilities が表示されたら、上部メニューバーの Utilities -> Startup Security Utility を起動し、以下を設定する

- Secure Boot : No Security
- Allowed Boot Media : Allow booting from external or removable media

Utilities -> Terminal を起動し、以下を設定する

```
csrutil disable
```

## USB メモリの起動と、インストーラーの起動

Option キーを押しながら起動する。
USB メモリっぽい EFI Boot が 2 つ表示される（2 つ表示されない場合は、電源を長押しして再起動する）ため、右側を選択する。

Grub メニューでは `Ubuntu` を選択する。

Ubuntu のインストーラが立ち上がるが、新たに接続した USB キーボードとマウスしか反応しないため、これを使用する。

Ubuntu の Desktop が表示されるが、`Try Ubuntu`を選択する。

左下のメニューから、Terminal を起動し、Bootloader なしのオプションを追加して Ubuntu のインストーラを起動する。

```
sudo ubiquity -b
```

## インストール先の設定

インストール先の選択で、Something else を選択する。

`/dev/nvme0n1p3` が分割したパーティションに当たるため、これを、Format Ext4、Mount Path / に設定する。

Boot Loader のインストール先は `/dev/nvme0n1p3` を選択する。

その他のインストールの設定はお任せ。

## GRUB のインストール

再び USB メモリで`Try Ubuntu`で Ubuntu を起動し、Terminal を起動する。

以下のコマンドで、パーティション nvme0n1p1 、nvme0n1p2 、nvme0n1p3 があることを確認する。

```
lsblk
```

ここではパーティションは以下としている

- nvme0n1p1 : EFI
- nvme0n1p2 : macOS
- nvme0n1p3 : Ubuntu

ここで EFI と Ubuntu のパーティションをマウントして、grub-install を行う。
この時 `--force` を付ける必要があった。

```
sudo -s
mount /dev/nvme0n1p3 /mnt
mount /dev/nvme0n1p1 /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo chroot /mnt
grub-install --force /dev/nvme0n1
update-grub
```

PC を再起動する。このとき、Option キーを押しながら起動し、`EFI Boot`を選ぶ。すると、Ubuntu が起動するようになる。この Ubuntu ではキーボードとトラックパッドがまだ使うことができないため、USB のキーボード、マウスを利用する。

また、私の場合には WiFi が使えるようにならなかったため、USB の WiFi アダプタを使用する。

## キーボードとトラックパッドが動くまで

今動いているカーネルのバージョンを確認する。

```
uname -r
```

bce というモジュールをビルド、インストールする。

```
git clone https://github.com/MCMrARM/mbp2018-bridge-drv.git
cd mbp2018-bridge-drv
make
sudo cp bce.ko /usr/lib/modules/5.4.0-37-generic/kernel/drivers/pci/bce.ko
```

起動時にモジュールを読み込むようにする。

```
# vi /etc/modules
bce
```

ここのドライバをインストールする。

```
sudo apt install dkms
git clone --branch mbp15 https://github.com/roadrunner2/macbook12-spi-driver.git /usr/src/apple-ibridge-0.1
sudo dkms install -m apple-ibridge -v 0.1
```

再起動する。上の 2 つのモジュールが正しく読み込まれればキーボードとトラックパッドが動作する。ただしトラックパッドはクリックができるだけで、2 本指タップや 2 本指スクロールができないため、以下のカーネルパッチを当てる必要がある。

## Kernel にパッチを当てて、トラックパッドを快適に使う

https://github.com/aunali1/linux-mbp-arch

自分の環境では、全てのパッチを当てると動作しなかったため、以下のパッチのみを適用している。

```
3002-applesmc-make-io-port-base-addr-dynamic.patch
3003-applesmc-switch-to-acpi_device-from-platform.patch
3004-applesmc-key-interface-wrappers.patch
3005-applesmc-basic-mmio-interface-implementation.patch
3006-applesmc-fan-support-on-T2-Macs.patch
4001-touchpad.patch
4002-keyboard-backlight.patch
```

パッチと、Linux Kernel を入手する。

```
git clone https://github.com/aunali1/linux-mbp-arch
git clone https://github.com/torvalds/linux
cd linux
git checkout v5.6
```

トラックパッドは USB デバイスとして認識する。
マシンによって、ProductID が異なるので、dmesg でそれを確認する。ここでは、 0x0280 であることが確認できる。

```
# dmesg
[    2.546351] usb 5-5: New USB device found, idVendor=05ac, idProduct=0280, bcdDevice= 9.20
[    2.546353] usb 5-5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    2.546355] usb 5-5: Product: Apple Internal Keyboard / Trackpad
[    2.546356] usb 5-5: Manufacturer: Apple Inc.
[    2.546357] usb 5-5: SerialNumber: FM7020402GHN1QWAH+CML
```

これをパッチ中の適当なデバイスのものを上書きする。このリストにあるマシンならば変更は不要。自分は `USB_DEVICE_ID_APPLE_WELLSPRING10_T2_A`に上書きした。
本来ならPRにすべきところなのだが、patchの作り方を心得ていなくて出せていない。

```
# vi linux-mbp-arch/4001-touchpad.patch
 #define USB_DEVICE_ID_APPLE_WELLSPRING9_ISO		0x0273
 #define USB_DEVICE_ID_APPLE_WELLSPRING9_JIS		0x0274
+#define USB_DEVICE_ID_APPLE_WELLSPRING10_T2_A	0x0280
+#define USB_DEVICE_ID_APPLE_WELLSPRING10_T2_B	0x027b
+#define USB_DEVICE_ID_APPLE_WELLSPRING10_T2_C	0x027c
```

パッチを適用する。

```
patch -p1 --verbose < 3002-applesmc-make-io-port-base-addr-dynamic.patch
patch -p1 --verbose < 3003-applesmc-switch-to-acpi_device-from-platform.patch
patch -p1 --verbose < 3004-applesmc-key-interface-wrappers.patch
patch -p1 --verbose < 3005-applesmc-basic-mmio-interface-implementation.patch
patch -p1 --verbose < 3006-applesmc-fan-support-on-T2-Macs.patch
patch -p1 --verbose < 4001-touchpad.patch
patch -p1 --verbose < 4002-keyboard-backlight.patch
```

ビルドする設定が設定できるが、特に標準のままで OK。

```
make menuconfig
```

カーネルをビルドする。`-j16`は 16 並列のビルドを行うことを示すので、CPU のスレッド数を設定する。自分の場合は別マシンでビルドを行っていた（MacBookAir だと貧弱）。

```
make-kpkg -j 16 --rootcmd fakeroot --initrd --append_to_version=-mbp20 kernel_image kernel_headers
```

ビルドが終わると、Debian パッケージができるのでインストールする。

```
sudo apt install ./linux-headers-5.6.0-mbp20+_5.6.0-mbp20+-10.00.Custom_amd64.deb ./linux-image-5.6.0-mbp20+_5.6.0-mbp20+-10.00.Custom_amd64.deb
```

次の起動でこのカーネルが起動するように Grub を設定し、再起動する。

```
sudo grub-reboot 2
sudo reboot
```

Ubuntu 起動後、目的のカーネルで起動しているかどうかを確認する。

```
uname -r
```

bce を再ビルドしてインストールする。再ビルドインストールの方法は上と同じ。

spi ドライバが正しく起動しないことがあったため、再インストールする。

```
sudo dkms uninstall -m apple-ibridge -v 0.1
sudo dkms install -m apple-ibridge -v 0.1
```

再起動する。

```
sudo grub-reboot 2
sudo reboot
```

正しくトラックパッドのパッチがあたっている場合、bcm5974 というトラックパッドが認識する。

```
# xinput list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ bcm5974                                 	id=12	[slave  pointer  (2)]
```

大丈夫そうならば、Grub で起動するカーネルをビルドしたものに変更する。grub-customizer を使うと直感的に変更できるので便利です。

```
sudo apt install grub-customizer
sduo grub-customizer
```

## キーボードとトラックパッドのカスタマイズ

```
# Functionキーをメディアキーではなく、Functionキーとして使う
echo 2 | sudo tee /sys/module/hid_apple/parameters/fnmode

# CmdキーをAlt、OptionキーをSuperに割り当てる
echo 1 | sudo tee /sys/module/hid_apple/parameters/swap_opt_cmd

# 2本指タップでの右クリックを有効にする
xinput set-prop 'bcm5974' 'libinput Tapping Enabled' 1

# ダブルタップドラッグを無効化する
xinput set-prop 'bcm5974' 'libinput Tapping Drag Enabled' 0
```