, последнее обновление:
Содержание

Linux на Macbook Pro Retina 15" Late 2013

Есть у меня такой девайс - 15“ rMBP Late 2013, который был у жены для всяких графических дел. Но вот новый макбук (Pro 15” 2018) ушел к ней, а работать мне на чем-то надо. Так как от Catalina меня довольно сильно воротит, и в первую очередь из-за отказа от 32-битных приложений (прикиньте, сколько игорей “выкинулось”!), в Windows 10 все-таки не вставил (скорость под WSL не просто “аховая”, а не выдерживает никакой критики, особенно на тему большого PPS, например, когда JMeter’ом гоняешь сервис), было решено запилить сюда Linux, благо говорят, что все работает.

Для тех, у кого нет терпения - да, все работает! Глючит только гибернация с саспендом, о чем опишу ниже.

Также, внимание - эти советы могут помочь со всеми макбуками (как минимум прошками), которые pre-T1 (где еще нет T1 и T2 чипов).

Что нужно знать при установке Linux

Перво-наперво - пересоберите исошник с драйвером wl! Без него вафли не будет. В качестве обхода можно использовать внешний Ethernet адаптер или подключить телефон по USB/Bluetooth для раздачи интернета. Это Broadcom и тут ничего не сделаешь, ибо wl - проприетарный драйвер, а опенсорсный с нашим адаптером не работает.

А так - установка идет в обычном порядке. Рекомендую сразу делать установку не Grub’ом, а с systemd-boot (EFI/UEFI то есть), чтобы получить годное разрешение в TTY (CTRL+ALT+Fx). Из минусов - вы не сможете отключить дискретку (как минимум я ничего не нашел на эту тему, кроме того, что нужен Grub, который умеет только в BIOS Legacy режим и который не захотел у меня работать в режиме EFI). Поэтому да, батарейка будет кушаться.

Не стесняйтесь перехода на Intelовскую видеокарту. Потому что вам сейчас будет, наверное, смешно - она мощнее, чем nVidia. В синтетических тестах выиграет nVidia, а вот в real-world-usage (CS:GO, CS:S, Torchlight 2, Albion Online) использование Intel’а дало больше FPS и лучше графику при таком же FPS. Например, в CS:S при разрешении 1280×800 на nVidia у меня было около 150 FPS на низких настройках. У Intel - 180-240 (!!!). Возможно, всему виной “Mac Edition”, как “гордо” обозначен этот GPU в выводе lspci.

After-install tuning

А вот после установки есть что потюнить. Начнем-с.

WiFi && 5GHz

Оно работает, и очень хорошо - я легко и непринужденно по гигабитной локалке получал половину гигабита (около 50 мбайт/с), что в принципе соответствует стандарту AC. Единственно: выбирайте в вашем роутере использование как можно более низкого канала (или низкой частоты). Я уже столкнулся, когда канал на 5800MHz не хотел нормально работать, а вот 5200 и 5280 MHz заработал на ура.

Протестировано на микротиках (RB4011 с вафлей и hap ac^2).

Edit

Фиксим возможное неумение управлять подсветкой с nVidia как основной видеокартой

Нужно отключить bridge control у контроллера PCIe x16:

setpci -v -H1 -s 00:01.00 BRIDGE_CONTROL=0

Делать это надо при каждой загрузке. Самый простой вариант - использовать /etc/rc.local, погуглите, как его включить в вашем дистрибутиве. Для любителей systemd можно сделать отдельный юнит, конечно же.

По идее это делать не нужно, если вы решите использовать Intel’овскую видекарту - там все просто заработало.

Make vents (and temperature) great again

Установите mbpfan. Дефолтный конфиг вполне нормальный.

How-To HiDPI

Заголовок кликбейтовый, конечно, но на самом деле тут ничего описано не будет :). Причина проста - я не знаю, что вы будете использовать в качестве DE/WM. Что точно могу сказать, что DPI для шрифтов и прочего можно ставить в 168, например, через .Xdefaults.

Последний KDE умеет нормально все скейлить, надо просто в настройках экрана установить нужное масштабирование. Мне очень нравится 175%.

Make keyboard great again

Fx и медиакнопки-управление подсветкой

Этот раздел на любителя и необязателен вообще.

Я привык, что функциональные кнопки (которые Fx) ведут по-умолчанию себя именно как функциональные, а всякая медийка и управление подсветкой становится доступной с помощью нажатия на fn. Решаем легко одним из двух способов.

  1. Впиливаем в параметры ядра:
hid_apple.fnmode=2
  1. Создаем файлик /etc/modprobe.d/hid_apple.conf со следующим содержимым:
options hid_apple fnmode=2

Меняем местами CMD и Option (alt)

Это для того, чтобы заработала мышечная память, ибо в Linux по-умолчанию окна переключаются с помощью ALT+TAB. И, как и с Fx, решить можно двумя путями.

  1. Впиливаем в параметры ядра:
hid_apple.swap_opt_cmd=1
  1. Впиливаем в /etc/modprobe.d/hid_apple.conf:
options hid_apple swap_opt_cmd=1

Переезжаем на Intel как основную видеокарту

Внимание: следование этой инструкции сделает невозможным использование nVidia! Также подразумевается, что вы грузитесь в режиме EFI. Для BIOS Legacy режима есть инструкция в арчвики, которой мы тут частично будем следовать.

  1. Компиляем EFI приложение apple_set_os. Копируем полученный apple_set_os.efi в /boot/EFI/custom (создаем директорию при необходимости, ее может и не быть).
  2. Ставим efibootmgr и добавляем возможность стартануть свежескомпилированное EFI приложение:
efibootmgr -b FFF0 --disk /dev/sda --part 1 --create --gpt --label "apple_set_os" --loader /EFI/custom/apple_set_os.efi
  1. Выполняем efibootmgr и смотрим IDшник для линуксового загрузчика. Например, у меня это 0000:
# efibootmgr
BootCurrent: 0000
Timeout: 5 seconds
BootOrder: 0000
Boot0000* Linux Boot Manager
Boot0080* Mac OS X
Boot0081* Recovery OS
Boot0082*
BootFFF0* apple_set_os
BootFFFF*
  1. Меняем последовательность загрузки:
efibootmgr -o FFF0,0000
  1. Даем опять команду efibootmgr без параметров и убеждаемся, что в BootOrder правильная последовательность: сначала apple_set_os, потом Linux Boot Manager.

  2. Перезагружаемся, чтобы выполнилось EFI приложение и запустило Intelовскую видеокарту. Перед этим лучше убедиться, что вы никак не форсили в X.org или Wayland использование nVidia, иначе у вас будет черный экран.

  3. Выкачиваем gpu-switch и выполняем для переключения на интеграшку (от рута):

./gpu-switch -i
  1. Финальный ребут.

Это все, что можно сделать по этой теме. Выключение nVidia возможно только с помощью Grub, который я не использую (ссылка на инструкцию в начале раздела). Но мне и 3-5 часов вполне хватает для работы :).

Но если у кого-то есть информация о выключении nVidia с помощью EFI приложения (а не грабового скрипта) - отпишитесь, пожалуйста, в комментарии, буду премного благодарен.

Альтернативный вариант переезда на Intel

После выполнения все, в путь до п.6 (без этого никуда) можно попытаться выполнить отключение питания nVidia следующим набором команд:

printf "\x07\x00\x00\x00\x01\x00\x00\x00" > /sys/firmware/efi/efivars/gpu-power-prefs-000fa4ce-b62f-4c99-9cc3-6815686e30f9
chattr +i "/sys/firmware/efi/efivars/gpu-power-prefs-000fa4ce-b62f-4c99-9cc3-6815686e30f9"

chattr ставит флаг иммутабельности, чтобы его случайно не изменили и не потерли. Эффект аналогичен использованию gpu-switch выше.

CPU жрется после переезда на Intelовскую видеокарту

Cвязано с обработкой прерываний и неполным выключением nVidia (даже, правильно сказать, с официально неподдерживаемым режимом работы). Как выяснить, что вы стали жертвой:

grep . -r /sys/firmware/acpi/interrupts/ | grep -v invalid

Выполните команду несколько раз и сравните значения. Если одно из прерываний стремительно набирает циферки, то да - вот она причина.

У меня это было gpe06. Чиним с помощью добавления максировки прерывания к параметрам запуска ядра:

acpi_mask_gpe=0x06

Edit

Батарейка и управление питанием

