Haciendo funcionar el MacBook Pro 2018 T2 con ArchLinux (arranque dual)

Ha habido bastante revuelo respecto a que, debido al nuevo chip T2, no es posible instalar Linux en los nuevos MacBook 2018 con Touch Bar. Con el tiempo, a finales de 2019, desarrolladores independientes implementaron una serie de controladores y parches del núcleo para interactuar con el chip T2. El controlador principal para los modelos de MacBook 2018 y posteriores implementa el funcionamiento de VHCI (operación del touch/teclado/etc.), así como la funcionalidad de audio.

Proyecto mbp2018-bridge-drv se divide en 3 componentes principales:

  • BCE (Buffer Copy Engine) - establece el canal de comunicación principal con T2. VHCI y Audio requieren este componente.
  • VHCI es un controlador de host USB virtual; el teclado, el ratón y otros componentes del sistema son proporcionados por este componente (otros controladores utilizan este controlador de host para ofrecer más funcionalidad).
  • Audio - controlador para la interfaz de audio T2, actualmente solo admite la salida de sonido a través de los altavoces integrados del MacBook.


El segundo proyecto se llama macbook12-spi-driver, y permite el funcionamiento del controlador de entrada para el teclado, el trackpad SPI y el Touch Bar para el MacBook Pro de finales de 2016 y versiones posteriores. Parte de los controladores para el teclado/trackpad ahora están incluidos en el núcleo, a partir de la versión 5.3.

También se ha implementado soporte para dispositivos como Wi-Fi, trackpad, etc., mediante parches del núcleo. Actualmente, la versión del núcleo 5.3.5-1

Lo que funciona actualmente

  1. NVMe
  2. Teclado
  3. USB-C (Thunderbolt no ha sido probado, al cargar automáticamente el módulo cuelga el sistema por completo)
  4. Touch Bar (con la posibilidad de habilitar las teclas Fn, retroiluminación, ESC, etc.)
  5. Sonido (solo altavoces integrados)
  6. Módulo Wi-Fi (a través de brcmfmac y solo mediante iw)
  7. DisplayPort a través de USB-C
  8. Sensores
  9. Suspend/Resume (parcialmente)
  10. etc..

Este tutorial es aplicable para macbookpro15,1 y macbookpro15,2. Se tomó como base un artículo de GitHub en inglés desde aquí. No todo en este artículo funcionó, por lo que tuve que buscar soluciones por mi cuenta.

Lo que se necesita para la instalación

  • Adaptador de USB-C a USB (al menos tres puertos USB para conectar el ratón, el teclado, un módem USB o un teléfono en modo tethering). Esto es necesario solo en las primeras etapas de la instalación.
  • Teclado USB
  • Pen drive USB/USB-C de al menos 4GB

1. Deshabilitar la restricción de arranque desde dispositivos externos.

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

2. Asignar espacio libre utilizando la Utilidad de Discos.

Para mayor comodidad, asigné inmediatamente 30GB en el disco, formateándolo en exfat en la propia Utilidad de Discos. Partición del disco físico en secciones de Disk Utility.

3. Creamos la imagen iso

Opciones:

  1. Podemos optar por el camino fácil y descargar una imagen lista con el núcleo 5.3.5-1 y los parches de aunali1 enlace a la imagen lista
  2. Crear la imagen manualmente a través de archlive (se necesita un sistema con la distribución de Arch)

    Instalamos archiso

    pacman -S archiso

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

    Agregamos el repositorio en pacman.conf:

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

    Ignoramos el núcleo original en pacman.conf:

    IgnorePkg   = linux linux-headers
    

    Agregamos los paquetes necesarios, al final agregamos el núcleo linux-mbp y linux-mbp-headers

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

    Modificamos el script para trabajar en modo interactivo (reemplazamos 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!"
    }

    Creamos la imagen:

    sudo ./build.sh -v

    Presionamos Y para omitir los paquetes ignorados, luego escribimos la imagen iso en un USB:

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

4. Primer arranque

Reiniciamos con el USB insertado y el teclado. Presionamos opciones al aparecer la manzana, seleccionamos EFI BOOT.

Luego es necesario presionar la tecla «e» y escribir al final de la línea de comandos module_blacklist=thunderbolt. Si no se hace esto, el sistema puede no arrancar y aparecerá el error Thunderbolt ICM Error.

Con fdisk/cfdisk encontramos nuestra partición (en mi caso es nvme0n1p4), formateamos y realizamos la instalación de Arch. Podemos usar la instrucción oficial o de terceros.

No creamos la partición de arranque, el gestor de arranque lo escribiremos en /dev/nvme0n1p1
Después de que el entorno en /mnt esté completamente formado y antes de pasar a arch-chroot, escribimos:

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

Agregamos en /etc/pacman.conf:


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

Instalamos el núcleo:


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

Escribimos thunderbolt y applesmc en /etc/modprobe.d/blacklist.conf

blacklist thunderbolt
blacklist applesmc

Teclado, touch bar, etc.

Instalamos yay:


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

Instalamos los módulos para el funcionamiento del touch bar:


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

Agregamos los módulos al inicio automático: /etc/modules-load.d/apple.conf

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

Instalamos módulos del núcleo para el funcionamiento del teclado. En el repositorio anuali1 hay un paquete listo llamado apple-bce-dkms-git. Para instalarlo, escribimos en la consola:

pacman -S apple-bce-dkms-git

En este caso, el módulo del núcleo se llamará apple-bce. En caso de compilación manual se llamará bce. Por lo tanto, si desea incluir un módulo en la sección MODULES del archivo mkinicpio.conf, no olvide qué módulo ha instalado.

Compilación 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

Agregamos el módulo bce o apple-bce al inicio automático: /etc/modules-load.d/bce.conf

bce

Si desea usar las teclas Fn por defecto, escriba en el archivo /etc/modprobe.d/apple-tb.conf:

options apple-ib-tb fnmode=2

Actualizamos el kernel y el initramfs.


mkinitcpio -p linux-mbp

Instalemos iwd:

sudo pacman -S networkmanager iwd

5. Cargador de arranque

Después de que todos los paquetes principales estén instalados dentro de chroot, se puede proceder con la instalación del cargador de arranque.

No logré hacer funcionar grub. Desde una unidad USB externa, grub se inicia, pero al intentar instalarlo en nvme a través de

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

el sistema caía en un kernel panic, y tras reiniciar, no aparecía la nueva entrada a través de options. No encontré una solución clara a este problema y decidí probar arrancar usando systemd-boot.

  1. Iniciamos
    bootctl --path=/boot install

    y caemos en kernel panic. Apagamos el MacBook, lo encendemos de nuevo y presionamos options (no desconectamos el hub usb-c con el teclado)

  2. Verificamos que aparece una nueva entrada EFI BOOT además del dispositivo externo
  3. Seleccionamos el arranque desde la unidad USB externa, como en la primera instalación (no olvidemos agregar module_blacklist=thunderbolt)
  4. Montamos nuestro disco y accedemos al entorno a través de arch-chroot


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

Si es necesario que el teclado funcione antes de que el sistema arranque completamente (esto es necesario en caso de usar cifrado luks/dm-crypt), lo que debemos agregar al archivo /etc/mkinicpio.conf en la sección MODULES:

MODULES=(ext4 applespi intel_lpss_pci spi_pxa2xx_platform bce)

Actualizamos el kernel y el initramfs.


mkinicpio -p linux-mbp

Configurando systemd-boot

Editamos el archivo /boot/loader/loader.conf, eliminamos todo lo que hay dentro y ponemos lo siguiente:

default arch
timeout 5
editor 1

Nos dirigimos a la carpeta /boot/loader/entries, creamos el archivo arch.conf y escribimos:

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

En caso de haber utilizado luks y lvm, entonces

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

Reiniciamos en MacOS.

6. Configuración de Wi-Fi

Como resultó, los archivos de firmware para el adaptador wi-fi de MacOS se almacenan en la carpeta /usr/share/firmware/wifi , y se pueden obtener de ahí en forma de blobs y alimentar al módulo del kernel brcmfmac. Para averiguar qué archivos utiliza su adaptador, abrimos la terminal en MacOS y escribimos:

ioreg -l | grep C-4364

Obtenemos una larga lista. Solo necesitamos los archivos de la sección 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>"})

En su caso, los nombres de los archivos pueden variar. Los copiamos de la carpeta /usr/share/firmware/wifi a la memoria USB y los renombramos de la siguiente manera:

    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>

En este caso, el último archivo de texto contiene los nombres de los modelos. Si su modelo no es macbookpro15,2, entonces debe renombrar este archivo de acuerdo con el modelo de su MacBook.

Reiniciamos en Arch.

Copiamos los archivos desde la memoria USB a la carpeta /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/

Comprobamos el funcionamiento del módulo:


rmmod brcmfmac
modprobe brcmfmac

Asegúrate de que la interfaz de red aparece a través de ifconfig/ip.
Configuramos WiFi a través de iwctl

Atención. A través de netctl, nmcli, etc. la interfaz no funciona, solo a través de iwd.

Hacemos que NetworkManager use iwd. Para ello, creamos el archivo /etc/NetworkManager/NetworkManager.conf y escribimos:

[device]
wifi.backend=iwd

Iniciamos el servicio de NetworkManager


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

7. Sonido

Para que el sonido funcione, es necesario instalar pulseaudio:


sudo pacman -S pulseaudio

Descargamos tres archivos:

Los movemos:

    /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/Reanudar

En este momento 16.10.2019 hay que elegir entre sonido o suspender/reanudar. Esperamos a que el autor del módulo bce complete la funcionalidad.

Para compilar el módulo con soporte para suspender/reanudar, es necesario realizar lo siguiente:


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

Si instalaste el módulo apple-bce listo del repositorio anuali1, primero debes eliminarlo y solo después compilar e instalar el módulo bce con soporte para el modo de suspensión.

Además, es necesario añadir el módulo applesmc a la lista negra (si no lo hiciste antes) y asegurarte de que en /boot/loader/entries/arch.conf en la línea de opciones al final se haya añadido el parámetro pcie_ports=compat.

Actualmente, el controlador del Touch Bar falla al entrar en modo de suspensión, y el controlador de Thunderbolt a veces bloquea el sistema durante más de 30 segundos, y al reanudar — durante varios minutos. Esto se puede solucionar descargando automáticamente los módulos problemáticos.

Crea 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

Hazlo ejecutable:

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

Por ahora, eso es todo. Al final tenemos un sistema bastante funcional, a excepción de algunos matices con suspender/reanudar. No se observan fallos ni panic del kernel durante varios días de tiempo activo. Espero que en un futuro cercano el autor del módulo bce lo complete y obtengamos soporte completo para suspender/reanudar y sonido.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster