Вопрос или проблема
Я пытаюсь установить нестандартное разрешение для моего основного дисплея, которое монитор не рекламирует как доступное. В Windows я мог установить нестандартное разрешение в панели управления NVIDIA, а затем переключиться на него из командной строки с помощью qres.
Теперь, когда я использую Linux, я хочу создать нестандартный режим для моего дисплея и переключаться на него в любое время с помощью xrandr. Но все руководства, которые я нашел, не помогают мне, заканчивая ошибкой “BadMatch”.
ellitedev@twrreborn:~$ xrandr
Screen 0: minimum 8 x 8, current 3640 x 2580, maximum 32767 x 32767
DP-0 connected 1080x1920+0+660 left (normal left inverted right x axis y axis) 531mm x 298mm
1920x1080 60.00*+ 144.00 119.98 119.88 100.00 99.93 74.99 59.94 50.00
1440x900 119.85
1280x1024 119.96 75.02 60.02
1280x960 99.78
1280x720 60.00 59.94 50.00
1024x768 119.99 75.03 60.00
800x600 119.97 99.66 75.00 60.32
720x576 50.00
720x480 59.94
640x480 119.52 75.00 59.94 59.93
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 connected (normal left inverted right x axis y axis)
1280x768 59.99 +
1920x1080 60.00 59.94 50.00
1360x768 60.02
1360x765 60.00
1280x800 59.81
1280x720 60.00 59.94 50.00
1024x768 75.03 70.07 60.00
800x600 75.00 72.19 60.32 56.25
720x576 50.00
720x480 59.94
640x480 75.00 72.81 59.94 59.93
HDMI-0 connected primary 2560x1080+1080+1080 (normal left inverted right x axis y axis) 798mm x 334mm
2560x1080 59.98*+ 74.99 50.00
3840x2160 29.97 25.00 23.98
2560x1440 59.95
1920x1080 75.00 60.00 59.94 50.00
1680x1050 59.95
1600x900 60.00
1280x1024 75.02 60.02
1280x800 59.81
1280x720 60.00 59.94 50.00
1152x864 60.00
1024x768 75.03 60.00
800x600 75.00 60.32
720x576 50.00
720x480 59.94
640x480 75.00 59.94 59.93
DP-4 disconnected (normal left inverted right x axis y axis)
DP-5 connected 1920x1080+1400+0 (normal left inverted right x axis y axis) 531mm x 299mm
1920x1080 60.00*+ 59.94 50.00
1680x1050 59.95
1600x900 60.00
1440x900 59.89
1280x1024 75.02 60.02
1280x800 59.81
1280x720 60.00 59.94 50.00
1152x864 75.00
1024x768 75.03 70.07 60.00
800x600 75.00 72.19 60.32 56.25
720x576 50.00
720x480 59.94
640x480 75.00 72.81 59.94
DVI-D-1-0 disconnected (normal left inverted right x axis y axis)
HDMI-1-0 disconnected (normal left inverted right x axis y axis)
DP-1-0 disconnected (normal left inverted right x axis y axis)
DP-1-1 disconnected (normal left inverted right x axis y axis)
ellitedev@twrreborn:~$ cvt 2400 1080 60
# 2400x1080 59.97 Hz (CVT) hsync: 67.16 kHz; pclk: 216.00 MHz
Modeline "2400x1080_60.00" 216.00 2400 2552 2808 3216 1080 1083 1093 1120 -hsync +vsync
ellitedev@twrreborn:~$ xrandr --newmode "2400x1080_60.00" 216.00 2400 2552 2808 3216 1080 1083 1093 1120 -hsync +vsync
ellitedev@twrreborn:~$ xrandr --addmode HDMI-0 "2400x1080_60.00"
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 140 (RANDR)
Minor opcode of failed request: 18 (RRAddOutputMode)
Serial number of failed request: 65
Current serial number in output stream: 66
Я хочу убедиться, что все мои другие дисплеи останутся нетронутыми, когда я изменю этот один дисплей.
Я понимаю, что это может совпадать с другими постами, но я на пределе своих возможностей.
Я нашел решение!
Я получил основу того, что мне нужно знать, из поста на форуме и видео на YouTube.
В посте на форуме я нашел конкретную опцию, которую мне нужно добавить в мою конфигурацию xorg. Поскольку я использую Pop!_OS, я выяснил, что нужную мне можно найти в /usr/share/X11/xorg.conf.d/
. Файл, который мне действительно нужно было изменить, был 10-nvidia.conf
. Я предположил это потому, что в видео на YouTube я понял, что xorg загружает конфигурацию при загрузке в порядковом порядке названий файлов. И поскольку у меня были драйверы nvidia, я предположил, что это будет файл с названием nvidia.
Теперь строка, которую мне нужно было добавить, была:
Option "ModeValidation" "AllowNon60hzmodesDFPModes, NoEDIDDFPMaxSizeCheck, NoVertRefreshCheck, NoHorizSyncCheck, NoDFPNativeResolutionCheck, NoMaxSizeCheck, NoMaxPClkCheck, AllowNonEdidModes, NoEdidMaxPClkCheck"
Теперь моя конфигурация выглядит так:
Section "OutputClass"
Identifier "nvidia"
MatchDriver "nvidia-drm"
Driver "nvidia"
Option "AllowEmptyInitialConfiguration"
Option "ModeValidation" "AllowNon60hzmodesDFPModes, NoEDIDDFPMaxSizeCheck, NoVertRefreshCheck, NoHorizSyncCheck, NoDFPNativeResolutionCheck, NoMaxSizeCheck, NoMaxPClkCheck, AllowNonEdidModes, NoEdidMaxPClkCheck"
ModulePath "/usr/lib/x86_64-linux-gnu/nvidia/xorg"
EndSection
После сохранения этой конфигурации и перезагрузки я смог успешно добавить нестандартные режимы на свои дисплеи, используя
xrandr --newmode "3840x2160ijk" 533.00 3840 3888 3920 4000 2160 2163 2168 2222 +hsync -vsync
xrandr --addmode DP-1 "3840x2160ijk"
xrandr --output DP-1 --mode "3840x2160ijk"
Надеюсь, это поможет другим, кто находится в замешательстве.
Ответ или решение
Для того чтобы задать нестандартное разрешение дисплея в Pop!_OS 22.04 LTS с использованием драйверов Nvidia, требуется глубокое понимание как особенностей работы с графическим стеком Linux, так и специфики использования драйверов Nvidia. На Windows эта задача решается довольно просто с помощью Панели управления Nvidia и утилит обмена резолюциями, таких как QRes. Однако в Linux процесс более сложен, но, следуя ряду шагов, можно добиться успеха.
Теория: Почему это может не работать из коробки
Графическая система Linux использует протокол X11 совместно с утилитой xrandr для управления различными аспектами дисплеев, включая их разрешение. Когда вы создаете новое разрешение и добавляете его с помощью xrandr, это может завершиться ошибкой "BadMatch", означающей, что конфигурация не подходит для текущего подключения, вероятно, из-за ограничений проверок EDID (Extended Display Identification Data) драйверами Nvidia.
EDID — это метаданные, предоставляемые монитором, которые сообщают операционной системе о доступных разрешениях, частотах обновления и других возможностях. Nvidia драйверы строго следуют этим данным по умолчанию, чтобы избежать некорректных настроек.
Пример: Процесс добавления пользовательского разрешения
Ваша задача заключается в обходе ограничений EDID, чтобы установить нестандартное разрешение. В вашем случае вы изменяли файл конфигурации xorg.conf.d для указания драйверу игнорировать некоторые проверки. Это важное решение, поскольку изменения в этих настройках требуют понимания их воздействия.
Шаги, которые вы предприняли, включали генерацию пользовательского разрешения с помощью команды cvt
, создание нового видеорежима через xrandr --newmode
, а затем попытку добавить этот режим к определенному дисплею через xrandr --addmode
. Необходимость изменения конфигурационного файла xorg возникла из-за строгих проверок Nvidia драйвера, и решением стало добавление специфической опции "ModeValidation".
Применение: Настройка конфигурации и переключение режимов
Вот как можно более детально описать настройку:
-
Создание пользовательского режима:
- Используйте команду
cvt
для генерации данных для нового разрешения. Например,cvt 2400 1080 60
создаст параметры для разрешения 2400×1080 на частоте 60 Гц.
- Используйте команду
-
Настройка нового режима в xrandr:
- Создайте новый видео режим:
xrandr --newmode "2400x1080_60.00" 216.00 2400 2552 2808 3216 1080 1083 1093 1120 -hsync +vsync
- Создайте новый видео режим:
-
Добавление режима к устройству вывода:
- Примените новый режим к специфическому выходу:
xrandr --addmode HDMI-0 "2400x1080_60.00"
- Примените новый режим к специфическому выходу:
Но если вы получаете ошибку "BadMatch", это означает, что проверка EDID блокирует изменение. Тогда требуется модификация конфигурации X11.
-
Изменение конфигурации X.org:
- Вы можете редактировать файл
/usr/share/X11/xorg.conf.d/10-nvidia.conf
, добавив следующую строку в секцию "OutputClass":Option "ModeValidation" "AllowNon60hzmodesDFPModes, NoEDIDDFPMaxSizeCheck, NoVertRefreshCheck, NoHorizSyncCheck, NoDFPNativeResolutionCheck, NoMaxSizeCheck, NoMaxPClkCheck, AllowNonEdidModes, NoEdidMaxPClkCheck"
- Вы можете редактировать файл
-
Перезагрузка:
- Перезагрузите систему для того, чтобы изменения вступили в силу и драйвер Nvidia учел новые условия конфигурации.
После того как конфигурация обновлена и система перезагружена, вы сможете устанавливать необходимые резолюции, которые изначально не поддерживаются, с помощью уже знакомых вам команд xrandr
.
Итоги
Это решение подходит для пользователей, которые столкнулись с ограничениями стандартного набора разрешений их дисплеев. Применение пользовательских конфигураций в драйверах Nvidia позволяет расширять диапазон доступных резолюций, не теряя управление текущими настройками других дисплеев.
В итоге, вы получаете гибкость в выборе разрешений, что особенно актуально для специфических задач, как разработка, где требуется нестандартное отображение контента. Способность настройки системы по своим требованиям является одним из главных плюсов использования Linux, несмотря на начальные сложности конфигурирования.