Низкое разрешение в начальном буфере кадров/консоли EFI/VGA (и в GRUB)

Вопрос или проблема

Когда я загружаю свою машину с Linux с UEFI и grub2, у меня доступно только несколько графических режимов (режимов разрешения). И оба из них действительно меньше, чем мой монитор/экран. Например, разрешение загрузочной консоли устанавливается на 800x600, в то время как мой экран имеет 1920x1080, и изображение выглядит очень плохо.

Мой GPU – Nvidia, но я не хочу устанавливать, вставлять или использовать какие-либо драйверы, специфичные для GPU. По крайней мере, не во время загрузки.

Меня интересует возможность изменения разрешения начальной EFI/VGA загрузочной консоли (и GRUB2) так, чтобы оно совпадало с полным экраном.

Некоторые источники утверждают, что я не могу, потому что возможно использовать только разрешения, поддерживаемые GPU в режиме VESA-расширений. Это правда? Это относится к моему случаю? Или мне просто нужно изменить некоторые настройки UEFI?

Я хотел бы, чтобы полное разрешение было включено с момента начала GRUB. Это возможно?

Уровень загрузки против уровня ядра

Из комментария OP:

@eyoung100 Я могу просматривать и выбирать режимы EFI GOP в меню grub2. Но доступно только два режима: 800×600 и 1024×768. Мой дисплей 1920×1080, и эти режимы выглядят ужасно на нем (особенно если я использую Xorg с efifb). Вот почему я не могу использовать EFI framebuffer…

Я полагаю, что OP пытается исправить проблему уровня загрузки с помощью решения уровня ядра. Некоторые моменты, которые следует помнить:

  1. Разрешения GOP и EFI переменные хранятся в NVRAM компьютера как только для чтения.
  2. Единственное время, когда защита только для чтения снимается – это после загрузки компьютера.
  3. Теоретически, значения можно изменить, но единственный раз, когда я когда-либо видел, чтобы их обновляли, это с помощью инструментов, таких как efivars, и версий grub.
  4. Хотя вышеуказанные инструменты могут получить доступ к EFI значениям для изменения, таких как порядок загрузки, я никогда не видел, чтобы кто-либо использовал эти инструменты для доступа и изменения GOP или Протокола графического вывода.
  5. Как видно из ссылки в 4, Графический порт закодирован в оболочке UEFI. Преимущество этого заключается в том, что это убирает зависимость от аппаратного обеспечения для создания вывода на дисплей, как указано в этом PDF.

Что дальше

Поскольку GOP доступен только в среде до загрузки, разрешение должно быть установлено в среде до загрузки, то есть в оболочке UEFI, которую OP, похоже, уже использовал:

@eyoung100 Я смог полностью отключить CSM в UEFI, а затем в grub2 я увидел около шести новых режимов для GOP! Один из них был моим режимом с полным разрешением! Он работал отлично. Я загрузился в правильном режиме с /dev/fb0, предоставленным efi-framebuffer.0.

Таким образом, я предоставляю метод создания оболочки UEFI для будущих читателей. Этот метод можно использовать для выполнения скриптов оболочки (для настройки загрузки ПК), установки разрешений, восстановления поврежденных параметров загрузки и многого другого, без какой-либо ОС. Я мог бы описать их здесь, но ради краткости следуйте шагам 1-7 на: KilianKegel/Howto-create-a-UEFI-Shell-Boot-Drive.
– Обратите внимание, что вы можете заменить шаг 3 на более стабильную версию, скачав файл shell.efi со страницы выпусков EDK2.

Определение доступных разрешений

  1. Загрузитесь с нового созданного USB-накопителя.
  2. После завершения startup.nsh, введите на приглашении gop mode.
  3. Появится список, отображающий 3 колонки и строку, которая будет отмечена звездочкой**.
    • Начальная колонка слева – это номер выбора
    • Вторая колонка – это количество символов в колонке на экране
    • Третья колонка – это количество строк на экране
  4. Используйте gop set x, где x – это номер, соответствующий вашему выбранному выбору***.
  5. Перезагрузитесь, чтобы сохранить выбор***.

