Накарахме MacBook Pro 2018 T2 да работи с ArchLinux (dualboot)

Беше създадена значителна шумотевица около факта, че поради новия чип T2 не може да се инсталира Linux на новите MacBook от 2018 г. с Touch Bar. Времето минаваше и в края на 2019 г. независими разработчици реализираха редица драйвери и пачове за ядрото за взаимодействие с чипа T2. Основният драйвер за моделите MacBook от 2018 г. и нови реализира работата на VHCI (работа на тъчпада/клавиатурата и т.н.), както и функционирането на звука.

Проект mbp2018-bridge-drv разделен на 3 основни компонента:

  • BCE (Buffer Copy Engine) — установява основния канал за свързване с T2. VHCI и звука изискват този компонент.
  • VHCI — това е виртуален хост-контролер USB; клавиатурата, мишката и другите компоненти на системата се предоставят от този компонент (други драйвери използват този хост-контролер за осигуряване на по-голяма функционалност.
  • Audio — драйвер за аудиоинтерфейса T2, в момента поддържа само изход на звук чрез вградените високоговорители на MacBook.


Вторият проект се нарича macbook12-spi-driver, и той реализира възможността за работа на драйвера за вход за клавиатурата, тъчпада SPI и Touch Bar за MacBook Pro от края на 2016 г. и по-късни версии. Част от драйверите за клавиатурата/тъчпада сега са включени в ядрото, започвайки от версия 5.3.

Също така беше реализирана поддръжка за устройства като Wi-Fi, тъчпад и др. с помощта на пачове за ядрото. В момента версията на ядрото 5.3.5-1

Какво работи в момента

  1. NVMe
  2. Клавиатура
  3. USB-C (Thunderbolt не е проверяван, при автоматично зареждане на модула системата се блокира напълно)
  4. Touch Bar (с възможност за активиране на клавишите Fn, подсветка, ESC и т.н.)
  5. Звук (само вградените високоговорители)
  6. Модул Wi-Fi (чрез brcmfmac и само чрез iw)
  7. DisplayPort през USB-C
  8. Сензори
  9. Suspend/Resume (отчасти)
  10. и др..

Този туториал е приложим за macbookpro15,1 и macbookpro15,2. Основата беше статия от GitHub на английски оттук. Не всичко от тази статия проработи, така че се наложи да търся решение самостоятелно.

Какво ще ви е необходимо за инсталацията

  • USB-C адаптер на USB (поне три USB входа за свързване на мишка, клавиатура, USB модем или телефон в режим на свързване). Това е необходимо само в началните етапи на инсталацията.
  • USB-клавиатура
  • USB/USB-C флашка с минимум 4Гб

1. Изключете забраната за стартиране от външни носители

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

2. Освободете пространство с помощта на Disk Utility

За удобство, аз веднага освободих 30Гб на диска, форматирайки го в exfat в самия Disk Utility. Разделяне на физическия диск на сектори с Disk Utility.

3. Създаваме iso образ

Варианти:

  1. Може да се тръгне по лесния път и да се свали готов образ с ядро 5.3.5-1 и пачтите от aunali1 връзка към готовия образ
  2. Създаване на образ самостоятелно чрез archlive (нужна е система с дистрибуция на арча)

    Инсталираме archiso

    pacman -S archiso

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

    Добавяме хранилището в pacman.conf:

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

    Игнориране на оригиналното ядро в pacman.conf:

    IgnorePkg   = linux linux-headers
    

    Добавяме необходимите пакети, накрая добавяме ядро linux-mbp и linux-mbp-headers

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

    Променяме скрипта за работа в интерактивен режим (заменяме pacstrap -C с 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!"
    }

    Създаваме образ:

    sudo ./build.sh -v

    Натискаме Y, за да пропуснем игнорираните пакети, после записваме iso образа на USB флашка:

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

4. Първо зареждане

Рестартираме с поставена флашка и клавиатура. Натискаме options, когато се появи ябълкото, избираме EFI BOOT.

След това е необходимо да натиснем клавиша «e» и да напишем в края на командния ред module_blacklist=thunderbolt. Ако не го направим, системата може да не се зареди и да излезе грешка Thunderbolt ICM Error.

С помощта на fdisk/cfdisk намираме нашия дял (при мен е nvme0n1p4), форматираме и извършваме инсталация на арч. Може да се използва официалната инструкция или външната.

Не създаваме зареден дял, а ще пишем зареждач на /dev/nvme0n1p1
След като напълно е създадена средата в /mnt и преди да преминем в arch-chroot, пишем:

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

Добавяме в /etc/pacman.conf:


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

Инсталираме ядрото:


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

Записваме thunderbolt и applesmc в /etc/modprobe.d/blacklist.conf

blacklist thunderbolt
blacklist applesmc

Клавиатура, тачбар и др.

Инсталираме yay:


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

Инсталираме модулите за работа на тачбара:


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

Добавяме модулите в автоматичното зареждане: /etc/modules-load.d/apple.conf

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

Инсталираме модулите на ядрото за работа на клавиатурата. В хранилището aunali1 има готов пакет, наречен apple-bce-dkms-git. За да го инсталираме, пишем в конзолата:

pacman -S apple-bce-dkms-git

В този случай модулът на ядрото ще бъде наречен apple-bce. В случай на самостоятелна компилация, той се нарича bce. Съответно, ако искате да запишете модула в раздел MODULES на файла mkinicpio.conf, не забравяйте кой модул сте инсталирали.

Сборка на ръка:


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

Добавяме модула bce или apple-bce в автозагрузката: /etc/modules-load.d/bce.conf

bce

Ако искате да използвате по подразбиране бутоните Fn, в файла /etc/modprobe.d/apple-tb.conf пишем:

options apple-ib-tb fnmode=2

Обновяваме ядрото и initramfs.


mkinitcpio -p linux-mbp

Инсталираме iwd:

sudo pacman -S networkmanager iwd

5. Зареждач

След като всички основни пакети вътре в chroot са инсталирани, можем да преминем към инсталирането на зареждача.

Не успях да накарам grub да работи. Grub се зарежда от външен usb диск, но при опит за записването му в nvme чрез

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

системата започва да показва kernel panic и след перезареждане новата точка в options не се появява. Не намерих ясни решения на този проблем и затова реших да опитам да реализирам зареждането чрез systemd-boot.

  1. Започваме
    bootctl --path=/boot install

    и отново получаваме kernel panic. Изключваме MacBook, включваме отново, натискаме options (usb-c хъбът с клавиатурата не се изключва)

  2. Проверяваме, че е появила нова записка EFI BOOT освен външното устроиство.
  3. Избираме зареждане от външния usb диск, както при първата инсталация (не забравяйте да запишете module_blacklist=thunderbolt)
  4. Монтираме нашия диск и преминаваме в средата чрез arch-chroot.


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

Ако е необходимо, клавиатурата да работи преди пълното зареждане на системата (това е необходимо в случай на използване на шифроване luks/dm-crypt), то запишете в файла /etc/mkinicpio.conf в раздел MODULES:

MODULES=(ext4 applespi intel_lpss_pci spi_pxa2xx_platform bce)

Обновяваме ядрото и initramfs.


mkinicpio -p linux-mbp

Настройваме systemd-boot

Редактираме файла /boot/loader/loader.conf, изтриваме всичко, което има вътре и внасяме следното:

default arch
timeout 5
editor 1

Преминаваме в папката /boot/loader/entries, създаваме файла arch.conf и пишем:

заглавие арх
linux /vmlinuz-linux-mbp
initrd /initramfs-linux-mbp.img
опции root=/dev/<b>nvme0n1p4</b> rw pcie_ports=compat

В случай, че сме използвали luks и lvm, то

опции cryptdevice=\/dev\/<b>nvme0n1p4</b>:luks root=\/dev\/mapper\/vz0-root rw pcie_ports=compat

Перезареждаме в MacOS.

6. Настройка на Wi-Fi

Както в крайна сметка се оказа, файловете с фърмуер за wi-fi адаптера MacOS се съхраняват в папка /usr/share/firmware/wifi , и можем да ги вземем оттам под формата на блобове и да ги предоставим на ядрото модула brcmfmac. За да разберем кои точно файлове използва вашият адаптер, отваряме терминала в MacOS и пишем:

ioreg -l | grep C-4364

Получаваме дълъг списък. Нужни са ни файловете само от раздела 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>"})

Във вашия случай имената на файловете могат да варират. Копираме ги от папката /usr/share/firmware/wifi на флашка и ги преименуваме в следния вид:

    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>

В този случай последният текстов файл съдържа имената на модела. Ако вашият модел не е macbookpro15,2, трябва да преименувате този файл в съответствие с вашия модел на макбук.

Рестартираме в арх.

Копираме файловете от флашката в папката /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/

Проверяваме работоспособността на модула:


rmmod brcmfmac
modprobe brcmfmac

Убедете се, че мрежовият интерфейс е появил чрез ifconfig/ip.
Настройваме wifi чрез iwctl

Внимание. Чрез netctl, nmcli и др. интерфейсът не работи, само чрез iwd.

Накараме NetworkManager да използва iwd. За целта създаваме файл /etc/NetworkManager/NetworkManager.conf и пишем:

[device]
wifi.backend=iwd

Стартираме услугата NetworkManager


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

7. Звук

За работа на звука е необходимо да инсталирате pulseaudio:


sudo pacman -S pulseaudio

Свали три файла:

Преместваме ги:

    /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. Suspend/Resume

В момента 16.10.2019 трябва да избирате между звук и suspend/resume. Изчакваме, докато авторът на модула bce завърши функционалността.

За да сглобите модула с поддръжка на suspend/resume, трябва да изпълните следното:


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

Ако сте инсталирали готовия модул apple-bce от репозитория anuali1, трябва предварително да го премахнете и едва след това да сглобите и инсталирате модула bce с поддръжка на режим suspend.

Също така е необходимо да добавите модула applesmc в blacklist (ако не сте го направили досега) и да се уверите, че в /boot/loader/entries/arch.conf в реда options в края е добавен параметърът pcie_ports=compat.

В момента драйверът на тачбара изключва при вход в режим suspend, а драйверът thunderbolt понякога блокира системата за повече от 30 секунди, а при възобновяване — за няколко минути. Това може да се поправи чрез автоматичното освобождаване на проблемните модули.

Създайте скрипт /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

Направете го изпълним:

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

Това е за сега. В крайна сметка получаваме напълно работеща система, с изключение на някои нюанси със suspend/resume. Няма изключвания и kernel panic през последните няколко дни на аптайм. Надявам се скоро авторът на модула bce да го завърши и да получим пълна поддръжка на suspend/resume и звук.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster