Примушуємо працювати MacBook Pro 2018 T2 з ArchLinux (dualboot)

Досить багато було галасу з приводу того, що через новий чіп T2 неможливо встановити linux на нові MacBook 2018 з тачбаром. Минав час, і під кінець 2019 року стронними розробниками було реалізовано низку драйверів та патчів ядра для взаємодії з чіпом T2. Основний драйвер для MacBook моделей 2018 та новіше реалізує роботу VHCI (робота тача/клавіатури/і.т.д.), а також функціонування звуку.

Проект mbp2018-bridge-drv розділений на 3 основні компоненти:

  • BCE (Buffer Copy Engine) – встановлює основний канал зв'язку з T2. VHCI та Audio вимагають цей компонент.
  • VHCI – це віртуальний хост-контролер USB; клавіатура, миша та інші компоненти системи надаються цим компонентом (інші драйвери використовують цей хост-контролер для забезпечення більшої функціональності).
  • Audio – драйвер для аудіоінтерфейсу T2, в даний час підтримується лише виведення звуку через вбудовані динаміки MacBook


Другий проект називається macbook12-spi-driver, і він реалізує можливість роботи драйвера введення для клавіатури, трекпада SPI, тачбара для MacBook Pro кінця 2016 і пізніших версій. Частина драйверів для клавіатури/трекпада тепер включена до ядра, починаючи з версії 5.3.

Також було реалізовано підтримку таких пристроїв, як wi-fi, тачпад, etc, за допомогою патчів ядра. На даний момент версія ядра 5.3.5-1

Що працює на даний момент

  1. NVMe
  2. клавіатура
  3. USB-C (Thunderbolt не перевірявся, при автоматичному завантаженні модуля підвішує систему намертво)
  4. Тачбар (з можливістю включення клавіш Fn, підсвічування, ESC тощо)
  5. Звук (тільки вбудовані динаміки)
  6. Модуль Wi-Fi (через brcmfmac і лише через iw)
  7. DisplayPort через USB-C
  8. Сенсори
  9. Suspend/Resume (частково)
  10. і т.п ..

Цей туторіал застосовується для macbookpro15,1 і macbookpro15,2. За основу було взято статтю з гітхабу англійською звідси. Не все із цієї статті запрацювало, тому довелося шукати рішення самостійно.

Що потрібно для встановлення

  • USB-C док-перехідник на USB (щонайменше три USB входи для підключення миші, клавіатури, usb модему або телефону в режимі tethering). Це необхідно лише на перших етапах встановлення
  • USB-клавіатура
  • USB/USB-C флешка мінімум на 4Гб

1. Відключаємо заборону завантаження із зовнішніх носіїв

https://support.apple.com/en-us/HT208330
https://www.ninjastik.com/support/2018-macbook-pro-boot-from-usb/

2. Виділяємо вільне місце за допомогою Disk Utility

Для зручності я одразу виділив 30Гб на диск, відформатувавши його в exfat у самому Disk Utility. Розбиття фізичного диска на розділи Disk Utility.

3. Формуємо iso образ

Варіанти:

  1. Можна піти простим шляхом та завантажити готовий образ з ядром 5.3.5-1 та пачтами від aunali1 посилання на готовий образ
  2. Сформувати образ самостійно через archlive (необхідна система з дистрибутивом арча)

    Встановлюємо archiso

    pacman -S archiso

    
    cp -r /usr/share/archiso/configs/releng/ archlive
    cd archlive
    

    Додаємо репозиторій до pacman.conf:

    
    [mbp]
    Server = https://packages.aunali1.com/archlinux/$repo/$arch
    

    Ігноруємо оригінальне ядро ​​в pacman.conf:

    IgnorePkg   = linux linux-headers
    

    Додаємо необхідні пакети, в кінці додаємо ядро ​​linux-mbp та linux-mbp-headers

    ...
    wvdial
    xl2tpd
    linux-mbp
    linux-mbp-headers
    

    Змінюємо скрипт для роботи в інтерактивному режимі (замінюємо pacstrap-C на pacstrap-i-C):

    sudo nano /usr/bin/mkarchiso

    # Install desired packages to airootfs
    _pacman ()
    {
        _msg_info "Installing packages to '${work_dir}/airootfs/'..."
    
        if [[ "${quiet}" = "y" ]]; then
            pacstrap -i -C "${pacman_conf}" -c -G -M "${work_dir}/airootfs" $* &> /dev/null
        else
            pacstrap -i -C "${pacman_conf}" -c -G -M "${work_dir}/airootfs" $*
        fi
    
        _msg_info "Packages installed successfully!"
    }

    Формуємо образ:

    sudo ./build.sh -v

    Натискаємо Y, щоб пропустити пакети, що ігноруються, потім пишемо iso-образ на usb флешку:

    sudo dd if=out/archlinux*.iso of=/dev/sdb bs=1M

4. Перше завантаження

Перезавантажуємося із вставленою флешкою ​​та клавіатурою. Натискаємо options з появою яблука, вибираємо EFI BOOT.

Далі необхідно натиснути клавішу e і вписати в кінець командного рядка module_blacklist=thunderbolt. Якщо цього не зробити, система може не завантажитися, і вилетить помилка Thunderbolt ICM Error.

За допомогою fdisk/cfdisk знаходимо наш розділ (у мене це nvme0n1p4), форматуємо та виконуємо установку арча. Можна скористатися офіційною інструкцією або строронніший.

Завантажувальний розділ не створюємо, завантажувач писатимемо в /dev/nvme0n1p1
Після того, як повністю сформовано оточення /mnt і перед тим, як перейти в arch-chroot, пишемо:

mount /dev/nvme0n1p1 /mnt/boot
arch-chroot /mnt /bin/bash

Додаємо в /etc/pacman.conf:


[mbp]
Server = https://packages.aunali1.com/archlinux/$repo/$arch

Встановлюємо ядро:


sudo pacman -S linux-mbp linux-mbp-headers
sudo mkinitcpio -p linux-mbp

Прописуємо thunderbolt та applesmc у /etc/modprobe.d/blacklist.conf

blacklist thunderbolt
blacklist applesmc

Клавіатура, тачбар, etc

Встановлюємо yay:


sudo pacman -S git gcc make fakeroot binutils
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

Встановлюємо модулі для роботи тачбару:


git clone --branch mbp15 https://github.com/roadrunner2/macbook12-spi-driver.git
cd macbook12-spi-driver
make install

Додаємо модулі до автозавантаження: /etc/modules-load.d/apple.conf

industrialio_triggered_buffer
apple-ibridge
apple-ib-tb
apple-ib-als

Встановлюємо модулі ядра для клавіатури. У репозиторії anuali1 є готовий пакет, він називається apple-bce-dkms-git. Щоб його встановити, пишемо в консолі:

pacman -S apple-bce-dkms-git

У цьому випадку модуль ядра називатиметься apple-bce. У разі самостійного складання він називається екб. Відповідно, якщо ви хочете прописати модуль у розділ MODULES у файл mkinicpio.conf, то не забудьте, який модуль ви встановлювали.

Складання вручну:


git clone https://github.com/MCMrARM/mbp2018-bridge-drv.git
cd mbp2018-bridge-drv
make
cp bce.ko /usr/lib/modules/extramodules-mbp/bce.ko

Додаємо модуль bce або apple-bce до автозавантаження: /etc/modules-load.d/bce.conf

bce

Якщо хочете використовувати за замовчуванням кнопки Fn, то файл /etc/modprobe.d/apple-tb.conf пишемо:

options apple-ib-tb fnmode=2

Оновлюємо ядро ​​та initramfs.


mkinitcpio -p linux-mbp

Встановимо iwd:

sudo pacman -S networkmanager iwd

5. Завантажувач

Після того, як усередині chroot всі основні пакети встановлені, можна приступати до встановлення завантажувача.

Мені так і не вдалося змусити працювати grub. З зовнішнього usb-диска grub завантажується, але при спробі прописати його в nvme через

grub-install -target=x86_64-efi-efi-directory=/boot-bootloader-id=grub

система відлітала у kernel panic, та після перезавантаження нового пункту через options не з'являлося. Якогось виразного вирішення цієї проблеми я не знайшов і тому вирішив спробувати реалізувати завантаження за допомогою systemd-boot.

  1. запускаємо
    bootctl --path=/boot install

    і відлітаємо в kernel panic. Вимикаємо MacBook, вмикаємо заново, тиснемо options (usb-c хаб з клавіатурою не відключаємо)

  2. Перевіряємо, що з'явився новий запис EFI BOOT крім зовнішнього пристрою
  3. Вибираємо завантаження із зовнішнього usb-диска, як при першій установці (не забуваємо прописати module_blacklist=thunderbolt)
  4. Монтуємо наш диск та переходимо в оточення через arch-chroot


mount /dev/nvme0n1p4 /mnt
mount /dev/nvme0n1p1 /mnt/boot
arch-chroot /mnt

Якщо необхідно, щоб клавіатура працювала до повного завантаження системи (це необхідно у разі використання шифрування luks/dm-crypt), то прописуємо у файл /etc/mkinicpio.conf в розділі MODULES:

MODULES=(ext4 applespi intel_lpss_pci spi_pxa2xx_platform bce)

Оновлюємо ядро ​​та initramfs.


mkinicpio -p linux-mbp

Налаштовуємо systemd-boot

Редагуємо файл /boot/loader/loader.conf, видаляємо все, що там усередині, і вносимо таке:

default arch
timeout 5
editor 1

Переходимо до папки /boot/loader/entries, створюємо файл arch.conf і пишемо:

title arch
linux /vmlinuz-linux-mbp
initrd /initramfs-linux-mbp.img
options root=/dev/<b>nvme0n1p4</b> rw pcie_ports=compat

Якщо використовували luks і lvm, то

options cryptdevice=/dev/<b>nvme0n1p4</b>:luks root=/dev/mapper/vz0-root rw pcie_ports=compat