Примечания:
** Я полагаю, что первый выбор – это 80x25, что, если я правильно помню, соответствует разрешению 640x480.
*** Для выбора желаемого результата может понадобиться несколько перезагрузок и set.

Теперь, когда мое разрешение установлено

Как отметил OP через комментарий выше, убедитесь, что при использовании полностью UEFI-ориентированной системы CSM полностью отключен. CSM был введен для эмуляции BIOS-ориентированных систем до полного принятия протокола UEFI.

  • Одной из таких эмуляций был VBIOS в графических картах. Пока ОС не взяла на себя процесс загрузки, протокол VGA BIOS инструктировал карту загрузиться в видеорежим не выше 1024×768. После того как ОС взяла на себя управление, драйвер переключался на режим, установленный через настройки ОС, т.е. драйвер, который вы скачали у производителя вашей графической карты или у другого OEM типа PNY.

В случае моего вопроса и ответа, чтобы полностью отключить CSM, мне пришлось включить поддержку WHQL для Windows 8.1/10, чтобы все мои ОС могли видеть NVIDIA GeForce 1070 с поддержкой GOP в моей системе, даже несмотря на то, что FreeBSD не нуждается в подписи драйвера Windows. Я позволю OP прокомментировать, как им удалось найти 6 дополнительных разрешений ниже, так как я потратил около часа, просматривая снимки экрана удивительно распространенной Aptio Setup Utility, прежде чем начал писать этот ответ, и не смог найти письменную процедуру.

Теперь мы на уровне ядра

…Однако возникла еще одна новая проблема, вероятно, вызванная отключением CSM. Я могу читать/писать в /dev/fb0, и он отображается корректно. Но если я запускаю Xorg, он отказывается обнаружить моё устройство framebuffer, независимо от того, что я делаю с файлом конфигурации (или полного его отсутствия). Он говорит “Экран не найден” после нескольких попыток вызвать fbdevhw.

Теперь OP необходимо использовать менеджер пакетов своей ОС (он никогда не указывал ОС, но я предполагаю, что это основанная на Debian), и выполнить команду:

sudo apt nvidia-driver

для установки последней поддерживаемой версии проприетарного двоичного драйвера, который будет 470.xx.xx. В этот загрузку/установку должен входить инструмент nvidia-xconfig. Если его нет, попробуйте:

sudo apt nvidia-xconfig

Этот инструмент создаст файл xorg.conf, который затем можно модифицировать вручную. К сожалению, из-за проприетарного драйвера автоматическое определение в X.Org попытается установить драйвер nv, который хуже, чем драйвер nouveau, а драйвер nouveau не предоставляет 3D-ускорения.

Добавление этого на основе комментариев ниже

Я понимаю, что OP хочет запускать X.Org на устройстве fbdev. Причина, по которой я ответил на этот пост так, как я это сделал (советую OP использовать либо проприетарный драйвер NVIDIA, либо драйвер nouveau), заключается в том, что разработчики NVIDIA отказываются создавать код, позволяющий их графическим картам “присоединяться” к драйверам ядра fbdev или fbcon, как подтверждено ответом напрямую от разработчика еще в 2016 году. Обратите внимание, что версия драйвера здесь не имеет значения, потому что, как я указал в своих комментариях ниже:

С появлением UEFI возможность использовать модуль ядра uvesa и передавать vga=xxx в строке команд ядра исчезла.

Это было подтверждено ответом birdie. Сообщество пользователей жаловалось на эту проблему задолго до этого поста и многократно просило NVIDIA выпустить драйвер с открытым исходным кодом, который сообщество могло бы дорабатывать, но поскольку NVIDIA является коммерческой компанией, я не вижу, чтобы это произошло в ближайшее время.

Обновление

NVIDIA выпустила свои графические модули для сообщества с открытым исходным кодом. См. Открытые драйверы GPU от NVIDIA.

Ответ или решение

Проблема низкого разрешения в раннем загрузочном фреймбуфере EFI/VGA и GRUB

При загрузке Linux-машины с использованием UEFI и grub2 может возникнуть проблема с низким разрешением в начальном экране. Часто пользователи сталкиваются с тем, что доступные графические режимы ограничены, например, в 800×600, в то время как разрешение их монитора составляет 1920×1080. Это приводит к ухудшению качества изображения при загрузке и работе с командной строкой.

Причины проблемы

  1. Ограниченные графические режимы: Существует мнение, что режимы, доступные в EFI/UEFI (и, следовательно, в GRUB), зависят от возможностей графического адаптера и его режима VESA. Это верно — если графический адаптер не поддерживает определенные разрешения в режиме GOP (Graphics Output Protocol), пользователи не смогут их использовать непосредственно при загрузке.

  2. Неправильные настройки UEFI: Некоторые параметры системы могут быть неправильно настроены, что также может ограничивать доступные графические режимы. Например, включение CSN (Compatibility Support Module) может привести к использованию устаревших BIOS-режимов, где поддерживаемое разрешение ограничено 1024×768.

Возможные решения

1. Отключение CSM

  • Безопасный режим UEFI: Убедитесь, что режим CSM отключен. Это может привести к доступности дополнительных режимов GOP. Если CSM активирован, графический адаптер может работать в режиме, ограниченном BIOS, что не позволит вам использовать высокое разрешение. Ваши действия:
    • Зайдите в настройки UEFI (обычно это делается путем нажатия клавиши при запуске, например, Del или F2).
    • Найдите параметр CSM и отключите его.
    • Также рекомендую включить поддержку WHQL (Windows Hardware Quality Labs), чтобы обеспечить максимальную совместимость с драйверами.

2. Установка UEFI Shell

  • Создание загрузочной флешки с UEFI Shell: UEFI Shell позволяет вам управлять параметрами загрузчика и графическими режимами до старта операционной системы. Вам нужно:
    • Создать загрузочную флешку с UEFI Shell, следуя инструкциям, в том числе скачать соответствующий shell.efi файл из EDK2 Releases Page.
    • Загрузить систему с этой флешки и использовать команду gop mode для просмотра доступных графических разрешений.
    • Используйте команду gop set x, чтобы установить нужное разрешение.

3. Доступные разрешения

  • После выполнения вышеперечисленных шагов запустите систему и проверьте доступные режимы разрешения:
    • Запустите UEFI Shell и используйте команды для получения списка режимов и установки нужного.

Это должно обеспечить разрешение, совместимое с вашим монитором, начиная с момента загрузки GRUB.

Примечания

  • Помните, что изменения в GOP могут сохраняться в NVRAM, и вам может понадобиться несколько раз перезагрузить систему или использовать дополнительные команды для применения изменений.
  • Учтите, что при использовании конкретного графического устройства, например NVIDIA, могут быть дополнительные сложности с поддержкой framebuffer’ов. Простое использование драйвера может не решить проблемы отображения. Если разрешение не устанавливается, может потребоваться установка проприетарных драйверов NVIDIA, что не будет вашим первоначальным предпочтением.

Заключение

Настройка разрешения в EFI/VGA на этапе загрузки может быть непростой задачей, однако с помощью правильных шагов вы сможете адаптировать параметры вашего устройства под свои нужды. Важно помнить о необходимости отключения оберточного режима CSM и использования UEFI Shell для изменения режима графического вывода. Это позволит использовать разрешение экрана в полном объеме и улучшить качество отображения на стадии загрузки системы.

Данная информация будет полезна как для новичков, так и для более опытных пользователей, желающих оптимизировать процесс загрузки их Linux-системы.

Оцените материал
Добавить комментарий

Капча загружается...