Uruchamiamy MacBook Pro 2018 T2 z ArchLinux (dualboot)

Bardzo dużo było hałasu na temat tego, że z powodu nowego chipu T2 niemożliwe jest zainstalowanie Linuxa na nowych MacBookach 2018 z Touch Barem. Czas mijał i pod koniec 2019 roku zewnętrzni deweloperzy wprowadzili szereg sterowników i łatek jądra do współpracy z chipem T2. Główny sterownik dla modeli MacBook z 2018 roku i nowszych realizuje pracę VHCI (działanie touchpada/klawiatury itp.), a także funkcjonowanie dźwięku.

Projekt mbp2018-bridge-drv podzielony na 3 główne komponenty:

  • BCE (Buffer Copy Engine) — ustawia podstawowy kanał komunikacji z T2. VHCI i Audio wymagają tego komponentu.
  • VHCI — to wirtualny kontroler hosta USB; klawiatura, mysz i inne komponenty systemu są dostarczane przez ten komponent (inne sterowniki korzystają z tego kontrolera hosta, aby zapewnić większą funkcjonalność.
  • Audio — sterownik dla interfejsu audio T2, obecnie wspierają tylko wyjście dźwięku przez wbudowane głośniki MacBooka.


Drugi projekt nosi nazwę macbook12-spi-driver, i realizuje możliwość działania sterownika wejścia dla klawiatury, touchpada SPI oraz Touch Bara w MacBook Pro z końca 2016 roku i nowszych. Część sterowników dla klawiatury/touchpada jest teraz włączona do jądra, począwszy od wersji 5.3.

Zrealizowano również wsparcie dla takich urządzeń jak Wi-Fi, touchpad itp., za pomocą poprawek jądra. Aktualnie wersja jądra 5.3.5-1

Co działa w tej chwili

  1. NVMe
  2. Klawiatura
  3. USB-C (Thunderbolt nie był testowany, przy automatycznym ładowaniu modułu system zawiesza się na amen)
  4. Touch Bar (z możliwością włączenia klawiszy Fn, podświetlenia, ESC itp.)
  5. Dźwięk (tylko wbudowane głośniki)
  6. Moduł Wi-Fi (poprzez brcmfmac i tylko poprzez iw)
  7. DisplayPort przez USB-C
  8. Czujniki
  9. Suspend/Resume (częściowo)
  10. itp..

Ten poradnik jest stosowany do macbookpro15,1 i macbookpro15,2. Za podstawę wzięto artykuł z GitHuba w języku angielskim stąd. Nie wszystko z tego artykułu działało, więc musiałem szukać rozwiązania samodzielnie.

Co będzie potrzebne do instalacji

  • Adapter USB-C na USB (przynajmniej trzy porty USB do podłączenia myszki, klawiatury, modemu USB lub telefonu w trybie tethering). To potrzebne tylko na pierwszych etapach instalacji
  • Klawiatura USB
  • Pendrive USB/USB-C o pojemności minimum 4GB

1. Wyłączamy blokadę rozruchu z nośników zewnętrznych

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

2. Przydzielamy wolne miejsce za pomocą Disk Utility

Dla wygody od razu przydzieliłem 30GB na dysk, formatując go w exfat w samym Disk Utility. Podział fizycznego dysku na partycje Disk Utility.

3. Tworzymy obraz iso

Warianty:

  1. Można pójść prostą drogą i pobrać gotowy obraz z jądrem 5.3.5-1 i łatek od aunali1 link do gotowego obrazu
  2. Sformułować obraz samodzielnie za pomocą archlive (potrzebny jest system z dystrybucją archlinux)

    Instalujemy archiso

    pacman -S archiso

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

    Dodajemy repozytorium do pacman.conf:

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

    Ignorujemy oryginalne jądro w pacman.conf:

    IgnorePkg   = linux linux-headers
    

    Dodajemy potrzebne pakiety, na końcu dodajemy jądro linux-mbp i linux-mbp-headers

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

    Modyfikujemy skrypt do pracy w trybie interaktywnym (zamieniamy pacstrap -C na 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!"
    }

    Tworzymy obraz:

    sudo ./build.sh -v

    Naciskamy Y, aby pominąć ignorowane pakiety, a następnie zapisujemy obraz iso na pen drive:

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

4. Pierwsze uruchomienie

Restartujemy z włożonym pendrive'em i klawiaturą. Naciskamy options po pojawieniu się jabłka, wybieramy EFI BOOT.

Następnie należy nacisnąć klawisz «e» i wpisać na końcu linii poleceń module_blacklist=thunderbolt. Jeśli tego nie zrobimy, system może się nie uruchomić i wyświetli się błąd Thunderbolt ICM Error.

Za pomocą fdisk/cfdisk znajdujemy naszą partycję (u mnie to nvme0n1p4), formatujemy ją i instalujemy archlinux. Można skorzystać z oficjalnej instrukcji lub strony trzeciej.

Nie tworzymy partycji rozruchowej, bootloadera zapiszemy w /dev/nvme0n1p1
Po tym, jak całe środowisko w /mnt zostanie w pełni utworzone, przed przejściem do arch-chroot wpisujemy:

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

Dodajemy do /etc/pacman.conf:


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

Instalujemy jądro:


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

Wpisujemy thunderbolt i applesmc w /etc/modprobe.d/blacklist.conf

blacklist thunderbolt
blacklist applesmc

Klawiatura, touchbar, itd.

Instalujemy yay:


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

Instalujemy moduły do pracy touchbara:


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

Dodajemy moduły do autostartu: /etc/modules-load.d/apple.conf

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

Instalujemy moduły jądra do działania klawiatury. W repozytorium anuali1 jest gotowy pakiet, nazywa się apple-bce-dkms-git. Aby go zainstalować, wpisujemy w konsoli:

pacman -S apple-bce-dkms-git

W tym przypadku moduł jądra będzie nazywać się apple-bce. W przypadku samodzielnej kompilacji nazywa się bce. W związku z tym, jeśli chcesz dodać moduł w sekcji MODULES w pliku mkinicpio.conf, pamiętaj, jaki moduł zainstalowałeś.

Ręczna budowa:


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

Dodajemy moduł bce lub apple-bce do autostartu: /etc/modules-load.d/bce.conf

bce

Jeśli chcesz używać domyślnych przycisków Fn, to w pliku /etc/modprobe.d/apple-tb.conf zapisujemy:

options apple-ib-tb fnmode=2

Aktualizujemy jądro i initramfs.


mkinitcpio -p linux-mbp

Zainstalujemy iwd:

sudo pacman -S networkmanager iwd

5. Bootloader

Po zainstalowaniu wszystkich podstawowych pakietów wewnątrz chroot, można przystąpić do instalacji bootloadera.

Nie udało mi się zmusić do działania grub. Z zewnętrznego dysku usb grub się ładuje, ale przy próbie zapisu do nvme przez

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

system wracał do kernel panic, a po restarcie nowa pozycja przez options nie pojawiała się. Nie znalazłem jednoznacznego rozwiązania tego problemu, dlatego postanowiłem spróbować zrealizować boot przy pomocy systemd-boot.

  1. Uruchamiamy
    bootctl --path=/boot install

    i wracamy do kernel panic. Wyłączamy MacBooka, włączamy go ponownie, naciskamy options (nie odłączamy usb-c hub z klawiaturą)

  2. Sprawdzamy, czy pojawił się nowy wpis EFI BOOT oprócz zewnętrznego urządzenia
  3. Wybieramy boot z zewnętrznego dysku usb, jak przy pierwszej instalacji (nie zapominamy o module_blacklist=thunderbolt)
  4. Montujemy nasz dysk i przechodzimy do środowiska przez arch-chroot


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

Jeśli potrzebujesz, aby klawiatura działała przed pełnym załadowaniem systemu (jest to niezbędne w przypadku używania szyfrowania luks/dm-crypt), to zapisujemy w pliku /etc/mkinicpio.conf w sekcji MODULES:

MODULES=(ext4 applespi intel_lpss_pci spi_pxa2xx_platform bce)

Aktualizujemy jądro i initramfs.


mkinicpio -p linux-mbp

Konfigurujemy systemd-boot

Edytujemy plik /boot/loader/loader.conf, usuwamy wszystko, co jest w środku, i wprowadzamy następujące:

default arch
timeout 5
editor 1

Przechodzimy do folderu /boot/loader/entries, tworzymy plik arch.conf i zapisujemy:

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

W przypadku używania luks i lvm, to

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

Restartujemy do MacOS.

6. Konfiguracja Wi-Fi

Jak się okazało, pliki firmware dla adaptera wi-fi MacOS przechowywane są w folderze /usr/share/firmware/wifi , i można je stamtąd pobrać w postaci blobów i wrzucić do modułu jądra brcmfmac. Aby dowiedzieć się, jakie dokładnie pliki używa twój adapter, otwieramy terminal w MacOS i wpisujemy:

ioreg -l | grep C-4364

Otrzymujemy długą listę. Potrzebujemy plików tylko z sekcji 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>"})

W twoim przypadku nazwy plików mogą się różnić. Kopiujemy je z folderu /usr/share/firmware/wifi na USB i zmieniamy nazwę na następującą:

    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>

W tym przypadku ostatni plik tekstowy zawiera nazwy modeli, jeśli twój model nie jest macbookpro15,2, musisz zmienić nazwę tego pliku zgodnie z modelem twojego MacBooka.

Restartujemy do Arch.

Kopiujemy pliki z USB do folderu /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/

Sprawdzamy działanie modułu:


rmmod brcmfmac
modprobe brcmfmac

Upewniamy się, że interfejs sieciowy pojawił się przez ifconfig/ip.
Konfigurujemy Wi-Fi przez iwctl

Uwaga. Przez netctl, nmcli itd. interfejs nie działa, tylko przez iwd.

Zmuszamy NetworkManager do użycia iwd. W tym celu tworzymy plik /etc/NetworkManager/NetworkManager.conf i wpisujemy:

[device]
wifi.backend=iwd

Uruchamiamy usługę NetworkManager


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

7. Dźwięk

Aby dźwięk działał, musisz zainstalować pulseaudio:


sudo pacman -S pulseaudio

Pobieramy trzy pliki:

Przenosimy je:

    /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

Na chwilę obecną 16.10.2019 musisz wybierać między dźwiękiem a funkcją suspend/resume. Czekamy, aż autor modułu bce ukończy funkcjonalność.

Aby skompilować moduł z obsługą suspend/resume, musisz wykonać następujące kroki:


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

Jeśli instalowałeś gotowy moduł apple-bce z repozytorium anuali1, musisz go najpierw usunąć, a dopiero potem kompilować i instalować moduł bce z obsługą trybu suspend.

Ponadto musisz dodać do blacklist moduł applesmc (jeśli nie zrobiłeś tego wcześniej) i upewnić się, że w /boot/loader/entries/arch.conf w linii options na końcu dodany jest parametr pcie_ports=compat.

Na chwilę obecną sterownik touchbara wywala się podczas przejścia w tryb suspend, a sterownik thunderbolt czasami zatrzymuje system na ponad 30 sekund, a po wznowieniu — na kilka minut. Można to naprawić, automatycznie odładowując problematyczne moduły.

Utwórz skrypt /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

Uczyń go wykonalnym:

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

Na tym narazie wszystko. W rezultacie otrzymujemy całkiem sprawny system, z wyjątkiem kilku niuansów z suspend/resume. Żadne awarie ani panic kernel nie zostały zaobserwowane przez kilka dni działania. Mam nadzieję, że wkrótce autor modułu bce ukończy go, a my uzyskamy pełne wsparcie dla suspend/resume i dźwięku.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster