Build Ubuntu on MacBook Pro (May 2019) Part 1

08/23

MacBook Pro (May 2019)にUbuntuを入れる その1

Index 目次

The Appeal of Macbook 魅力

以前までは10年以上前に使っていたMacBook Air(11”, Mid 2011)を使っていた。
お金もなかったので中古で購入。OSもMac OS Xと呼ばれていた時代。
バージョンはMountain Lionまで入れたかな?
そうそう当時はネコ科動物の名前を当てていた。懐かしい。
さすがにもうバッテリもヘタってたり、MagSafeのアダプタが使いづらかったり
WiFiが802.11nまでしか対応してなかったり、容量も不安になってきたので。

今回新しくMacBook Pro (13”, 2019)を中古で手に入れた。
現在はAppleシリコン製CPUが主流となっているが、Intel CPU搭載のシリーズ後継機種。
キーボードの上部にタッチバーと、指紋センサーを兼ねている電源ボタンがある。
このタッチバーが曲者で、シチュエーションに応じていろんなボタンを便利に表示させるもので、これが本当に厄介。
コーダやSIerにとってFunctionキーやESCキーが打鍵感の皆無なタッチパネルになっていることはつらい。
特に致命的はESCキーで、VimmerやEmacsenにとって死活問題。
コマンドモードに戻るのに慣れない Ctrl + [ を押したり、M-xを押すのに Alt + x を押したりと不便。
指にフィードバックがないのでブラインドタッチも慣れが必要だし、あと普通にバッテリ浪費している、本当に無用の長物。
現に今のモデルには非搭載。黒歴史と言っていい。

黒歴史?

それ以外は特に不満はない。Thunderbolt 3ポートが4つもついているし、Ratinaディスプレイだし、キーピッチも好み。
ということで、この端末を手に入れた。

ただmacOSを動かすには若干非力なので、DebianかUbuntuを入れるって話。
それでも中古なので、バッテリがかなり心配。
新しいのに換装したほうが良いのかもしれない。やり方知らないで無責任に書いてるけど。

あ、あと、SecureBootをOFFにするので、そういうの気になる人とかビジネス用途の人は止めた方がよい。

Twists and Turns はまりまくりまくりすてぃ

簡単に行くもんだと高を括ってた。ところがさすがAppleのノート、一癖あるのがわかってくる。
今回何度もスクラップ&ビルドを繰り返してみてようやく分かった。
なので、2度と繰り返さないようにここに備忘として残す。

ハマったポイントは大まかに4つ

  • キーボード・トラックパッドの認識
  • タッチバーの認識
  • 無線LANデバイスの認識
  • カメラの認識

そしてまだ完璧には構築はできておらず、課題が残っている。
ま、それを踏まえて、さてやっていこう。

大きく工程としては3つ

  1. USBブート
  2. Ubuntuインストール
  3. Macbook用調整

Gave up Debian デビアン失敗

Ubuntu構築を紹介する前に、いろいろ失敗したのでちょっと紹介。
元よりDebianが好きだったので、まずはDebianを入れてみた。
USBBootディスクも持っていたので、すぐにでも始められたから。

結果からいうとうまく行かなかった。
今思うとカーネルとドライバさえ入れられれば、Debianでも動いたんじゃないか説。
ただ、本記事ははそこまで突っ込んでいないのであしからず。
トライしてみたことは、bookwormを入れて、apple-bce、apple_ibridgeをいれて、純正WiFiファームウェアからWiFiインタフェースを有効にできなくて頓挫した。(のちに失敗した理由が分かった)

てことで、Ubuntuを入れることに。
あまりUbuntuに詳しくないので、調べて22.04 Jammyというのが目に入ったのでそれにする。
これはジェイミー

Installation 構築

必要なものを全部書いていく。

The Necessities

  • Macbook Pro
    • 主役
  • USBメモリ 64GB
    • 容量は4.5GB以上あればひとまずよいのでは
  • USB TypeA(メス) <-> TypeC(オス)変換アダプタ
    • USBメモリのコネクタがTypeCなら不要
  • USB接続マウス
    • インストール中に使用
  • USB接続キーボード
    • インストール中に使用
  • USB接続イーサネットアダプタ
    • インストール中に使用した方がよい
  • インターネット環境
    • インストール中に使用した方がよい

楽に構築したい場合は最低限これらが必要になる。

Creating Boot Disk

家にUbuntuのLive USBディスクはないので、それを作るところから。
用意するものはこれ。

Desktop版のISOイメージをダウンロードして、Rufusで焼けば良い。
はい、終わり。
つぎー。

Installing Ubuntu

あ、そうだ。大事なこと書くの忘れてた。
私はプレインストールされていたmacOSには未練がないので、全ディスクをUbuntuに用意することに。Dual bootしても面白いけどね。
ただ、他にもMacは保有しているので今回は専用機とする。
というわけで、さらばmacOS。こんにちはUbuntuちゃん。

さて、USB Bootするには設定を変える必要がある。
ここらへんのMacbookからはセキュリティ目的のT2セキュリティチップというのが搭載されているので、その設定を変更して上げる必要がある。
x86マシンでいうところのBIOSやらUEFIを守るあれね。

Configuring Boot Security Settings

電源が落ちている状態から、右上の電源ボタンを押す。
すぐに、Command⌘ + k を押し続ける。
するとmacOS復旧用の画面が表示される、
ここで起動セキュリティユーティリティを起動して、「安全な起動」を「セキュリティなし」に、「許可する起動メディア」を「外部メディアまたはリムーバブルメディアからの起動を許可」に設定する。
詳しくはApple T2 セキュリティチップを搭載した Mac の起動セキュリティユーティリティについて - Apple サポート (日本)に書いてある。

Booting from USB

さてやっとUSBブートできる。
Macbook ProにUSB接続イーサネットとUSBメモリ、USBキーボード、USBマウスを挿して(ここ大事)、電源が落ちている状態で、 MacbookのキーボードのOption⌥ を押しながら起動すると、起動メディアを選択する画面が出てくるので、EFIって表示されているオレンジ色(?)のディスクを選択して、「↑」ボタンをクリックする。

USBからの起動がうまく行くと起動メニューが表示される。
ここから先はしばらくUSBキーボードとUSBマウスしか動かないので注意。
Try Ubuntuを選んでデスクトップが表示されるまで待つ。
んで、ここからはUbuntuのインストールウィザードになるのだが、ここは割愛。
ポイントは、サードパーティ製ドライバ用リポジトリもAPTに追加しておくこと、SSDのディスク全体をUbuntuで使うように設定すること。
インストールが終わったら、USBメモリを抜いて再起動。

Booting Ubuntu うぶんつすたーてぃん

再起動が終わったタイミングで、Ubuntuのきれいなデスクトップが見えているはずだが、このままでは

  • WiFiが使えない
  • キーボードが使えない
  • トラックパッドが使えない
  • タッチバーが使えない
  • カメラが使えない
  • Bluetoothは使えそう
  • 指紋認証使えない
  • A の左隣がCtrlじゃない(個人的な好み)

こんな状態。険しい道のりにみえるが、意外に簡単に解決する。(それもそのはず、何度も失敗しているから)
では、ひとつずつやっつけていく。

Up-to-dating

まずは何はともあれ最新化。

$ apt-get update
$ apt-get -y upgrade
$ apt-get -y install git curl gnupg make python3 libinput-tools python3-gi python-gobject meson gettext dmg2img

カーネルやその他のソフトが最新化される。
git 、cURL、GnuPG、makeなどはこのあとに必要なのでここで入れておく。
はい、これで一回目の再起動。

これ見えてるのか?

Enabling keyboard, trackpad and touchbar using linux-t2-lts

t2linux/T2-Debian-and-Ubuntu-Kernel: Ubuntu Kernel for T2 Macs.を参考にカーネルを差し替える。
README.mdを見ればわかるがさらっと紹介。
一番最初のCODENAMEの設定は、導入バージョンが22.04なのでjammyを設定。

$ CODENAME=jammy
$ curl -s --compressed "https://adityagarg8.github.io/t2-ubuntu-repo/KEY.gpg" |\
gpg --dearmor |\
sudo tee /etc/apt/trusted.gpg.d/t2-ubuntu-repo.gpg >/dev/null
$ sudo curl -s --compressed -o /etc/apt/sources.list.d/t2.list "https://adityagarg8.github.io/t2-ubuntu-repo/t2.list"
$ echo "deb [signed-by=/etc/apt/trusted.gpg.d/t2-ubuntu-repo.gpg] https://github.com/AdityaGarg8/t2-ubuntu-repo/releases/download/${CODENAME} ./" |\
sudo tee -a /etc/apt/sources.list.d/t2.list
$ sudo apt update
$ sudo apt install linux-t2-lts

これでまた、新しいカーネルが追加されることに。
その新しいカーネル(6.6.46-1-t2-jammy)はapple-bceとapple-ibrigdeというドライバが自動的に導入されるので、キーボードとトラックパッドとタッチバーが使えるようになるはず。
再起動後に晴れてUSBキーボードとUSBマウスを抜いてもよい。
ただ、このままだとgrubは今のカーネルをブートするはずなので、それをgrub.cfgを修正する必要があるが、ここでは詳しいことは割愛。
ここでは、新カーネルの起動順序の変更を行ったこととして、2回目の再起動。

Improvement of Trackpad

ただこのままではトラックパッドの動作が非常に怪しい。
なんというか反応が鈍いような。そこで次にトラックパッドを少し直していく。
トラックパッドを調整していく。
使用者(私)をinputグループに追加する。

$ sudo gpasswd -a $USER input

ここで一度今のログインセッションを抜けて再度ログインするか、再起動しておく。

$ mkdir work && cd work
$ git clone https://github.com/bulletmark/libinput-gestures.git
$ cd libinput-gestures  
$ sudo make install  
$ sudo ./libinput-gestures-setup install

んでサービス起動。

libinput-gestures-setup start
libinput-gestures-setup autostart

これでデフォルトの設定ファイルでサービスが起動しているはず。
設定ファイルは /etc/libinput-gestures.conf に保存されている。
仕組みとしてはトラックパッドのジェスチャーを受け取って、xdotoolに渡している。
んで、個人用に設定ファイルを残したい場合は、~/.config/libinput-gestures.conf
最後に設定用のツールを導入する。

$ git clone https://gitlab.com/cunidev/gestures  
$ cd gestures  
$ meson build --prefix=/usr  
$ ninja -C build  
$ sudo ninja -C build install
$ cp /etc/libinput-gestures.conf ~/.config/
$ cd ..

インストールが完了すると、アプリ一覧にGesturesが追加されるので、

gestures

このツールを使うとマルチタッチのいろんなジェスチャをカスタマイズできる。

Enabling Wifi Network Interface

一番はまったのがここ。
うまくいったときは思わず叫んでしまった。
ただここでは淡々と解説する。(なぜなら何度も失敗しているので)

これからやることを軽く説明する。

  • macOSの純正ファームウェアを適切に取得する。(ここ間違えると何時までも有効にならない沼へ)
  • 起動しているカーネルが参照しているファームウェアディレクトリにファームウェアファイルを適切なファイル名で保存する。(ここ間違えると何時までも有効にならない沼へ)

そう、ファームウェアを取得できればこちらの勝ちってこと。

Downloading Recovery OS

OSX-KVM/fetch-macOS-v2.py · GitHubにて、Pythonスクリプトを取得する。
このスクリプトを使って、RecoveryOS(ここではVentura)のディスクイメージをダウンロードする。
んで、そのままの勢いでディスクイメージをマウントする。

$ python3 fetch-macOS-v2.py
1. High Sierra (10.13)
2. Mojave (10.14)
3. Catalina (10.15)
4. Big Sur (11.7)
5. Monterey (12.6)
6. Ventura (13) - RECOMMENDED
7. Sonoma (14)

Choose a product to download (1-7): 6
$ ls
BaseSystem.chunklist BaseSystem.dmg gestures libinput-gestures
$ dmg2img -i BaseSystem.dmg BaseSystem.img
$ ls 
BaseSystem.chunklist BaseSystem.dmg BaseSystem.img gestures libinput-gestures
$ sudo losetup --find --show ./BaseSystem.img
/dev/loop14
$ sudo partprobe /dev/loop14
(ここでUbuntuがloopデバイスを認識して、Dockにドライブアイコンが表示されるので、ドライブをダブルタップ)
$ mount |grep $USER
/dev/loop14p1 on /media/$USER/macOS Base System type hfsplus (rw,nosuid,nodev,relatime,umask=22,uid=1000,gid=1000,nls=utf8,uhelper=udisk2)
$ 

Obtaining Firmware Files

さてリカバリディスクから何を取得するかは、ブートシーケンスでカーネルが教えてくれているはず。
確認してみる。

$ sudo grep -i -E "(error|failed)" /var/log/syslog
Aug 18 21:32:45 ubuntu kernel: [    7.925150] brcmfmac 0000:01:00.0: Direct firmware load for brcm/brcmfmac4364b2-pcie.apple,maui-HRPN-u-7.5-X3.bin failed with error -2
Aug 18 21:32:45 ubuntu kernel: [    7.925351] brcmfmac 0000:01:00.0: Direct firmware load for brcm/brcmfmac4364b2-pcie.apple,maui-HRPN-u-7.5.bin failed with error -2
Aug 18 21:32:45 ubuntu kernel: [    7.925384] brcmfmac 0000:01:00.0: Direct firmware load for brcm/brcmfmac4364b2-pcie.apple,maui-HRPN-u.bin failed with error -2
Aug 18 21:32:45 ubuntu kernel: [    7.925415] brcmfmac 0000:01:00.0: Direct firmware load for brcm/brcmfmac4364b2-pcie.apple,maui-HRPN.bin failed with error -2
Aug 18 21:32:45 ubuntu kernel: [    7.925445] brcmfmac 0000:01:00.0: Direct firmware load for brcm/brcmfmac4364b2-pcie.apple,maui-X3.bin failed with error -2
Aug 18 21:32:45 ubuntu kernel: [    7.925473] brcmfmac 0000:01:00.0: Direct firmware load for brcm/brcmfmac4364b2-pcie.apple,maui.bin failed with error -2
Aug 18 21:32:45 ubuntu kernel: [    7.925499] brcmfmac 0000:01:00.0: Direct firmware load for brcm/brcmfmac4364b2-pcie.bin failed with error -2
Aug 18 21:32:45 ubuntu kernel: [    7.925502] brcmfmac 0000:01:00.0: brcmf_pcie_setup: Dongle setup failed
$ 

ロード出来ていないファームウェアの製品名とコードネームから、取得すべきファイル名を推測する。
ここではbrcmfmac4364b2-pcie.apple,maui-HRPN-u-7.5-X3というのが分かる。
キーワードとしては、brcmfmac、4364、maui、HRPN、-u、X3あたり。
この情報を基にリカバリディスク内で探してみる。

$ cd /media/$USER/macOS\ Base\ System
$ find . -print 2>/dev/null |grep 4364 |grep maui |grep X3
./usr/share/firmware/wifi/C-4364__s-B2/maui-X3.clmb
./usr/share/firmware/wifi/C-4364__s-B2/maui-X3.trx
./usr/share/firmware/wifi/C-4364__s-B2/maui-X3.txcb
./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X3_M-HRPN_V-m__m-7.5.txt
./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X3_M-HRPN_V-m__m-7.7.txt
./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X3_M-HRPN_V-u__m-7.5.txt
$ 

いくつか見つかる。
ファイルの種類には以下のものがあることがわかる。

  • trxファイル (Firmware)
  • txcbファイル (TxCap)
  • clmbファイル (Regulatory)
  • txtファイル (NVRAM)

これらファイルを適切に取得する。
シンボリックリンクになっているものがあるので、念の為実ファイルをコピーすることにする。

$ find . -print 2>/dev/null |grep "C-4364__s-B2" |grep maui |while read i;do ls -l $i;done
lrwxr-xr-x 1 $USER $USER 9  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-ID.clmb -> maui.clmb
lrwxr-xr-x 1 $USER $USER 8  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-ID.trx -> maui.trx
lrwxr-xr-x 1 $USER $USER 9  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-ID.txcb -> maui.txcb
lrwxr-xr-x 1 $USER $USER 9  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-X0.clmb -> maui.clmb
lrwxr-xr-x 1 $USER $USER 8  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-X0.trx -> maui.trx
lrwxr-xr-x 1 $USER $USER 9  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-X0.txcb -> maui.txcb
lrwxr-xr-x 1 $USER $USER 9  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-X2.clmb -> maui.clmb
lrwxr-xr-x 1 $USER $USER 8  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-X2.trx -> maui.trx
lrwxr-xr-x 1 $USER $USER 9  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-X2.txcb -> maui.txcb
lrwxr-xr-x 1 $USER $USER 9  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-X3.clmb -> maui.clmb
lrwxr-xr-x 1 $USER $USER 8  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-X3.trx -> maui.trx
lrwxr-xr-x 1 $USER $USER 9  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui-X3.txcb -> maui.txcb
-rw-r--r-- 1 $USER $USER 33226  1月  6  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui.clmb
lrwxr-xr-x 1 $USER $USER 9  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui.trx -> ekans.trx
-rw-r--r-- 1 $USER $USER 721  1月  6  2023 ./usr/share/firmware/wifi/C-4364__s-B2/maui.txcb
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-ID_M-HRPN_V-m__m-7.5.txt -> P-maui_M-HRPN_V-m__m-7.5.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-ID_M-HRPN_V-m__m-7.7.txt -> P-maui_M-HRPN_V-m__m-7.7.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-ID_M-HRPN_V-u__m-7.5.txt -> P-maui_M-HRPN_V-u__m-7.5.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X0_M-HRPN_V-m__m-7.5.txt -> P-maui_M-HRPN_V-m__m-7.5.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X0_M-HRPN_V-m__m-7.7.txt -> P-maui_M-HRPN_V-m__m-7.7.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X0_M-HRPN_V-u__m-7.5.txt -> P-maui_M-HRPN_V-u__m-7.5.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X2_M-HRPN_V-m__m-7.5.txt -> P-maui_M-HRPN_V-m__m-7.5.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X2_M-HRPN_V-m__m-7.7.txt -> P-maui_M-HRPN_V-m__m-7.7.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X2_M-HRPN_V-u__m-7.5.txt -> P-maui_M-HRPN_V-u__m-7.5.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X3_M-HRPN_V-m__m-7.5.txt -> P-maui_M-HRPN_V-m__m-7.5.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X3_M-HRPN_V-m__m-7.7.txt -> P-maui_M-HRPN_V-m__m-7.7.txt
lrwxr-xr-x 1 $USER $USER 28  9月 16  2023 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui-X3_M-HRPN_V-u__m-7.5.txt -> P-maui_M-HRPN_V-u__m-7.5.txt
-rw-r--r-- 1 $USER $USER 12560  8月  6  2021 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui_M-HRPN_V-m__m-7.5.txt
-rw-r--r-- 1 $USER $USER 12964  8月  6  2021 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui_M-HRPN_V-m__m-7.7.txt
-rw-r--r-- 1 $USER $USER 12905  8月  6  2021 ./usr/share/firmware/wifi/C-4364__s-B2/P-maui_M-HRPN_V-u__m-7.5.txt
$ 

見るとシンボリックリンクが貼られている。
先程のキーワードを基に以下のファイルとした。

  • P-maui_M-HRPN_V-u__m-7.5.txt
  • maui.clmb
  • ekans.trx
  • maui.txcb

この4ファイルを以下のファイル名で保存する。なぜこのファイル名かというと、何度も失敗してはログファイルを確認して分かったから。

  • P-maui_M-HRPN_V-u__m-7.5.txt -> brcmfmac4364b2-pcie.txt
  • maui.clmb -> brcmfmac4364b2-pcie.clm_blob
  • ekans.trx -> brcmfmac4364b2-pcie.apple,maui-HRPN-u-7.5-X3.bin
  • maui.txcb -> brcmfmac4364b2-pcie.txcap_blob

こんな感じね。

$ sudo cp ./usr/share/firmware/wifi/C-4364__s-B2/P-maui_M-HRPN_V-u__m-7.5.txt /lib/firmware/brcm/
$ sudo cp ./usr/share/firmware/wifi/C-4364__s-B2/maui.clmb /lib/firmware/brcm/
$ sudo cp ./usr/share/firmware/wifi/C-4364__s-B2/ekans.trx /lib/firmware/brcm/
$ sudo cp ./usr/share/firmware/wifi/C-4364__s-B2/maui.txcb /lib/firmware/brcm/
$ cd /lib/firmware/brcm
$ sudo ln -s P-maui_M-HRPN_V-u__m-7.5.txt brcmfmac4364b2-pcie.txt
$ sudo ln -s maui.clmb brcmfmac4364b2-pcie.clm_blob
$ sudo ln -s ekans.trx brcmfmac4364b2-pcie.apple,maui-HRPN-u-7.5-X3.bin
$ sudo ln -s maui.txcb brcmfmac4364b2-pcie.txcap_blob

これで再起動。
ウブンツバトルターン

画面右上に電波のマークが表示されていれば、WiFiインタフェースが有効になっているはず。
USB接続のイーサネットアダプタは外して良くなる。

Give a Rest 今回はここまで

長くなったのでここでやめておく。
かなり疲れた。
次は、カメラや指紋認証にトライしてみる。


コメント: