Forțăm MacBook Pro 2018 T2 să funcționeze cu ArchLinux (dualboot)

A apărut multă gălăgie în jurul ideii că, din cauza noului chip T2, nu se poate instala linux pe noile MacBook-uri 2018 cu Touch Bar. A trecut timpul, iar spre sfârșitul anului 2019, dezvoltatorii terți au realizat o serie de drivere și patch-uri de kernel pentru interactiunea cu chipul T2. Principalul driver pentru modelele MacBook din 2018 și mai recente permite funcționarea VHCI (funcționarea Touch Bar-ului/ tastaturii/ etc.) precum și funcționarea sunetului.

Proiect mbp2018-bridge-drv împărțit în 3 componente principale:

  • BCE (Buffer Copy Engine) – stabilește canalul principal de comunicare cu T2. VHCI și Audio necesită această componentă.
  • VHCI – este un controler de tip USB virtual; tastatura, mouse-ul și celelalte componente ale sistemului sunt furnizate de această componentă (alte drivere utilizează acest controler pentru a oferi funcționalitate extinsă.
  • Audio – driverul pentru interfața audio T2, în prezent suportă doar ieșirea de sunet prin difuzoarele încorporate ale MacBook-ului.


Al doilea proiect se numește macbook12-spi-driver, și permite funcționarea driverului de input pentru tastatură, trackpad SPI, Touch Bar pentru MacBook Pro din 2016 și versiuni ulterioare. O parte din driverele pentru tastatură/trackpad sunt acum incluse în kernel, începând cu versiunea 5.3.

De asemenea, a fost implementat suportul pentru dispozitive precum Wi-Fi, trackpad, etc., prin patch-uri de kernel. În prezent, versiunea kernel-ului 5.3.5-1

Ce funcționează în prezent

  1. NVMe
  2. Tastatură
  3. USB-C (Thunderbolt n-a fost testat, la bootarea automată a modulului, sistemul se blochează complet)
  4. Touch Bar (cu opțiunea de activare a tastelor Fn, iluminare, ESC etc.)
  5. Sunet (doar difuzoarele încorporate)
  6. Modul Wi-Fi (prin brcmfmac și doar prin iw)
  7. DisplayPort prin USB-C
  8. Senzori
  9. Suspendare/întoarcere (parțial)
  10. etc.

Acest tutorial este aplicabil pentru macbookpro15,1 și macbookpro15,2. La bază a fost folosit un articol de pe GitHub în engleză de aici. Nu tot ce este în acest articol a funcționat, astfel că a trebuit să caut soluții pe cont propriu.

Ce va fi necesar pentru instalare

  • Adaptor USB-C la USB (cel puțin trei porturi USB pentru conectarea unui mouse, tastatură, modem USB sau telefon în modul tethering). Acest lucru este necesar doar în etapele inițiale ale instalării.
  • Tastatură USB
  • USB/USB-C stick de memorie cu minim 4GB

1. Deconectăm restricția de boot de pe medii externe.

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

2. Alocăm spațiu liber folosind Disk Utility.

Pentru comoditate, am alocat imediat 30GB pe disc, formatându-l în exfat în Disk Utility. Partiționarea discului fizic în Disk Utility..

3. Creăm imaginea ISO

Opțiuni:

  1. Puteți urma calea simplă și să descărcați o imagine gata făcută cu kernelul 5.3.5-1 și patch-urile de la aunali1 linkul către imaginea gata făcută
  2. Să formăm imaginea manual prin archlive (este necesar un sistem cu distribuția Arch)

    Instalăm archiso

    pacman -S archiso

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

    Adăugăm repository în pacman.conf:

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

    Ignorăm kernelul original în pacman.conf:

    IgnorePkg   = linux linux-headers
    

    Adăugăm pachetele necesare, la final adăugăm kernelul linux-mbp și linux-mbp-headers

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

    Modificăm scriptul pentru a funcționa în mod interactiv (înlocuind pacstrap -C cu 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!"
    }

    Formăm imaginea:

    sudo ./build.sh -v

    Apăsăm Y pentru a sări peste pachetele ignorate, apoi scriem imaginea ISO pe un stick USB:

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

4. Prima pornire

Ne repornim cu stick-ul inserat și tastatura. Apăsăm options la apariția mărului, alegem EFI BOOT.

Apoi trebuie să apăsați tasta „e” și să scrieți la sfârșitul liniei de comandă module_blacklist=thunderbolt. Dacă nu faceți acest lucru, sistemul poate să nu pornească și va apărea eroarea Thunderbolt ICM Error.

Cu fdisk/cfdisk găsim partiția noastră (pentru mine este nvme0n1p4), o formatăm și instalăm Arch. Puteți folosi instrucțiunea oficială sau terță.

Nu creăm partiție de boot, vom scrie bootloader-ul în /dev/nvme0n1p1
După ce mediul este complet formatat în /mnt și înainte de a trece la arch-chroot, scriem:

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

Adăugăm în /etc/pacman.conf:


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

Instalăm kernelul:


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

Scriem thunderbolt și applesmc în /etc/modprobe.d/blacklist.conf

blacklist thunderbolt
blacklist applesmc

Tastatură, touchbar, etc

Instalăm yay:


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

Instalăm modulele pentru funcționarea touchbar-ului:


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

Adăugăm modulele în pornire automată: /etc/modules-load.d/apple.conf

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

Instalăm modulele kernelului pentru funcționarea tastaturii. În repository anuali1 există un pachet gata făcut, numit apple-bce-dkms-git. Pentru a-l instala, scriem în consolă:

pacman -S apple-bce-dkms-git

În acest caz, modul kernelului se va numi apple-bce. În cazul compilării autonome, se numește bce. Prin urmare, dacă doriți să specificați modulul în secțiunea MODULES din fișierul mkinicpio.conf, nu uitați ce modul ați instalat.

Compunere manuală:


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

Adăugăm modulul bce sau apple-bce la pornire: /etc/modules-load.d/bce.conf

bce

Dacă doriți să folosiți butoanele Fn ca implicit, în fișierul /etc/modprobe.d/apple-tb.conf scriem:

options apple-ib-tb fnmode=2

Actualizăm kernel-ul și initramfs.


mkinitcpio -p linux-mbp

Instalăm iwd:

sudo pacman -S networkmanager iwd

5. Bootloader

După ce toate pachetele principale sunt instalate în chroot, putem începe instalarea bootloader-ului.

Nu am reușit să fac grub-ul să funcționeze. De pe un USB extern, grub-ul pornește, dar când încerc să-l instalez în nvme prin

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

sistemul merge în panică kernel, iar după repornire noul punct nu apare printre opțiuni. Nu am găsit o soluție clară pentru această problemă și astfel am decis să încerc să implementez boot-ul folosind systemd-boot.

  1. Lansăm
    bootctl --path=/boot install

    și cădem în panică kernel. Oprim MacBook-ul, repornim, apăsăm opțiuni (hub-ul usb-c cu tastatură nu se deconectează)

  2. Verificăm că a apărut o nouă înregistrare EFI BOOT pe lângă dispozitivul extern
  3. Alegem să bootăm de pe USB extern, ca la prima instalare (nu uitați să specificați module_blacklist=thunderbolt)
  4. Montăm discul nostru și trecem în mediu prin arch-chroot


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

Dacă este necesar ca tastatura să funcționeze înainte de încărcarea completă a sistemului (asta e necesar în cazul utilizării criptării luks/dm-crypt) atunci scriem în fișierul /etc/mkinicpio.conf în secțiunea MODULES:

MODULES=(ext4 applespi intel_lpss_pci spi_pxa2xx_platform bce)

Actualizăm kernel-ul și initramfs.


mkinicpio -p linux-mbp

Configurăm systemd-boot

Edităm fișierul /boot/loader/loader.conf, ștergem tot ce este în interior și adăugăm următoarele:

default arch
timeout 5
editor 1

Mergem în folderul /boot/loader/entries, creăm fișierul arch.conf și scriem:

titlu arch
linux \/vmlinuz-linux-mbp
initrd \/initramfs-linux-mbp.img
opțiuni root=\/dev\/<b>nvme0n1p4</b> rw pcie_ports=compat

În cazul în care ați utilizat luks și lvm, atunci

opțiuni cryptdevice=\/dev\/<b>nvme0n1p4</b>:luks root=\/dev\/mapper\/vz0-root rw pcie_ports=compat

Repornim în MacOS.

6. Configurarea Wi-Fi

Așa cum s-a dovedit, fișierele firmware-ului pentru adaptorul Wi-Fi se află în folderul /usr/share/firmware/wifi , și le putem lua de acolo sub formă de blob-uri și să le alimentăm modulului kernel brcmfmac. Pentru a afla exact ce fișiere folosește adaptorul dvs., deschideți terminalul în MacOS și scrieți:

ioreg -l | grep C-4364

Obținem o listă lungă. Ne trebuie doar fișierele din secțiunea 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>"})

În cazul dumneavoastră, numele fișierelor pot diferi. Le copiem din folderul /usr/share/firmware/wifi pe un flash drive și le redenumim în următoarea formă:

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

În acest caz, ultimul fișier text conține denumirile modelului. Dacă modelul vostru nu este macbookpro15,2, atunci trebuie să redenumiți acest fișier conform modelului vostru de MacBook.

Rebootăm în Arch.

Copiăm fișierele de pe flash în folderul /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/

Verificăm funcționalitatea modulului:


rmmod brcmfmac
modprobe brcmfmac

Ne asigurăm că interfața de rețea a apărut prin ifconfig/ip.
Configurăm wifi prin iwctl

Atenție. Prin netctl, nmcli etc. interfața nu funcționează, doar prin iwd.

Forțăm NetworkManager să folosească iwd. Pentru aceasta, creăm fișierul /etc/NetworkManager/NetworkManager.conf și scriem:

[device]
wifi.backend=iwd

Pornim serviciul NetworkManager


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

7. Sunet

Pentru a face sunetul să funcționeze, este necesar să instalăm pulseaudio:


sudo pacman -S pulseaudio

Descărcăm trei fișiere:

Le mutăm:

    /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. Suspendare/Reluare

În acest moment 16.10.2019 trebuie să alegem fie sunetul, fie suspendare/reluare. Așteptăm ca autorul modulului bce să finalizeze funcționalitatea.

Pentru a construi modulul cu suport pentru suspendare/reluare, trebuie să executați următoarele:


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

Dacă ați instalat modulul apple-bce din repository-ul anuali1, trebuie să-l ștergeți mai întâi și doar apoi să construiți și să instalați modulul bce cu suport pentru modul suspendare.

De asemenea, trebuie să adăugați modulul applesmc în blacklist (dacă nu ați făcut acest lucru anterior) și să vă asigurați că în /boot/loader/entries/arch.conf în linia options la sfârșit a fost adăugat parameterul pcie_ports=compat.

În prezent, driverul touchbar-ului se blochează la intrarea în modul suspendare, iar driverul thunderbolt uneori suspendă sistemul mai mult de 30 de secunde, iar la reluare — câteva minute. Acest lucru poate fi corectat prin descărcarea automată a modulilor problematice.

Creați un script /lib/systemd/system-sleep/rmmod.sh:

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

Faceți-l executabil:

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

Până acum este totul. În concluzie, avem un sistem destul de funcțional, cu câteva nuanțe legate de suspendare/reluare. Nu s-au observat blocări sau panică a kernel-ului pe parcursul a câtorva zile de uptime. Sper că în curând autorul modulului bce îl va finaliza și vom obține suport complet pentru suspendare/reluare și sunet.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster