Fazendo o MacBook Pro 2018 T2 funcionar com ArchLinux (dualboot)

Houve bastante alarde sobre o fato de que, devido ao novo chip T2, não era possível instalar Linux nos novos MacBook de 2018 com touch bar. O tempo passou e, no final de 2019, desenvolvedores de terceiros implementaram uma série de drivers e patches no kernel para interagir com o chip T2. O driver principal para MacBook modelos 2018 e mais recentes implementa a funcionalidade VHCI (touch/keyboards/etc.), bem como o funcionamento do áudio.

Projeto mbp2018-bridge-drv dividido em 3 componentes principais:

  • BCE (Buffer Copy Engine) — estabelece o canal principal de comunicação com o T2. VHCI e Audio requerem este componente.
  • VHCI — é um controlador de host USB virtual; o teclado, o mouse e outros componentes do sistema são fornecidos por este componente (outros drivers usam este controlador de host para oferecer maior funcionalidade).
  • Áudio — driver para o interface de áudio T2, atualmente suportado apenas para saída de som através dos alto-falantes integrados do MacBook.


O segundo projeto é chamado macbook12-spi-driver, e ele implementa a possibilidade de operação do driver de entrada para o teclado, trackpad SPI e touch bar para MacBook Pro de final de 2016 e versões posteriores. Parte dos drivers para teclado/trackpad agora está incluída no kernel, a partir da versão 5.3.

Além disso, foi implementado suporte para dispositivos como wi-fi, trackpad, etc., através de patches no kernel. Neste momento, a versão do kernel 5.3.5-1

O que está funcionando atualmente

  1. NVMe
  2. Teclado
  3. USB-C (Thunderbolt não foi testado, ao carregar o módulo automaticamente, o sistema trava completamente)
  4. Touch bar (com a possibilidade de ativar teclas Fn, retroiluminação, ESC, etc.)
  5. Áudio (apenas alto-falantes integrados)
  6. Módulo Wi-Fi (através de brcmfmac e apenas através de iw)
  7. DisplayPort via USB-C
  8. Sensores
  9. Suspender/Retomar (parcialmente)
  10. etc..

Este tutorial é aplicável para macbookpro15,1 e macbookpro15,2. Foi usada como base um artigo do GitHub em inglês daqui. Nem tudo deste artigo funcionou, então foi necessário buscar solução por conta própria.

O que será necessário para a instalação

  • Adaptador de dock USB-C para USB (pelo menos três entradas USB para conectar um mouse, teclado, modem USB ou telefone em modo tethering). Isso é necessário apenas nas primeiras etapas da instalação.
  • Teclado USB
  • Pen drive USB/USB-C com pelo menos 4GB

1. Desabilitar a restrição de inicialização a partir de dispositivos externos

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

2. Alocar espaço livre usando o Disk Utility

Para facilitar, eu aloquei imediatamente 30GB no disco, formatando-o em exfat no próprio Disk Utility. Particionando o disco físico com o Disk Utility.

3. Criando a imagem ISO

Opções:

  1. Você pode optar pelo caminho mais simples e baixar uma imagem pronta com o kernel 5.3.5-1 e os patches de aunali1 link para a imagem pronta
  2. Criar a imagem manualmente através do archlive (é necessário ter um sistema com a distribuição Arch)

    Instalando archiso

    pacman -S archiso

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

    Adicionando o repositório no pacman.conf:

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

    Ignorando o kernel original no pacman.conf:

    IgnorePkg   = linux linux-headers
    

    Adicionando os pacotes necessários; no final, adicionamos o kernel linux-mbp e linux-mbp-headers

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

    Alterando o script para funcionar no modo interativo (substituindo pacstrap -C por 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!"
    }

    Criando a imagem:

    sudo ./build.sh -v

    Pressione Y para pular os pacotes ignorados, em seguida, grave a imagem ISO em um pen drive USB:

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

4. Primeiro boot

Reinicie com o pen drive e teclado inseridos. Pressione options ao aparecer a maçã, selecione EFI BOOT.

Em seguida, é necessário pressionar a tecla "e" e adicionar ao final da linha de comando module_blacklist=thunderbolt. Se não fizer isso, o sistema pode não iniciar e um erro Thunderbolt ICM Error aparecerá.

Com fdisk/cfdisk, encontramos nossa partição (para mim é nvme0n1p4), formatamos e instalamos o Arch. Você pode usar a documentação oficial ou de terceiros.

Não criaremos a partição de inicialização, o gerenciador de inicialização será instalado em /dev/nvme0n1p1
Depois que o ambiente estiver completamente configurado em /mnt e antes de entrar no arch-chroot, escreva:

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

Adicionar em /etc/pacman.conf:


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

Instalando o kernel:


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

Registrar thunderbolt e applesmc em /etc/modprobe.d/blacklist.conf

blacklist thunderbolt
blacklist applesmc

Teclado, touch bar, etc.

Instalando yay:


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

Instalando módulos para o funcionamento do touch bar:


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

Adicionando módulos na inicialização automática: /etc/modules-load.d/apple.conf

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

Instalamos os módulos do kernel para o funcionamento do teclado. No repositório anuali1 há um pacote pronto chamado apple-bce-dkms-git. Para instalá-lo, escreva no terminal:

pacman -S apple-bce-dkms-git

Neste caso, o módulo do kernel será chamado apple-bce. No caso de montagem própria, ele é chamado bce. Portanto, se você quiser registrar o módulo na seção MODULES no arquivo mkinicpio.conf, não se esqueça de qual módulo você instalou.

Compilação 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

Adicionamos o módulo bce ou apple-bce à inicialização automática: /etc/modules-load.d/bce.conf

bce

Se você quiser usar as teclas Fn por padrão, adicione ao arquivo /etc/modprobe.d/apple-tb.conf:

options apple-ib-tb fnmode=2

Atualizando o kernel e o initramfs.


mkinitcpio -p linux-mbp

Vamos instalar o iwd:

sudo pacman -S networkmanager iwd

5. Carregador de Inicialização

Depois que todos os pacotes principais estiverem instalados dentro do chroot, podemos prosseguir com a instalação do carregador de inicialização.

Eu não consegui fazer o grub funcionar. O grub carrega de um pen drive USB externo, mas ao tentar registrá-lo no nvme através de

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

o sistema caía em panic do kernel e, após reiniciar, não aparecia a nova entrada através de options. Não encontrei uma solução clara para esse problema e, por isso, decidi tentar implementar a inicialização com o systemd-boot.

  1. Iniciamos
    bootctl --path=/boot install

    e caímos em panic do kernel. Desligamos o MacBook, ligamos novamente, pressionamos options (não desconectamos o hub USB-C com o teclado)

  2. Verificamos se há uma nova entrada EFI BOOT além do dispositivo externo.
  3. Selecionamos a inicialização a partir do pen drive USB externo, como na primeira instalação (não se esqueça de adicionar module_blacklist=thunderbolt)
  4. Montamos nosso disco e acessamos o ambiente através do arch-chroot.


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

Se for necessário que o teclado funcione até o carregamento completo do sistema (o que é necessário ao usar criptografia luks/dm-crypt), adicionamos ao arquivo /etc/mkinicpio.conf na seção MODULES:

MODULES=(ext4 applespi intel_lpss_pci spi_pxa2xx_platform bce)

Atualizando o kernel e o initramfs.


mkinicpio -p linux-mbp

Configurando o systemd-boot

Editamos o arquivo /boot/loader/loader.conf, removemos tudo que está dentro e inserimos o seguinte:

default arch
timeout 5
editor 1

Vamos para a pasta /boot/loader/entries, criamos o arquivo arch.conf e escrevemos:

título arch
linux /vmlinuz-linux-mbp
initrd /initramfs-linux-mbp.img
opções root=/dev/<b>nvme0n1p4</b> rw pcie_ports=compat

Caso tenha usado luks e lvm,

opções cryptdevice=\/dev\/<b>nvme0n1p4</b>:luks root=\/dev\/mapper\/vz0-root rw pcie_ports=compat

Reiniciamos no MacOS.

6. Configuração do Wi-Fi

Como descobrimos, os arquivos de firmware para o adaptador Wi-Fi do MacOS são armazenados na pasta /usr/share/firmware/wifi , e podemos pegá-los de lá como blobs e fornecê-los ao módulo do kernel brcmfmac. Para descobrir quais arquivos seu adaptador usa, abrimos o terminal no MacOS e digitamos:

ioreg -l | grep C-4364

Recebemos uma longa lista. Precisamos apenas dos arquivos da seção 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>"})

No seu caso, os nomes dos arquivos podem ser diferentes. Copie-os da pasta /usr/share/firmware/wifi para o pen drive e renomeie no seguinte formato:

    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>

Neste caso, o último arquivo de texto contém os nomes do modelo, se seu modelo não for macbookpro15,2, será necessário renomear esse arquivo de acordo com seu modelo de MacBook.

Reiniciamos no Arch.

Copie os arquivos do pen drive para a pasta /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/

Verifique a funcionalidade do módulo:


rmmod brcmfmac
modprobe brcmfmac

Certifique-se de que a interface de rede apareceu através do ifconfig/ip.
Configure o wifi através de iwctl

Atenção. Através do netctl, nmcli, etc. a interface não funciona, apenas através do iwd.

Forçamos o NetworkManager a usar o iwd. Para isso, criamos o arquivo /etc/NetworkManager/NetworkManager.conf e escrevemos:

[device]
wifi.backend=iwd

Inicie o serviço NetworkManager


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

7. Áudio

Para que o áudio funcione, é necessário instalar o pulseaudio:


sudo pacman -S pulseaudio

Baixe três arquivos:

Mova-os:

    /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. Suspender/Retomar

No momento 16.10.2019 temos que escolher entre áudio ou suspender/retomar. Vamos esperar até que o autor do módulo bce finalize a funcionalidade.

Para compilar o módulo com suporte a suspend/resume, será necessário executar o seguinte:


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 você instalou o módulo apple-bce pronto do repositório anuali1, será necessário removê-lo primeiro e só então compilar e instalar o módulo bce com suporte ao modo suspend.

Além disso, é necessário adicionar o módulo applesmc à blacklist (se você não fez isso antes) e garantir que em /boot/loader/entries/arch.conf na linha de opções, o parâmetro foi adicionado no final pcie_ports=compat.

Atualmente, o driver do Touch Bar falha ao entrar no modo suspend, e o driver Thunderbolt às vezes trava o sistema por mais de 30 segundos, e ao retomar — por vários minutos. Isso pode ser corrigido através da descarregamento automático dos módulos problemáticos.

Crie um 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

Torne-o executável:

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

Por enquanto é tudo. O sistema se torna totalmente funcional, exceto por alguns detalhes com suspend/resume. Não foram observadas quedas ou kernel panic ao longo de vários dias de up-time. Espero que em breve o autor do módulo bce finalize, e tenhamos suporte completo para suspend/resume e áudio.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster