Прымушаем працаваць MacBook Pro 2018 T2 c 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 (неабходна сістэма з дыстрыбутывам арча)

    Усталёўваны архіза

    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. У выпадку самастойнай зборкі ён называецца 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

Дадаць каментар