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 î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 , ș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
Ce funcționează în prezent
- NVMe
- Tastatură
- USB-C (Thunderbolt n-a fost testat, la bootarea automată a modulului, sistemul se blochează complet)
- Touch Bar (cu opțiunea de activare a tastelor Fn, iluminare, ESC etc.)
- Sunet (doar difuzoarele încorporate)
- Modul Wi-Fi (prin brcmfmac și doar prin iw)
- DisplayPort prin USB-C
- Senzori
- Suspendare/întoarcere (parțial)
- etc.
Acest tutorial este aplicabil pentru macbookpro15,1 și macbookpro15,2. La bază a fost folosit un articol de pe GitHub în engleză . 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.
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. .
3. Creăm imaginea ISO
Opțiuni:
- 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
- Să formăm imaginea manual prin archlive (este necesar un sistem cu distribuția Arch)
Instalăm
pacman -S archisocp -r /usr/share/archiso/configs/releng/ archlive cd archliveAdăugăm repository în pacman.conf:
[mbp] Server = https://packages.aunali1.com/archlinux/$repo/$archIgnorăm kernelul original în pacman.conf:
IgnorePkg = linux linux-headersAdăugăm pachetele necesare, la final adăugăm kernelul linux-mbp și linux-mbp-headers
... wvdial xl2tpd linux-mbp linux-mbp-headersModifică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 -vApă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 sau .
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 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
bceDacă doriți să folosiți butoanele Fn ca implicit, în fișierul /etc/modprobe.d/apple-tb.conf scriem:
options apple-ib-tb fnmode=2Actualizăm kernel-ul și initramfs.
mkinitcpio -p linux-mbp
Instalăm iwd:
sudo pacman -S networkmanager iwd5. 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.
- 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ă)
- Verificăm că a apărut o nouă înregistrare EFI BOOT pe lângă dispozitivul extern
- Alegem să bootăm de pe USB extern, ca la prima instalare (nu uitați să specificați module_blacklist=thunderbolt)
- 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-4364Obț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 -> 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>
Î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
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.rules8. 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
