Gentoo NVIDIA驱动

x11-drivers/nvidia-drivers 是NVIDIA闭源显卡驱动,另一个开源替代驱动是 nouveau 。为了能够更好发挥硬件性能,以及 NVIDIA CUDA 用于 Machine Learning Atlas ,可以安装NVIDIA官方驱动。

x11-drivers/nvidia-drivers 包含了一些包装功能,提供了两部分: 内核模块以及X11驱动。

硬件兼容性

x11-drivers/nvidia-drivers 实际上是一系列驱动,需要根据显卡硬件类型进行区分,特别是古早的NVIDIA显卡,不能安装过于新型的驱动。我的笔记本 MacBook Pro 15” Late 2013 使用的是 NVIDIA GeForce GT 750M, 2GB显存(GDDR5) 显卡。在 MacBook Pro上运行Arch Linux 实践中已经验证,只能安装NVIDIA官方提供的 nvidia-470xx-dkms ,所以在Gentoo中,也必须选择 470.161.03 版本。

  • 创建一个 /etc/portage/package.mask/nvidia 配置,内容如下:

    >x11-drivers/nvidia-drivers-510
    

这里会屏蔽 510.108.03 及以上版本,所以 emerge 安装就会自动选择 470.161.03 版本。

安装

emerge --ask x11-drivers/nvidia-drivers

内核

NVIDIA内核驱动需要针对当前内核进行模块编译,所以内核必须支持内核模块加载功能,而且还需要完成特定的 Gentoo内核编译 支持,否则会在安装NVIDIA驱动时提示报错。

使用 genkernel all 就会配置所有必要支持选项。如果有问题,则检查确保以下选项开启:

内核支持NVIDIA配置
# 支持模块加载
[*] Enable loadable module support --->

# 支持MTTR
Processor type and features --->
   [*] MTRR (Memory Type Range Register) support

# 支持VGA仲裁(Arbitration)
Device Drivers --->
   PCI support --->
      [*] VGA Arbitration

# 支持IPMI消息处理
Device Drivers --->
   Character devices --->
      [*] IPMI top-level message handler

# 对于AGP显卡,需要激活支持
Device Drivers --->
   Graphics support --->
      -*- /dev/agpgart (AGP Support) --->

# 注意对于x86和AMD64,内核 framebuffer 驱动和NVIDIA提供的二进制驱动冲突,所以需要从内核中移除支持
Device Drivers --->
    Graphics support --->
        Frame buffer Devices --->
            <*> Support for frame buffer devices --->
            < >   nVidia Framebuffer Support
            < >   nVidia Riva support

# 确保nouveau驱动被禁止
Device Drivers  --->
    Graphics support  --->
        < > Nouveau (nVidia) cards

# 需要framebuffer驱动来渲染Linux console(TTY),这个功能nvidia驱动不提供,所以需要标记 VGA/VBE/EFI FB作为通用系统framebuffer
Bus options (PCI etc.)  --->
   [*] Mark VGA/VBE/EFI FB as generic system framebuffer
Device Drivers --->
   Graphics support --->
      Frame buffer Devices -->
         <*> Support for frame buffer devices -->
            < > Simple framebuffer support   # 这项激活才能看到Device Drivers中的Firmware Drivers配置

# 一定要关闭simple framebuffer,因为 nvidia-driver 提供了模块会产生冲突
Device Drivers --->
   Firmware Drivers  --->
      [ ] Mark VGA/VBE/EFI FB as generic system framebuffer
   Graphics support --->
      < > Simple framebuffer support

备注

如果没有定制 Gentoo内核编译 ,则直接安装 x11-drivers/nvidia-drivers 会出现冲突错误而失败

这里执行 make modules_install 有一个提示:

depmod: WARNING: /lib/modules/6.1.12-gentoo-xcloud/video/nvidia-modeset.ko needs unknown symbol acpi_video_backlight_use_native

安装 nvidia-drivers

  • 安装 nvidia-drivers 私有驱动:

安装NVIDIA驱动
echo ">x11-drivers/nvidia-drivers-510" > /etc/portage/package.mask/nvidia
emerge --ask x11-drivers/nvidia-drivers

备注

每次内核重新编译,则需要重新做一次 nvidia-drivers 私有驱动安装

检查:

# lsmod | grep nvidia
nvidia_drm             61440  0
nvidia_modeset       1150976  1 nvidia_drm
nvidia              34840576  1 nvidia_modeset
drm_kms_helper        159744  1 nvidia_drm
drm                   499712  4 drm_kms_helper,nvidia,nvidia_drm

问题排查

重启后字符终端黑屏

Gentoo内核编译(MacBook Pro Late 2013) 我遇到一个奇怪的问题,就是重启系统后完全黑屏,没有任何输出。但是 MacBook Pro 15” Late 2013 的Gentoo Linux 正常启动的,能够ssh远程登陆。并且 lsmod | grep nvidia 证明已经正确加载内核模块,说明 nvidia-drivers 安装正确。

参考 Gentoo: NVIDIA/nvidia-drivers 提示:

The “Mark VGA/VBE/EFI FB as generic system framebuffer” option moved in kernel 5.15 with a new symbol name for all arches. This may cause a black screen or no progress shown after the loader on boot if changes are not made.

也就是说在内核中必须激活 simgple framebuffer ,否则重启系统会出现黑屏无法显示启动进度,也不能显示终端界面。注意,内核 5.15 之前和之后的simple framebuffer配置选项采用了不同的符号名,配置方法略有不同。

我检查了我的 make menuconfig 配置,对于目前Gentoo 6.1.12 内核,默认 Simple framebuffer driver 是模块化编译。但是,我尝试将 Simple framebuffer driver 编译进内核,启动以后确实可以显示,但是却带来的花屏,见下文。

后来在处理 “字符终端花屏” 的NVIDIA提示,感觉是之前误激活了 CONFIG_DRM_SIMPLEDRM 导致的,还有一种可能就是没有配置任何framebuffer,但是同时又没有安装 nvidia-drivers (提供了framebuffer驱动模块)

字符终端花屏

我在上文中将 Simple framebuffer driver build-in,重启确实有屏幕输出,但是字符终端开始正常显示到登陆界面,但是输入交互时候就发现不对劲: 反馈的文字全部花屏

想到刚才遇到的安装提示:

* Detected potential configuration issues with used kernel:
*   CONFIG_DRM_SIMPLEDRM: is builtin (=y), and may conflict with NVIDIA
*     (i.e. blanks when X/wayland starts, and tty loses display).
*     For prebuilt kernels, unfortunately no known good workarounds.
*   CONFIG_SYSFB_SIMPLEFB: is set, this may prevent FB_EFI or FB_VESA
*     from providing a working tty console display (ignore if unused).
错误激活 simple framebuffer ,NVIDIA驱动安装后会提示冲突
# **错误** 激活simple framebuffer,会导致NVIDIA编译提示错误,并且花屏
Device Drivers --->
   Firmware Drivers  --->
      [*] Mark VGA/VBE/EFI FB as generic system framebuffer   # CONFIG_SYSFB_SIMPLEFB 和NVIDIA冲突
   Graphics support --->
      <*> Simple framebuffer support #  CONFIG_DRM_SIMPLEDRM 和NVIDIA冲突  / 这个选项要求 "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)" 联动(同时编译为build-in或module)

去除上述冲突选项之后,编译安装 nvidia-drivers 确实不再提示冲突,但是花屏问题还没有解决。

参考