Как известно, при работе с проприетарным драйвером nvidia-drivers , невозможно использовать фреймбуфер через nouveau или доступный в ядре фреймбуфер для NVIDIA, так как они конфликтуют с драйвером, который используется в X-сервере. Добиться работы фреймбуфера в консоли без костылей типа выгрузки nouveau перед запуском X-сервера можно только используя uvesafb .
Однако, подавляющее большинство инструкций описывают настройку uvesafb в сочетании с initrd, что бесполезно, если ядро собрано без его поддержки.
Само собой, необходимо выполнить все инструкции, которые необходимы для работы драйверов от NVIDIA без конфликтов:
- Включить поддержку модулей
[*] Enable loadable module support --->
- Включить MTRR
Processor type and features ---> [*] MTRR (Memory Type Range Register) supportProcessor type and features ---> [*] MTRR (Memory Type Range Register) support
- Отключить встроенные драйверы ядра для фреймбуфера на видеокартах NVIDIA
Device Drivers ---> Graphics support ---> Frame buffer Devices ---> <*> Support for frame buffer devices ---> < > nVidia Framebuffer Support < > nVidia Riva support
- Собрать DRM модулем или вовсе выключить его в ядре (NVIDIA использует свой DRM)
Device drivers ---> Graphics support ---> < > Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)
У меня при встроенном модуле DRM в dmesg можно было наблюдать ошибки и конфликт с драйвером nvidia , но как ни странно, в итоге всё работало. Когда я убрал модуль, вместе с ним пропали и ошибки.
Здесь путь с обычной инструкцией расходится, так как мы не используем initrd при загрузке. В ядре нужно включить поддержку uvesafb в виде модуля:
Device Drivers ---> <*> Connector - unified userspace <-> kernelspace linker ---> Graphics support ---> [*] Support for frame buffer devices ---> [*] Enable firmware EDID <M> Userspace VESA VGA graphics support [*] Simple framebuffer support
И собрать нужные для uvesafb пакеты:
emerge -aq v86d
Теперь прописываем загрузку модуля uvesafb с параметрами:
# ... modules="uvesafb" # ... module_uvesafb_args="mode_option=1920x1080-24 mtrr=2 scroll=ywrap"
Альтернативой module_uvesafb_args может быть создание конфига в /etc/modprobe.d/ c такими же параметрами:
options uvesafb mode_option=1920x1080-24 mtrr=2 scroll=ywrap
Здесь важно задать параметры, подходящие под вашу текущую конфигурацию системы:
- mode_option — разрешение и глубина цвета (также можно указать частоту обновления в виде 1920×1080-24@60 , но лучше оставить автоматическое значение)
- mtrr — доступный режим MTRR. Узнать, какие режимы доступны можно в файле /proc/mtrr. Таблица соответствия выглядит так:
0 - Disabled (equivalent to nomtrr) (default) 1 - Uncacheable 2 - Write-back 3 - Write-combining 4 - Write-through
- scroll — режим прокрутки. Типичное значение — ywrap. Посмотреть подробнее можно в документации.
Можно собирать ядро и устанавливать его. Если у вас используется отдельный раздел под /boot , то нужно сначала смонтировать его: mount /boot. Также, если были убраны какие-то модули, а версия ядра не менялась, не лишним может быть и удаление установленных в данный момент модулей из /lib64/modules/. Сделать это можно, например, так:
rm -rf /lib64/modules/`uname -r`
В /usr/src/linux выполняем:
make -j4 && make modules_install && make install
Теперь подправим конфиг GRUB2 (для GRUB первой версии настройки будут другими):
# ... GRUB_GFXMODE=1920x1080 # ... GRUB_GFXPAYLOAD_LINUX=keep
Кстати, здесь мы заодно и в GRUB2 выставили высокое разрешение первым параметром. Остаётся сгенерировать новый конфиг для GRUB2:
grub2-mkconfig -o /boot/grub/grub.cfg
Не стоит забывать и о том, что не лишним будет пересобрать драйвера — особенно, если изменилась версия ядра:
emerge -aq nvidia-drivers
Отмонтируем /boot и перезагружаемся, чтобы проверить.
Удачи!
Полезная информация: