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. Решаем легко одним из двух способов.
- Впиливаем в параметры ядра:
hid_apple.fnmode=2
- Создаем файлик /etc/modprobe.d/hid_apple.conf со следующим содержимым:
options hid_apple fnmode=2
Меняем местами CMD и Option (alt)
Это для того, чтобы заработала мышечная память, ибо в Linux по-умолчанию окна переключаются с помощью ALT+TAB. И, как и с Fx, решить можно двумя путями.
- Впиливаем в параметры ядра:
hid_apple.swap_opt_cmd=1
- Впиливаем в /etc/modprobe.d/hid_apple.conf:
options hid_apple swap_opt_cmd=1
Переезжаем на Intel как основную видеокарту
Внимание: следование этой инструкции сделает невозможным использование nVidia! Также подразумевается, что вы грузитесь в режиме EFI. Для BIOS Legacy режима есть инструкция в арчвики, которой мы тут частично будем следовать.
- Компиляем EFI приложение apple_set_os. Копируем полученный
apple_set_os.efi
в/boot/EFI/custom
(создаем директорию при необходимости, ее может и не быть). - Ставим
efibootmgr
и добавляем возможность стартануть свежескомпилированное EFI приложение:
efibootmgr -b FFF0 --disk /dev/sda --part 1 --create --gpt --label "apple_set_os" --loader /EFI/custom/apple_set_os.efi
- Выполняем 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*
- Меняем последовательность загрузки:
efibootmgr -o FFF0,0000
-
Даем опять команду
efibootmgr
без параметров и убеждаемся, что вBootOrder
правильная последовательность: сначалаapple_set_os
, потомLinux Boot Manager
. -
Перезагружаемся, чтобы выполнилось EFI приложение и запустило Intelовскую видеокарту. Перед этим лучше убедиться, что вы никак не форсили в X.org или Wayland использование nVidia, иначе у вас будет черный экран.
-
Выкачиваем gpu-switch и выполняем для переключения на интеграшку (от рута):
./gpu-switch -i
- Финальный ребут.
Это все, что можно сделать по этой теме. Выключение 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
ВНИМАНИЕ: простое копирование тут может не помочь. Что нужно предварительно сделать:
modprobe msr
обязательно.- Прочитать значение регистра 0x1FC:
rdmsr 0x1FC
. - От полученного шестнадцатеричного значения отнять 1 и отправить в wrmsr. У меня это было
0x4005d
, поэтому я сделал так:wrmsr 0x1FC 0x4005c
.
Чиним внезапные отключения при неработающей или отсутствующей батарейке
Да, такое случается. И причин этому несколько:
- У вас китайский адаптер, который не выдает нужную мощность.
- У вас уже сильно поюзанный адаптер, который не выдает нужную мощность.
- У вас настает пушной зверек MagSafe разъему.
Фикс для всего один - лимитируйте скорость процессора в 2/3 максимум. Я сделал это с помощью cpupower
:
/bin/cpupower frequency-set -u 2.5GHz
Менять governor бесполезно, потому что там только два выбора - это performance
и powersave
, и даже последний дает раскочегарить при необходимости (очень сильной) максимальную скорость.
Полезное чтиво