Перезавантажуємось у MacOS.

6. Налаштування Wi-Fi

Як з'ясувалося, файли прошивок для wi-fi адаптера MacOS зберігає в папці /usr/share/firmware/wifi , і можна їх від туди взяти у вигляді блобів та згодувати модулю ядра brcmfmac. Для того, щоб з'ясувати, які саме файли використовує ваш адаптер, відкриваємо термінал у MacOS і пишемо:

ioreg -l | grep C-4364

Отримуємо довгий перелік. Нам потрібні файли лише з розділу RequestedFiles:

"RequestedFiles" = ({"Firmware"="<b>C-4364__s-B2/maui.trx</b>","TxCap"="C-4364__s-B2/maui-X3.txcb","Regulatory"="C-4364__s-B2/<b>maui-X3.clmb</b>","NVRAM"="C-4364__s-B2/<b>P-maui-X3_M-HRPN_V-m__m-7.7.txt</b>"})

У вашому випадку назви файлів можуть відрізнятися. Копіюємо їх з папки /usr/share/firmware/wifi на флешку і перейменовуємо в такий вигляд:

    maui.trx -> brcmfmac4364-pcie.bin
    maui-X3.clmb -> brcmfmac4364-pcie.clm_blob
    P-maui-X3_M-HRPN_V-m__m-7.7.txt -> brcmfmac4364-pcie.Apple Inc.-<b>MacBookPro15,2.txt</b>

У цьому випадку останній текстовий файл містить назви моделі, якщо ваша модель не macbookpro15,2, то необхідно перейменувати цей файл відповідно до вашої моделі макбука.

Перезавантажуємось в арч.

Копіюємо файли з флешки в папку /lib/firmware/brcm/


sudo cp brcmfmac4364-pcie.bin /lib/firmware/brcm/
sudo cp brcmfmac4364-pcie.clm_blob /lib/firmware/brcm/
sudo cp 'brcmfmac4364-pcie.Apple Inc.-<b>MacBookPro15,2.txt' /lib/firmware/brcm/

Перевіряємо працездатність модуля:


rmmod brcmfmac
modprobe brcmfmac

Переконуємося, що інтерфейс мережі з'явився через ifconfig/ip.
Налаштовуємо wifi через iwctl

Увага. Через netctl, nmcli, etc. інтерфейс не працює тільки через iwd.

Примушуємо NetworkManager використовувати iwd. Для цього створюємо файл /etc/NetworkManager/NetworkManager.conf і пишемо:

[device]
wifi.backend=iwd

Запускаємо службу NetworkManager


sudo systemctl start NetworkManager.service
sudo systemctl enable NetworkManager.service

7. Звук

Для того, щоб запрацював звук, необхідно встановити pulseaudio:


sudo pacman -S pulseaudio

Завантажуємо три файли:

Переміщуємо їх:

    /usr/share/alsa/cards/AppleT2.conf
    /usr/share/pulseaudio/alsa-mixer/profile-sets/apple-t2.conf
    /usr/lib/udev/rules.d/91-pulseaudio-custom.rules

8. Suspend/Resume

На поточний момент 16.10.2019 доводиться вибирати або звук, або suspend/resume. Чекаємо, поки автор bce модуля допиляє функціонал.

Щоб зібрати модуль із підтримкою susped/resume, необхідно виконати наступне:


git clone https://github.com/MCMrARM/mbp2018-bridge-drv.git
cd mbp2018-bridge-drv
git checkout suspend
make
cp bce.ko /usr/lib/modules/extramodules-mbp/bce.ko
modprobe bce

Якщо ви встановлювали готовий модуль apple-bce з репозиторію anuali1, необхідно його попередньо видалити і тільки після цього збирати і встановлювати bce модуль з підтримкою suspend режиму.

Також, необхідно додати в blacklist модуль applesmc (якщо ви цього не зробили раніше) і переконатися, що /boot/loader/entries/arch.conf в рядку options в кінці доданий параметр pcie_ports=compat.

Зараз драйвер тачбара вилітає при вході в режим suspend, а драйвер thunderbolt іноді підвішує систему більш ніж на 30 секунд, а при відновленні - на кілька хвилин. Це можна виправити шляхом автоматичного розвантаження проблемних модулів.

Створіть скрипт /lib/systemd/system-sleep/rmmod.sh:

#!/bin/sh
if [ "" == "pre" ]; then
        rmmod thunderbolt
        rmmod apple_ib_tb
elif [ "" == "post" ]; then
        modprobe apple_ib_tb
        modprobe thunderbolt
fi

Зробіть його виконуваним:

sudo chmod +x /lib/systemd/system-sleep/rmmod.sh

На цьому поки що все. У результаті вийшла цілком працездатна система, за винятком деяких нюансів із suspend/resume. Жодних вильотів та kernel panic не спостерігається протягом кількох днів аптайму. Сподіваюся, найближчим часом автор модуля bce його допилює, і ми отримаємо повноцінну підтримку suspend/resume та звуку.

Джерело: habr.com

Додати коментар або відгук