Раньше было довольно много хаков как заставить управление питанием всякого добра работать правильно, да еще и со сном или гибернацией были проблемы. Сейчас это решается добавлением следующего параметра ядра в загрузчик:

acpi_osi=Darwin

Это может вылечить:

  • Невозможность уйти в сон или гибернацию.
  • Невидимость батарейки.
  • Работа управления питанием железок (процессора, памяти, SSD и прочего).
  • Еще много чего, эполоспецифичного.

Отключаем Thunderbolt

Я им не пользуюсь, а потребление питания хотелось бы уменьшить. Да и в линуксах вообще плохо с менеджментом питания маковых Thunderbolt. Так что я немного потерял, сделав файлик /etc/modprobe.d/thunderbolt.conf со следующим содержанием:

install thunderbolt /bin/true

То есть мы эффективно блеклистим модуль, препятствуя его загрузке вообще. Я подтверждаю снижение энергопотребления на 2-5W по показаниям из powertop.

Автоматизируем включение энергосбережения для всякого

В /etc/rc.local добавляем следующие строки:

# Power management things.
echo '0' > '/proc/sys/kernel/nmi_watchdog'
echo 'auto' > '/sys/bus/pci/devices/0000:08:00.0/power/control';
echo '1500' > '/proc/sys/vm/dirty_writeback_centisecs';
echo '1' > '/sys/module/snd_hda_intel/parameters/power_save';
echo 'min_power' > '/sys/class/scsi_host/host0/link_power_management_policy';
echo 'auto' > '/sys/block/sda/device/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:05:00.0/ata1/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:05:00.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:00.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:14.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:03.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1b.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:00:1c.0/power/control';
echo 'auto' > '/sys/bus/pci/devices/0000:01:00.0/power/control'

Это включает автоматическое управление питанием для:

  • SSD (плюс небольшая оптимизация работы с ним)
  • Контроллера DRAM
  • USB
  • Аудио (Intel HDA)
  • PCIe
  • Не до конца выключенной nVidia GT 750M

Дало в среднем снижение от 5 до 15W по показаниям powertop.

Чиним suspend

У меня сложилась следующая ситуация:

  • При первом сне все отлично работает
  • Второй и последующий сны ноутбук сначала засыпает, и через 2-10 секунд обратно просыпается.

Фикс:

echo XHC1 > /proc/acpi/wakeup

Можно добавить в /etc/rc.local, чтобы применять при загрузке.

Edit

Bonus things

Так как ноут был немножечко “убит” (отсутствовала работающая батарейка, например), то ниже я складировал несколько универсальных фиксов для всяких необычных ситуаций. В нормальной обстановке они вам не нужны.

Отключаем троттлинг при неработающей или отсутствующей батарейке

Apple такие “умницы”, что при отсутствующей или неработающей батарейке понижают частоту процессора до 800 МГц, из-за чего с системой работать просто невозможно - тот же VSCode дико лагает, KDE тоже (если использовать интеловскую видеокарту, с nVidia все нормально), и софт компилится очень долго.

Суть в том, что в специальный MSR (0x1FC, BD PROCHOT) наша прошивка пишет некий код, который заставляет процессор работать с минимальной частотой. Фикс таков:

/bin/modprobe msr
/bin/wrmsr 0x1FC 0x4005c
/bin/rmmod msr

ВНИМАНИЕ: простое копирование тут может не помочь. Что нужно предварительно сделать:

  1. modprobe msr обязательно.
  2. Прочитать значение регистра 0x1FC: rdmsr 0x1FC.
  3. От полученного шестнадцатеричного значения отнять 1 и отправить в wrmsr. У меня это было 0x4005d, поэтому я сделал так: wrmsr 0x1FC 0x4005c.

Чиним внезапные отключения при неработающей или отсутствующей батарейке

Да, такое случается. И причин этому несколько:

  • У вас китайский адаптер, который не выдает нужную мощность.
  • У вас уже сильно поюзанный адаптер, который не выдает нужную мощность.
  • У вас настает пушной зверек MagSafe разъему.

Фикс для всего один - лимитируйте скорость процессора в 2/3 максимум. Я сделал это с помощью cpupower:

/bin/cpupower frequency-set -u 2.5GHz

Менять governor бесполезно, потому что там только два выбора - это performance и powersave, и даже последний дает раскочегарить при необходимости (очень сильной) максимальную скорость.


Полезное чтиво