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 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ę , 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
Co działa w tej chwili
- NVMe
- Klawiatura
- USB-C (Thunderbolt nie był testowany, przy automatycznym ładowaniu modułu system zawiesza się na amen)
- Touch Bar (z możliwością włączenia klawiszy Fn, podświetlenia, ESC itp.)
- Dźwięk (tylko wbudowane głośniki)
- Moduł Wi-Fi (poprzez brcmfmac i tylko poprzez iw)
- DisplayPort przez USB-C
- Czujniki
- Suspend/Resume (częściowo)
- itp..
Ten poradnik jest stosowany do macbookpro15,1 i macbookpro15,2. Za podstawę wzięto artykuł z GitHuba w języku angielskim . 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
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. .
3. Tworzymy obraz iso
Warianty:
- Można pójść prostą drogą i pobrać gotowy obraz z jądrem 5.3.5-1 i łatek od
- Sformułować obraz samodzielnie za pomocą archlive (potrzebny jest system z dystrybucją archlinux)
Instalujemy
pacman -S archisocp -r /usr/share/archiso/configs/releng/ archlive cd archliveDodajemy repozytorium do pacman.conf:
[mbp] Server = https://packages.aunali1.com/archlinux/$repo/$archIgnorujemy oryginalne jądro w pacman.conf:
IgnorePkg = linux linux-headersDodajemy potrzebne pakiety, na końcu dodajemy jądro linux-mbp i linux-mbp-headers
... wvdial xl2tpd linux-mbp linux-mbp-headersModyfikujemy 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 -vNaciskamy 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 lub .
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 jest gotowy pakiet, nazywa się apple-bce-dkms-git. Aby go zainstalować, wpisujemy w konsoli:
pacman -S apple-bce-dkms-gitW 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
bceJeśli chcesz używać domyślnych przycisków Fn, to w pliku /etc/modprobe.d/apple-tb.conf zapisujemy:
options apple-ib-tb fnmode=2Aktualizujemy jądro i initramfs.
mkinitcpio -p linux-mbp
Zainstalujemy iwd:
sudo pacman -S networkmanager iwd5. 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.
- Uruchamiamy
bootctl --path=/boot installi wracamy do kernel panic. Wyłączamy MacBooka, włączamy go ponownie, naciskamy options (nie odłączamy usb-c hub z klawiaturą)
- Sprawdzamy, czy pojawił się nowy wpis EFI BOOT oprócz zewnętrznego urządzenia
- Wybieramy boot z zewnętrznego dysku usb, jak przy pierwszej instalacji (nie zapominamy o module_blacklist=thunderbolt)
- 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-4364Otrzymujemy 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 -> 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>
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
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.rules8. 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
