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 уже активируют KMS автоматически для всех чипсетов, так что не требуется ручной настройки.
Проприетарные драйвера NVIDIA и AMD Catalyst не используют стек свободных драйверов. В случае использования KMS необходимо заменить ими свободные драйвера.
Ранний запуск KMS
Ранний запуск KMS возможен во время процесса загрузки путём добавления модуля radeon
(для ATI/AMD карт), i915
(для графики Intel) или nouveau
(для карт Nvidia) в строку MODULES
в /etc/mkinitcpio.conf
. Например:
/etc/mkinitcpio.conf
MODULES="... i915 ..."
intel_agp
перед i915
для подавления ошибок ACPI.Если Вы используете изменённый файл EDID (не совпадающий с преднастроенными разрешениями), следует встроить его в initramfs:
/etc/mkinitcpio.conf
FILES="/usr/lib/firmware/edid/your_edid.bin"
Пересоберите образ ядра (смотрите статью о mkinitcpio для получения дополнительной информации):
# mkinitcpio -p <name of your kernel preset; e.g. linux>
Устранение неполадок
Мои шрифты слишком маленькие
Смотрите статью Fonts о том, как изменить шрифт в консоли на более крупный. Например, шрифт Terminus (terminus-font) доступен в нескольких размерах, в том числе и в больших.
Проблемы во время загрузки и dmesg
Опрос подключенных дисплеев на старых системах может быть довольно громоздким. Опрос происходит периодически и может занять несколько сотен миллисекунд в зависимости от оборудования.
Если выскакивает ошибка с кодом 0x00000010 (2)
во время процесса загрузки (Вы можете получить около 10 строк текста, последняя часть содержит этот код), используйте:
/etc/modprobe.d/modprobe.conf
options drm_kms_helper poll=0
Принудительный режим и EDID
В случае когда Ваш дисплей не отправляет соответствующий EDID или вызывает какие-либо проблемы, Вы будете уведомлены, что родное разрешение автоматически не настроено или не отображается вообще. Ядро имеет условие для загрузки бинарных данных EDID, и поддерживает четыре наиболее типичных разрешения.
Если у Вас имеется EDID файл для Вашего монитора, процесс упрощается. Если нет, можете использовать один из преднастроенных EDID файлов (или сгенерированных однажды во время компиляции ядра, больше информации здесь[устаревшая ссылка 2020-08-02]) или создать свой собственный EDID.
В случае когда EDID имеется (например извлечённый из Windows драйверов для Вашего монитора или полученный командой get-edid
из пакета read-edid), создайте директорию edid
в /usr/lib/firmware
:
# mkdir /usr/lib/firmware/edid
затем скопируйте Ваш файл в директорию /usr/lib/firmware/edid
.
Для запуска во время загрузки, следуйте указаниям из kernel command line:
drm_kms_helper.edid_firmware=edid/your_edid.bin
Также, можно указать только для заданного дисплея:
drm_kms_helper.edid_firmware=VGA-1:edid/your_edid.bin
Для преднастроенные разрешений, смотри таблицу имён спецификаций:
Разрешение | Имя спецификации |
1024x768 | edid/1024x768.bin |
1280x1024 | edid/1280x1024.bin |
1600x1200 (kernel 3.10 or higher) | edid/1600x1200.bin |
1680x1050 | edid/1680x1050.bin |
1920x1080 | edid/1920x1080.bin |
Если осуществлён ранний запуск KMS, необходимо включить кастомизированный файл EDID в initramfs иначе возможны проблемы.
Вы также можете собрать собственный EDID с использованием makefile входящего в ядро (см. Documentation/EDID
). Полная информация доступна по адресам здесь[устаревшая ссылка 2020-08-02] и здесь.
video=
может оказаться полезным в некоторых событиях.Взято из nouveau wiki:
Режим может быть принудительным в командной строке ядра. К сожалению, опция командной строки видео бедно документирована в случае с DRM. Части и куски того как это использовать можно найти в
- https://cgit.freedesktop.org/nouveau/linux-2.6/tree/Documentation/fb/modedb.txt
- https://cgit.freedesktop.org/nouveau/linux-2.6/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 по различным причинам, таким как получение пустого экрана или "no signal" ошибку с монитора, когда используются драйвера Catalyst, и т.п. Для отключения KMS добавьте nomodeset
в параметры ядра. См. Kernel parameters для более подробной информации.
Наряду с параметром nomodeset
, для карт Intel необходимо добавить i915.modeset=0
, а для Nvidia nouveau.modeset=0
. Для систем двойной графики (dual-graphics system) Nvidia Optimus, нужно добавить все три параметра ядра ("nomodeset i915.modeset=0 nouveau.modeset=0"
).