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

Состояние перевода:
На этой странице представлен перевод статьи
Kernel mode setting
. Дата последней синхронизации: 9 февраля 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
ATI (Русский)
Intel graphics (Русский)
Nouveau (Русский)
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, что вызовет конфликт с драйвером.
Поздний запуск 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
[
ссылка недействительна
: package not found]
. Смотрите
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. Части и куски того как это использовать можно найти в
https://docs.kernel.org/fb/modedb.html
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/gpu/drm/drm_fb_helper.c
В формате:
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. Читайте вики-страницу вашего драйвера для подробностей.