Kernel mode setting (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Kernel mode setting. Дата последней синхронизации: 9 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Kernel Mode Setting (KMS) представляет собой метод для задания разрешения дисплея и глубины в пространстве ядра, а не в пространстве пользователя.

Реализация KMS в ядре Linux активирует родное расширение в framebuffer и допускает мгновенное переключение консолей (tty). KMS содержит новые технологии (такие как DRI2) которые помогают снизить количество артефактов и увеличить производительность в 3D, даже при включенном режиме энергосбережения.

Примечание: Проприетарный драйвер NVIDIA (с версии 364.12) также поддерживает KMS, но не использует встроенную реализацию ядра и не обеспечивает работу драйвера FBdev для отображения консоли с высоким разрешением.

История

Ранее настройками видео карты занимался непосредственно 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 может понадобиться добавление 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
Важно: Метод описанный ниже немного не завершён потому что Xorg не принимает заданные разрешения, так что советуем использовать метод, описанный выше; однако, указание разрешения с помощью строки 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").

Примечание: Некоторые драйвера Xorg не работают с отключенным KMS. Читайте вики-страницу вашего драйвера для подробностей.