Достаточно много было шумихи по поводу того, что из-за нового чипа T2 невозможно установить linux на новые MacBook 2018 года с тачбаром. Шло время, и под конец 2019 года стронними разработчиками был реализован ряд драйверов и патчей ядра для взаимодействия с чипом T2. Основной драйвер для MacBook моделей 2018 и новее реализует работу VHCI (работа тача/клавиатуры/и.т.д.), а также функционирование звука.
Проект mbp2018-bridge-drv разделен на 3 основных компонента:
Второй проект называется macbook12-spi-driver, и он реализует возможность работы драйвера ввода для клавиатуры, трекпада SPI, тачбара для MacBook Pro конца 2016 г. и более поздних версий. Часть драйверов для клавиатуры/трекпада теперь включена в ядро, начиная с версии 5.3.
Также была реализована поддержка таких устройств, как wi-fi, тачпад, etc, с помощью патчей ядра. На текущий момент версия ядра 5.3.5-1
Данный туториал применим для macbookpro15,1 и macbookpro15,2. За основу была взята статья с гитхаба на английском отсюда. Не все из этой статьи заработало, поэтому пришлось искать решение самостоятельно.
https://support.apple.com/en-us/HT208330
https://www.ninjastik.com/support/2018-macbook-pro-boot-from-usb/
Для удобства я сразу выделил 30Гб на диск, отформатировав его в exfat в самом Disk Utility. Разбиение физического диска на разделы Disk Utility.
Варианты:
Перезагружаемся с вставленной флешкой и клавиатурой. Нажимаем options при появлении яблока, выбираем EFI BOOT.
Далее необходимо нажать клавишу «e» и вписать в конец командной строки module_blacklist=thunderbolt. Если этого не сделать, то система может не загрузиться, и вылетит ошибка Thunderbolt ICM Error.
С помощью fdisk/cfdisk находим наш раздел (у меня это nvme0n1p4), форматируем и производим установку арча. Можно воспользоваться официальной инструкцией или строронней.
Загрузочный раздел не создаем, загрузчик будем писать в /dev/nvme0n1p1
После того, как полностью сформировано окружение в /mnt и перед тем, как перейти в arch-chroot, пишем:
Добавляем в /etc/pacman.conf:
Устанавливаем ядро:
Прописываем thunderbolt и applesmc в /etc/modprobe.d/blacklist.conf
Устанавливаем yay:
Устанавливаем модули для работы тачбара:
Добавляем модули в автозагрузку: /etc/modules-load.d/apple.conf
Устанавливаем модули ядра для работы клавиатуры. В репозитории anuali1 есть готовый пакет, он называется apple-bce-dkms-git. Чтобы его установить, пишем в консоли:
В этом случае модуль ядра будет называться apple-bce. В случае самостоятельной сборки он называется bce. Соответственно, если вы хотите прописать модуль в раздел MODULES в файл mkinicpio.conf, то не забудьте, какой модуль вы устанавливали.
Сборка вручную:
Добавляем модуль bce или apple-bce в автозагрузку: /etc/modules-load.d/bce.conf
Если хотите использовать по умолчанию кнопки Fn, то в файл /etc/modprobe.d/apple-tb.conf пишем:
Обновляем ядро и initramfs.
Установим iwd:
После того, как внутри chroot все основные пакеты установлены, можно приступать к установке загрузчика.
Мне так и не удалось заставить работать grub. С внешнего usb-диска grub загружается, но при попытке прописать его в nvme через
Если необходимо, чтобы клавиатура работала до полной загрузки системы (это необходимо в случае использования шифрования luks/dm-crypt) то прописываем в файл /etc/mkinicpio.conf в разделе MODULES:
Обновляем ядро и initramfs.
Редактируем файл /boot/loader/loader.conf, удаляем все, что там внутри, и вносим следующее:
Переходим в папку /boot/loader/entries, создаем файл arch.conf и пишем:
В случае, если использовали luks и lvm, то
Перезагружаемся в MacOS.
Как в итоге выяснилось, файлы прошивок для wi-fi адаптера MacOS хранит в папке /usr/share/firmware/wifi , и можно их от туда взять в виде блобов и скормить модулю ядра brcmfmac. Для того, чтобы выяснить, какие именно файлы использует ваш адаптер, открываем терминал в MacOS и пишем:
Получаем длинный список. Нам нужны файлы только из раздела RequestedFiles:
В вашем случае названия файлов могут отличаться. Копируем их из папки /usr/share/firmware/wifi на флешку и переименовываем в следующий вид:
В данном случае последний текстовый файл содержит названия модели, если ваша модель не macbookpro15,2, то необходимо переименовать этот файл в соответствии с вашей моделью макбука.
Перезагружаемся в арч.
Копируем файлы с флешки в папку /lib/firmware/brcm/
Проверяем работоспособность модуля:
Убеждаемся, что сетевой интерфейс появился через ifconfig/ip.
Настраиваем wifi через iwctl
Внимание. Через netctl, nmcli, etc. интерфейс не работает, только через iwd.
Заставляем NetworkManager использовать iwd. Для этого создаем файл /etc/NetworkManager/NetworkManager.conf и пишем:
Запускаем службу NetworkManager
Для того, чтобы заработал звук, необходимо установить pulseaudio:
Скачиваем три файла:
Перемещаем их:
На текущий момент 16.10.2019 приходится выбирать либо звук, либо suspend/resume. Ждем, пока автор bce модуля допилит функционал.
Чтобы собрать модуль с поддержкой susped/resume, необходимо выполнить следующее:
Если вы устанавливали готовый модуль 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:
Сделайте его исполняемым:
На этом пока все. В итоге получась вполне работоспособная система, за исключением некоторых нюансов с suspend/resume. Никаких вылетов и kernel panic не наблюдается на протяжении нескольких дней аптайма. Надеюсь, в ближайшее время автор модуля bce его допилит, и мы получим полноценную поддержку suspend/resume и звука.
Проект mbp2018-bridge-drv разделен на 3 основных компонента:
- BCE (Buffer Copy Engine) — устанавливает основной канал связи с T2. VHCI и Audio требуют этот компонент.
- VHCI — это виртуальный хост-контроллер USB; клавиатура, мышь и другие компоненты системы предоставляются этим компонентом (другие драйверы используют этот хост-контроллер для обеспечения большей функциональности.
- Audio — драйвер для аудиоинтерфейса T2, в настоящее время поддерживается только вывод звука через встроенные динамики MacBook
Второй проект называется macbook12-spi-driver, и он реализует возможность работы драйвера ввода для клавиатуры, трекпада SPI, тачбара для MacBook Pro конца 2016 г. и более поздних версий. Часть драйверов для клавиатуры/трекпада теперь включена в ядро, начиная с версии 5.3.
Также была реализована поддержка таких устройств, как wi-fi, тачпад, etc, с помощью патчей ядра. На текущий момент версия ядра 5.3.5-1
Что работает на данный момент
- NVMe
- Клавиатура
- USB-C (Thunderbolt не проверялся, при автоматической загрузке модуля подвешивает систему намертво)
- Тачбар (с возможностью включения клавиш Fn, подсветка, ESC итп)
- Звук (только встроенные динамики)
- Модуль Wi-Fi (через brcmfmac и только через iw)
- DisplayPort через USB-C
- Сенсоры
- Suspend/Resume (частично)
- etc..
Данный туториал применим для macbookpro15,1 и macbookpro15,2. За основу была взята статья с гитхаба на английском отсюда. Не все из этой статьи заработало, поэтому пришлось искать решение самостоятельно.
Что потребуется для установки
- USB-C док-переходник на USB (как минимум три USB входа для подключения мыши, клавиатуры, usb модема или телефона в режиме tethering). Это необходимо только на первых этапах установки
- 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 образ
Варианты:
- Можно пойти простым путем и скачать готовый образ с ядром 5.3.5-1 и пачтами от aunali1 ссылка на готовый образ
- Сформировать образ самостоятельно через 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
Клавиатура, тачбар, etc
Устанавливаем 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
Устанавливаем модули ядра для работы клавиатуры. В репозитории anuali1 есть готовый пакет, он называется 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. С внешнего usb-диска grub загружается, но при попытке прописать его в nvme через
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grubсистема улетала в kernel panic, и после перезагрузки нового пункта через options не появлялось. Какого-то внятного решения данной проблемы я не нашел и поэтому решил попробовать реализовать загрузку с помощью systemd-boot.
- Запускаем
bootctl --path=/boot install
и улетаем в kernel panic. Выключаем MacBook, включаем заново, жмем options (usb-c хаб с клавиатурой не отключаем) - Проверяем, что появилась новая запись EFI BOOT помимо внешнего устройства
- Выбираем загрузку с внешнего usb-диска, как при первой установке (не забываем прописать module_blacklist=thunderbolt)
- Монтируем наш диск и переходим в окружение через 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 и пишем:
title arch
linux /vmlinuz-linux-mbp
initrd /initramfs-linux-mbp.img
options root=/dev/<b>nvme0n1p4</b> rw pcie_ports=compat
В случае, если использовали luks и lvm, то
options 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 -> 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.-<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, etc. интерфейс не работает, только через 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 модуля допилит функционал.
Чтобы собрать модуль с поддержкой 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 [ "${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 и звука.
Комментарии (14)
VolCh
19.10.2019 06:59+1Кажется, пропали последние сожаления, что выбрал не Мак. Был уверен, что дуалбут МакОс+Линукс так же просто в настройке как Винда+Линукс.
Это же не в арче дело, а в железе, да?
Ilyasyakubov
19.10.2019 13:24Mac именно как железку нет никакого смысла покупать. Mac берут из-за сочетания MacOS + экосистема + слаженная работа железа и MacOS.
fougasse
19.10.2019 13:32+1Как минимум, экран и общее впечатление от качества компонентов, сборки и прочего — довольно существенный аргумент.
Ilyasyakubov
19.10.2019 13:35Экран с DCI-P3 и идеальной заводской калибровкой, которых не будет на Linux или Win. А корпус и прочее это да.
vanyas
19.10.2019 15:58Тачпад ещё же, такого удобного тачпада с тактильным откликом не встречал больше нигде
danfe
19.10.2019 18:56+1Mac именно как железку нет никакого смысла покупать.
Попробую не согласиться. Вот взять, к примеру, Mid-2012 тринашку MacBookPro9,2 — имхо, лучшая из прошек по сей день. В своё время я собирался потерпеть и купить её на вторичке (б/у или refurbished) с большим дисконтом, но она не спешит терять в цене и годы спустя (потому что я не один такой умный — где еще вы найдете ноут без дискретки, добиваемый до 16 ГБ ОЗУ, с DVD-приводом и портами FireWire, Ethernet, Thunderbolt, USB 3 одновременно?). В итоге я взял другой ноутбук, успокаивая себя тем, что у маков всё-таки довольно неудобная клавиатура без некоторых привычных для программиста физических кнопок, и процессоры там — дырявые (как выяснилось после января 2018 г.) Intel, но если бы не эти «мелочи», эта прошка (нафаршированная памятью и SSD) под фрёй — моя мечта! :-)
raiSadam
А зачем Вам арч на железе в данном случае? Интересны причины, в копилку так сказать. Я сам когда-то на прошу mid12 бубунту накатывал, но у меня была смешная причина… Не осилил макось)) Прошло время, теперь пользуюсь и маком и линуксом в одних и тех же сценариях (c++ development)
0xd34df00d
Я бы не отказался от гения на ноуте потому, что под ней мне удобнее, чем под маком, и для моих задач (тоже девелопмент, правда, уже почти без C++ с одним чистым хаскелем-идрисом-коком) лучше и удобнее.
VolCh
Коллега не дале чем вчера сталкивался с какими то, скажем так, особенностями работы докера в Макось. Команды из гайдов, которые работали у меня, не работали у него.
С неделю назад я описал своё видение нашего DX в плане разворачивания и обновления нашей системы (сейчас наверное около 15 команд надо запустить, я предложил пару баш-скриптов вокруг Докер и докер-композ), первым вопросом было "а на мак это работать будет", на что я ответил "запустите — узнаете, не заработает — можете фиксить". Раз вопрос возник, значит коллеги уже с проблемами сталкивались
shanlove
Грустно как раз то, что подавляющее большинство столкнувшихся с проблемами докера на неродной ос не имеют мотивации раз и навсегда разобраться, что работать будет, что нет и почему, а также какими костылями можно решить большую часть проблем.
Задача на день, трудозатраты отбиваются за считанные недели.
fougasse
Но зачем тратить время на поиск костылей, потом их поддерживать, тратить время и силы, если самим авторам это нафиг не надо?
shanlove
Потому что деньги платят за решение бизнес-задач, а не изобретение велосипедов. Как бы ни хотелось обратного.
Если индустрия уже выплюнула решение проблемы — почему бы его не переиспользовать?