Kernel mode setting (Русский)
Kernel Mode Setting (KMS) представляет собой метод для задания разрешения дисплея и глубины в пространстве ядра, а не в пространстве пользователя.
Реализация KMS в ядре Linux активирует родное расширение в framebuffer и допускает мгновенное переключение консолей (tty). KMS содержит новые технологии (такие как DRI2) которые помогают снизить количество артефактов и увеличить производительность в 3D, даже при включенном режиме энергосбережения.
История
Ранее настройками видео карты занимался непосредственно X сервер. По этой причине достигнуть высокого качества графики в tty консолях было непросто. Кроме того, каждый раз при переключении из X в виртуальную консоль с помощью комбинации клавиш (Ctrl+Alt+F1
) сервер должен был передавать управление видеокартой ядру, что было медленным и вызывало мерцания. Особенно "болезненным" был переход управления обратно к X серверу (Ctrl+Alt+F7
).
С использованием Kernel Mode Setting (KMS) ядру стала доступна установка режимов видео карты. Наряду с другими достоинствами это улучшает визуальные эффекты при установке параметров графики, а также позволяет быстрее переключаться между виртуальными консолями и X.
Установка
Обратите внимание - для любых используемых Вами методов необходимо всегда отключать:
- Любые
vga=
режимы в загрузчике, так как это вызовет конфликт с разрешением, активированным в KMS. - Любые
video=
строки, активирующие framebuffer, что вызовет конфликт с драйвером. - Любые другие драйвера framebuffer (такие как uvesafb).
Поздний запуск KMS
Драйвера Intel, Nouveau и ATI и AMDGPU уже активируют KMS автоматически для всех чипсетов и не требуют ручной настройки.
Проприетарный драйвер NVIDIA поддерживает KMS с версии 364.12, но нужно включить его вручную.
Ранний запуск KMS
Обычно KMS инициализируется после этапа initramfs. Однако можно включить KMS уже на этапе initramfs. Добавьте нужный модуль для видеодрайвера в конфигурационный файл initramfs:
-
amdgpu
для AMDGPU лиradeon
для старого драйвера ATI. -
i915
для Intel graphics. -
nouveau
для открытого драйвера Nouveau. -
mgag200
для Matrox. - Для QEMU в зависимости от используемого режима графики:
virtio-gpu
для VirtIO,qxl
для QXL илиcirrus
для Cirrus. -
nvidia nvidia_modeset nvidia_uvm nvidia_drm
для проприетарного драйвера nvidia. Смотрите NVIDIA (Русский)#DRM kernel mode setting для подробностей.
Инструкции по настройке initramfs немного отличаются в зависимости от генератора initramfs, который вы используете.
mkinitcpio
Пример раннего запуска KMS для Intel graphics:
/etc/mkinitcpio.conf
MODULES=(... i915 ...)
intel_agp
перед i915
для подавления ошибок ACPI. Это может потребоваться для возобновления работы из спящего режима при изменённой конфигурации дисплея. Если вы используете PRIME GPU с Intel IGP в качестве основного GPU и AMD в качестве дискретного, добавление intel_agp
может привести к проблемам при возобновлении работы из спящего режима (монитор не получает сигнала). Подробнее: [1]
Если Вы используете изменённый файл EDID (не совпадающий с преднастроенными разрешениями), следует встроить его в initramfs:
/etc/mkinitcpio.conf
FILES=(/usr/lib/firmware/edid/ваш_edid.bin)
После изменений пересоберите образ initramfs.
Booster
Пример настройки Booster:
/etc/booster.yaml
modules_force_load: i915
Добавление дополнительных файлов в образ:
/etc/booster.yaml
extra_files: /usr/lib/firmware/edid/ваш_edid.bin
После изменений пересоберите образы booster.
Решение проблем
Мои шрифты слишком маленькие
В статье Консоль Linux#Шрифты вы можете узнать, как изменить шрифт в консоли на более крупный. Например, шрифт Terminus (terminus-font) доступен в нескольких размерах, в том числе и в большом ter-132n
.
Или можно отключить modesetting, что приведёт к использованию меньшего разрешения экрана, и шрифты станут выглядеть крупнее.
Проблемы во время загрузки и dmesg
Опрос подключенных дисплеев на старых системах может быть довольно громоздким. Опрос происходит периодически и может занять несколько сотен миллисекунд в зависимости от оборудования. Это может приводить к заметным задержкам, например, при воспроизведении видео. Такие задержки могут происходить, даже если видео выводится на HDP-выход, но в конфигурации оборудования есть другие выходы, не HDP. Если у вас наблюдаются задержки в выводе изображения на экран каждые 10 секунд, отключение опроса может помочь.
Если выскакивает ошибка с кодом 0x00000010 (2)
во время процесса загрузки (Вы можете получить около 10 строк текста, последняя часть содержит этот код), используйте:
/etc/modprobe.d/modprobe.conf
options drm_kms_helper poll=0
Принудительный режим и EDID
В случае когда Ваш дисплей не отправляет соответствующий EDID или вызывает какие-либо проблемы, Вы будете уведомлены, что родное разрешение автоматически не настроено или не отображается вообще. Ядро пытается отловить проблемы и устанавливает одно из наиболее типичных разрешений.
Если у вас есть EDID-файл для вашего монитора, то вам просто нужно явно указать его (смотрите ниже). Однако чаще всего прямого доступа к нормальному файлу нет, и приходится либо извлекать существующий и исправлять его, либо генерировать новый.
Создание новых бинарных файлов EDID для различных разрешений и конфигураций возможно во время компиляции ядра, следуя документации (также здесь есть краткое руководство). Другие решения подробно описаны в этой статье.
Извлечение существующего в большинстве случаев проще, например, если ваш монитор нормально работает под Windows, вам может повезти извлечь EDID из соответствующего драйвера, или есть похожий монитор, который успешно работает с такими же настройками, вы можете использовать get-edid
из пакета read-edid. Можно также попробовать поискать в /sys/class/drm/*/edid
.
После подготовки EDID поместите его в подкаталог, например, с названием edid
в каталоге /usr/lib/firmware
и скопируйте в него свой бинарный файл.
Для запуска во время загрузки пропишите параметр ядра:
drm.edid_firmware=edid/your_edid.bin
Для ядер старее 4.13 используется другой параметр:
drm_kms_helper.edid_firmware=edid/your_edid.bin
Также, можно указать только для заданного дисплея:
drm.edid_firmware=VGA-1:edid/your_edid.bin
Для преднастроенные разрешений, смотри таблицу имён спецификаций:
Разрешение | Имя спецификации |
---|---|
800x600 | edid/800x600.bin |
1024x768 | edid/1024x768.bin |
1280x1024 | edid/1280x1024.bin |
1600x1200 (ядро 3.10 или новее) | edid/1600x1200.bin |
1680x1050 | edid/1680x1050.bin |
1920x1080 | edid/1920x1080.bin |
Если осуществлён ранний запуск KMS, необходимо включить кастомизированный файл EDID в initramfs иначе возможны проблемы.
Значение параметра drm.edid_firmware
также может быть изменено после загрузки путём записи в /sys/module/drm/parameters/edid_firmware
:
# echo edid/your_edid.bin > /sys/module/drm/parameters/edid_firmware
Это повлияет только на вновь подключенные мониторы; ранее подключенные продолжат использовать старые настройки EDID. Однако для внешних мониторов достаточно переподключить их, чтобы новый EDID применился.
Начиная с ядра 3.15, для изменения EDID после загрузки системы можно использовать debugfs вместо параметра ядра, если ядро не находится в Lockdown-режиме. Это очень полезно, если вы меняете местами мониторы на разъёме или просто для тестирования.
# cat correct-edid.bin > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override
Отключение:
# echo -n reset > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override
video=
может оказаться полезным в некоторых событиях.Взято из nouveau wiki:
- Режим может быть принудительным в командной строке ядра. К сожалению, опция командной строки видео бедно документирована в случае с DRM. Части и куски того как это использовать можно найти в
В формате:
video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
-
<conn>
: Коннектор, т.н. DVI-I-1, смотри доступные здесь/sys/class/drm/
-
<xres> x <yres>
: разрешение -
M
: посчитать режим CVT? -
R
: снижение мерцания? -
-<bpp>
: глубина цвета -
@<refresh>
: частота обновления -
i
: чересстрочный (non-CVT mode) -
m
: поля? -
e
: принудительный вывод on -
d
: принудительный вывод off -
D
: принудительный цифровой вывод on (т.н. DVI-I коннектор)
Вы можете переопределять режимы нескольких выходов использующих "video" несколько раз, в частности, для вывода DVI в 1024x768 на 85 Hz и отключения TV-out:
video=DVI-I-1:1024x768@85 video=TV-1:d
Для получения имени и текущего статуса коннекторов, Вы можете использовать однострочную команду:
$ for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done
DVI-I-1: connected HDMI-A-1: disconnected VGA-1: disconnected
Отключение modesetting
Вы можете захотеть отключить KMS по различным причинам. Для отключения KMS добавьте nomodeset
в параметры ядра.
Наряду с параметром nomodeset
, для карт Intel необходимо добавить i915.modeset=0
, а для Nvidia nouveau.modeset=0
. Для систем двойной графики (dual-graphics system) Nvidia Optimus, нужно добавить все три параметра ядра ("nomodeset i915.modeset=0 nouveau.modeset=0"
).