Linux and macbook pro

Заставляем работать MacBook Pro 2018 T2 c ArchLinux (dualboot)

Достаточно много было шумихи по поводу того, что из-за нового чипа T2 невозможно установить linux на новые MacBook 2018 года с тачбаром. Шло время, и под конец 2019 года стронними разработчиками был реализован ряд драйверов и патчей ядра для взаимодействия с чипом T2. Основной драйвер для MacBook моделей 2018 и новее реализует работу VHCI (работа тача/клавиатуры/и.т.д.), а также функционирование звука.

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

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

Также была реализована поддержка таких устройств, как wi-fi, тачпад, etc, с помощью патчей ядра. На текущий момент версия ядра 5.3.5-1

Что работает на данный момент

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

Что потребуется для установки

  • USB-C док-переходник на USB (как минимум три USB входа для подключения мыши, клавиатуры, usb модема или телефона в режиме tethering). Это необходимо только на первых этапах установки
  • USB-клавиатура
  • USB/USB-C флешка минимум на 4Гб

1. Отключаем запрет загрузки с внешних носителей

2. Выделяем свободное место с помощью Disk Utility

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

Читайте также:  Jpg to pdf линукс

3. Формируем iso образ

  1. Можно пойти простым путем и скачать готовый образ с ядром 5.3.5-1 и пачтами от aunali1ссылка на готовый образ
  2. Сформировать образ самостоятельно через archlive (необходима система с дистрибутивом арча)
 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 '$/airootfs/'. " if [[ "$" = "y" ]]; then pacstrap -i -C "$" -c -G -M "$/airootfs" $* &> /dev/null else pacstrap -i -C "$" -c -G -M "$/airootfs" $* fi _msg_info "Packages installed successfully!" >

Нажимаем 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 

Клавиатура, тачбар, etc

 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 

Устанавливаем модули ядра для работы клавиатуры. В репозитории anuali1 есть готовый пакет, он называется 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

Если хотите использовать по умолчанию кнопки Fn, то в файл /etc/modprobe.d/apple-tb.conf пишем:

options apple-ib-tb fnmode=2

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

sudo pacman -S networkmanager iwd

5. Загрузчик

После того, как внутри chroot все основные пакеты установлены, можно приступать к установке загрузчика.

Мне так и не удалось заставить работать grub. С внешнего usb-диска grub загружается, но при попытке прописать его в nvme через

система улетала в kernel panic, и после перезагрузки нового пункта через options не появлялось. Какого-то внятного решения данной проблемы я не нашел и поэтому решил попробовать реализовать загрузку с помощью systemd-boot.

 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.

Настраиваем systemd-boot

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

default arch timeout 5 editor 1 

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

title arch linux /vmlinuz-linux-mbp initrd /initramfs-linux-mbp.img options root=/dev/nvme0n1p4 rw pcie_ports=compat 

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

options cryptdevice=/dev/nvme0n1p4:luks root=/dev/mapper/vz0-root rw pcie_ports=compat 

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

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

Получаем длинный список. Нам нужны файлы только из раздела RequestedFiles:

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

 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.-MacBookPro15,2.txt 

В данном случае последний текстовый файл содержит названия модели, если ваша модель не 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.-MacBookPro15,2.txt' /lib/firmware/brcm/ 

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

 rmmod brcmfmac modprobe brcmfmac 

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

Внимание. Через netctl, nmcli, etc. интерфейс не работает, только через iwd.

Заставляем NetworkManager использовать iwd. Для этого создаем файл /etc/NetworkManager/NetworkManager.conf и пишем:

Запускаем службу NetworkManager

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

7. Звук

Для того, чтобы заработал звук, необходимо установить 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 модуля допилит функционал.

Чтобы собрать модуль с поддержкой susped/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 режима.

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

На текущий момент драйвер тачбара вылетает при входе в режим suspend, а драйвер thunderbolt иногда подвешивает систему более чем на 30 секунд, а при возобновлении — на несколько минут. Это можно исправить путем автоматической выгрузки проблемных модулей.

Создайте скрипт /lib/systemd/system-sleep/rmmod.sh:

#!/bin/sh if [ "$" == "pre" ]; then rmmod thunderbolt rmmod apple_ib_tb elif [ "$" == "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 и звука.

Источник

Оцените статью
Adblock
detector