Fai funzionare il MacBook Pro 2018 T2 con ArchLinux (dualboot)

C'è stata molta discussione riguardo al fatto che, a causa del nuovo chip T2, non fosse possibile installare Linux sui nuovi MacBook del 2018 con touch bar. Col passare del tempo, verso la fine del 2019, sono stati sviluppati da terze parti vari driver e patch del kernel per interagire con il chip T2. Il driver principale per i modelli MacBook 2018 e successivi consente il funzionamento di VHCI (touch/keyboard/etc.) e della parte audio.

Progetto mbp2018-bridge-drv è suddiviso in 3 componenti principali:

  • BCE (Buffer Copy Engine) — stabilisce il canale di comunicazione principale con T2. VHCI e Audio richiedono questo componente.
  • VHCI — è un controller host USB virtuale; tastiera, mouse e altri componenti del sistema sono forniti da questo componente (altri driver utilizzano questo controller host per garantire una maggiore funzionalità).
  • Audio — driver per l'interfaccia audio T2, attualmente supporta solo l'uscita audio tramite gli altoparlanti integrati del MacBook.


Il secondo progetto si chiama macbook12-spi-driver, e implementa la possibilità di utilizzare il driver di input per la tastiera, il trackpad SPI, e il Touch Bar per MacBook Pro della fine del 2016 e versioni successive. Parte dei driver per la tastiera/trackpad è ora inclusa nel kernel, a partire dalla versione 5.3.

È stata inoltre implementata la supporto per dispositivi come Wi-Fi, trackpad, ecc., tramite patch del kernel. Attualmente la versione del kernel 5.3.5-1

Cosa funziona al momento

  1. NVMe
  2. Tastiera
  3. USB-C (Thunderbolt non testato, l'autolavaggio del modulo blocca completamente il sistema)
  4. Touch Bar (con possibilità di attivare i tasti Fn, retroilluminazione, ESC ecc.)
  5. Audio (solo altoparlanti integrati)
  6. Modulo Wi-Fi (attraverso brcmfmac e solo tramite iw)
  7. DisplayPort tramite USB-C
  8. Sensori
  9. Sospensione/Ripristino (parzialmente)
  10. ecc..

Questo tutorial è applicabile a macbookpro15,1 e macbookpro15,2. È stata utilizzata come base un'articolo da GitHub in inglese da qui. Non tutto di questo articolo ha funzionato, quindi è stato necessario cercare una soluzione da soli.

Cosa è necessario per l'installazione

  • Un adattatore dock USB-C a USB (almeno tre porte USB per collegare il mouse, la tastiera, un modem USB o un telefono in modalità tethering). Questo è necessario solo nelle prime fasi dell'installazione.
  • Tastiera USB
  • Chiavetta USB/USB-C di almeno 4GB

1. Disattiviamo il divieto di caricamento da dispositivi esterni

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

2. Allocchiamo spazio libero utilizzando Disk Utility

Per comodità, ho subito allocato 30 GB sul disco, formattandolo in exfat direttamente in Disk Utility. Partizionamento del disco fisico in Disk Utility.

3. Creiamo un'immagine iso

Opzioni:

  1. Si può optare per la soluzione più semplice e scaricare un'immagine pronta con il kernel 5.3.5-1 e le patch da aunali1 link all'immagine pronta
  2. Creare l'immagine manualmente tramite archlive (è necessario un sistema con la distribuzione Arch)

    Installiamo archiso

    pacman -S archiso

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

    Aggiungiamo il repository in pacman.conf:

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

    Ignoriamo il kernel originale in pacman.conf:

    IgnorePkg   = linux linux-headers
    

    Aggiungiamo i pacchetti necessari, alla fine aggiungiamo il kernel linux-mbp e linux-mbp-headers

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

    Modifichiamo lo script per lavorare in modalità interattiva (sostituiamo pacstrap -C con 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!"
    }

    Creiamo l'immagine:

    sudo ./build.sh -v

    Premiamo Y per ignorare i pacchetti, quindi scriviamo l'immagine iso su una chiavetta usb:

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

4. Primo avvio

Riavviamo con la chiavetta inserita e la tastiera. Premiamo options quando appare la mela, selezioniamo EFI BOOT.

Successivamente, premere il tasto «e» e aggiungere alla fine della riga di comando module_blacklist=thunderbolt. Se non lo si fa, il sistema potrebbe non avviarsi e apparirà l'errore Thunderbolt ICM Error.

Utilizzando fdisk/cfdisk, troviamo la nostra partizione (per me è nvme0n1p4), formattiamo e installiamo Arch. Possiamo fare riferimento all' istruzione ufficiale o di terze parti.

Non creiamo una partizione di avvio; installeremo il bootloader in /dev/nvme0n1p1
Dopo che l'ambiente è stato completamente configurato in /mnt e prima di passare a arch-chroot, scriviamo:

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

Aggiungiamo a /etc/pacman.conf:


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

Installiamo il kernel:


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

Scriviamo thunderbolt e applesmc in /etc/modprobe.d/blacklist.conf

blacklist thunderbolt
blacklist applesmc

Tastiera, touch bar, ecc.

Installiamo yay:


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

Installiamo i moduli per il funzionamento del touch bar:


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

Aggiungiamo i moduli all'avvio automatico: /etc/modules-load.d/apple.conf

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

Installiamo i moduli del kernel per la tastiera. Nel repository anuali1 c'è un pacchetto pronto, si chiama apple-bce-dkms-git. Per installarlo, scriviamo nel terminale:

pacman -S apple-bce-dkms-git

In questo caso, il modulo del kernel si chiamerà apple-bce. Nel caso di compilazione manuale, si chiama bce. Pertanto, se vuoi registrare il modulo nella sezione MODULES del file mkinicpio.conf, non dimenticare quale modulo hai installato.

Compilazione manuale:


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

Aggiungiamo il modulo bce o apple-bce all'avvio automatico: /etc/modules-load.d/bce.conf

bce

Se vuoi usare per default i tasti Fn, nel file /etc/modprobe.d/apple-tb.conf scrivi:

options apple-ib-tb fnmode=2

Aggiorniamo il kernel e initramfs.


mkinitcpio -p linux-mbp

Installeremo iwd:

sudo pacman -S networkmanager iwd

5. Bootloader

Dopo aver installato tutti i pacchetti principali all'interno di chroot, possiamo procedere con l'installazione del bootloader.

Non sono riuscito a far funzionare grub. Grub si avvia da un'unità USB esterna, ma nel tentativo di registrarlo in nvme tramite

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

il sistema andava in kernel panic, e dopo il riavvio non appariva il nuovo punto attraverso options. Non ho trovato una soluzione chiara per questo problema e quindi ho deciso di provare a implementare il boot tramite systemd-boot.

  1. Avviamo
    bootctl --path=/boot install

    e ci ritroviamo in kernel panic. Spegniamo il MacBook, riaccendiamolo e premere opzioni (non scollegare l'hub usb-c con la tastiera)

  2. Verifichiamo che ci sia una nuova voce EFI BOOT oltre al dispositivo esterno
  3. Selezioniamo l'avvio dal disco usb esterno, come durante la prima installazione (non dimenticate di specificare module_blacklist=thunderbolt)
  4. Montiamo il nostro disco e accediamo all'ambiente tramite arch-chroot


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

Se necessario, affinché la tastiera funzioni fino al completo avvio del sistema (questo è necessario in caso di utilizzo della crittografia luks/dm-crypt), aggiungiamo nel file /etc/mkinicpio.conf nella sezione MODULES:

MODULES=(ext4 applespi intel_lpss_pci spi_pxa2xx_platform bce)

Aggiorniamo il kernel e initramfs.


mkinicpio -p linux-mbp

Configuriamo systemd-boot

Modifichiamo il file /boot/loader/loader.conf, cancelliamo tutto il contenuto e inseriamo quanto segue:

default arch
timeout 5
editor 1

Andiamo nella cartella /boot/loader/entries, creiamo il file arch.conf e scriviamo:

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

Nel caso in cui abbiate utilizzato luks e lvm,

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

Riavviamo in MacOS.

6. Configurazione Wi-Fi

Come si è scoperto, i file del firmware per l'adattatore wi-fi sono conservati nella cartella /usr/share/firmware/wifi , e possiamo prenderli da lì sotto forma di blob e fornire al modulo del kernel brcmfmac. Per scoprire quali file utilizza il tuo adattatore, apriamo il terminale in MacOS e scriviamo:

ioreg -l | grep C-4364

Otteniamo un lungo elenco. Ci servono solo i file dalla sezione 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>"})

Nel tuo caso i nomi dei file potrebbero differire. Copiamoli dalla cartella /usr/share/firmware/wifi su una chiavetta USB e rinominiamoli nel seguente modo:

    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>

In questo caso, l'ultimo file di testo contiene i nomi del modello; se il tuo modello non è macbookpro15,2, dovrai rinominare questo file in base al tuo modello di MacBook.

Riavviamo in Arch.

Copia i file dalla chiavetta USB nella cartella /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/

Verifichiamo il funzionamento del modulo:


rmmod brcmfmac
modprobe brcmfmac

Assicuriamoci che l'interfaccia di rete sia apparsa tramite ifconfig/ip.
Configuriamo il wifi tramite iwctl

Attenzione. Tramite netctl, nmcli, ecc. l'interfaccia non funziona, solo tramite iwd.

Imponiamo a NetworkManager di usare iwd. A tal fine, creiamo il file /etc/NetworkManager/NetworkManager.conf e scriviamo:

[device]
wifi.backend=iwd

Avviamo il servizio NetworkManager


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

7. Suono

Per far funzionare l'audio, è necessario installare pulseaudio:


sudo pacman -S pulseaudio

Scarichiamo tre file:

Spostiamoli:

    /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. Sospensione/Ripristino

Attualmente 16.10.2019 si deve scegliere tra audio e sospensione/ripristino. Aspettiamo che l'autore di questo modulo completi la funzionalità.

Per compilare il modulo con il supporto per sospensione/ripristino, è necessario eseguire quanto segue:


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

Se hai installato il modulo apple-bce dalla repository anuali1, devi prima rimuoverlo e solo dopo compilare e installare il modulo bce con supporto per la modalità di sospensione.

Inoltre, devi aggiungere il modulo applesmc alla blacklist (se non lo hai già fatto) e assicurarti che nel file /boot/loader/entries/arch.conf alla riga options sia stato aggiunto il parametro pcie_ports=compat.

Attualmente il driver della touch bar si blocca quando si entra in modalità sospensione, e il driver thunderbolt a volte blocca il sistema per più di 30 secondi, e al ripristino — per alcuni minuti. Questo può essere risolto con il caricamento automatico dei moduli problematici.

Crea uno 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

Rendilo eseguibile:

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

Questo è tutto per ora. In definitiva, si tratta di un sistema piuttosto funzionante, tranne per alcuni dettagli riguardanti la sospensione/ripristino. Non si osservano crash né kernel panic da diversi giorni di uptime. Spero che l'autore del modulo bce lo migliori presto, così otterremo un supporto completo per la sospensione/ripristino e l'audio.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster