nVidia显卡

x11-drivers/nvdia-drivers是nVidia图形卡的显卡驱动,对应的开源替代是nouveau

x11-drivers/nvdia-drivers是由nVidia公司发布的针对Linux内核的可编译源代码。但是,其中包含了一个和显卡通讯的二进制包。驱动包括2部分,一部分是内核模块,另一部分则是一个X11驱动。这两个部分都包含在一个软件包中。由于nVidia已经打包了他们的驱动,所以在安装驱动之前要坐一些选择。

x11-drivers/nvidia-drivers软件包中包含了所有从nVidia提供了支持所有显卡的驱动。

内核

nVidia内核驱动会构建针对内核的模块nvidia.ko,其中包含了称为binary blob的二进制驱动显卡芯片的包,以及一个开源的glue部分作为和内核结合的部分。由于内核的每次发布更爱了内部的驱动ABI,也就意味着所有使用这些ABI的驱动也要相应修改。对于开源驱动,特别是随着内核分发的驱动,这个更改是近乎次要的,因为整个驱动到内核其他部分链路的调用得到了代码审核。但是对于nvidia.ko,则不能同时完成。一旦ABI修改,就不能修正glue,因为没有人知道其他部分是如何使用glue的,所以用户在新的没有支持的内核运行nvidia.ko就有丢失数据和硬件损坏的风险。

所以新内核发布后,最好暂时先停留在旧版本内核一段时间,等Nvidia发布新的驱动,可能需要几周时间。

  • 内核配置

[*] Enable loadable module support --->
Processor type and features --->
   [*] MTRR (Memory Type Range Register) support
Device Drivers --->
   Graphics support --->
      -*- /dev/agpgart (AGP Support) --->

对于AGP显卡,需要支持AGP的模块编译,称为NvAGP,不过将AGP编译成模块或直接编译到内核中,都有可能带来性能降低或提升,所以你可能需要都尝试一下。如果不能确定,则使用in-kernel AGP。

注意:对于x86和AMD64处理器,内核framebuffer驱动和nVdia提供的二进制驱动冲突,所以如果针对这些CPU,则要移除内核支持如下

Device Drivers --->
    Graphics support --->
        Frame buffer Devices --->
            <*> Support for frame buffer devices --->
            < >   nVidia Framebuffer Support
            < >   nVidia Riva support

确保没有使用nouveau开源驱动

Device Drivers  --->
    Graphics support  --->
        <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
            < > Nouveau (nVidia) cards

对于UEFI系统,uvesafb不能工作,如果激活CONFIG_FB_EFI=y会导致nvdia驱动初始化问题。

nvdia-drivers的ebuild可以自动检测到/usr/src/linux软链接指向的内核版本,所以如果有多个内核,可以通过eselect来选择正确版本。

配置

确保按照X Server Configuration Guide手册并在/etc/portage/make.conf设置VIDEO_CARDS="nvidia"。这样安装X Server的时候就会正确安装x11-drivers/nvidia-drivers

如果在/etc/portage/make.conf设置了gtk,就会安装media-video/nvidia-settings,一个图形化监控和配置nVidia显卡的程序。

注意,每次编译内核,都需要重新安装nVidia内核模块,也就是再次emerge x11-drivers/nvidia-drivers

Kernel module signing(可选)

如果使用了secure boot kernel signing,则需要在加载Nvidia内核模块之前对其签名:

perl /usr/src/linux/scripts/sign-file sha512 /usr/src/linux/signing_key.priv /usr/src/linux/signing_key.x509 /lib/modules/Kernel-Version-modules-path/video/nvidia-uvm.ko

perl /usr/src/linux/scripts/sign-file sha512 /usr/src/linux/signing_key.priv /usr/src/linux/signing_key.x509 /lib/modules/Kernel-Version-modules-path/video/nvidia.ko
```cd 

对于驱动版本`358.09`新的模块处理显示模式设置,这个模块也需要签名

```bash
perl /usr/src/linux/scripts/sign-file sha512 /usr/src/linux/signing_key.priv /usr/src/linux/signing_key.x509 /lib/modules/Kernel-Version-modules-path/video/nvidia-modeset.ko

X server

一旦安装好相应的驱动,就要配置X server使用nvdia驱动来代替默认的nv驱动:/etc/X11/xorg.conf.d/nvidia.conf

Section "Device"
   Identifier  "nvidia"
   Driver      "nvidia"
EndSection

运行eselect确保X server使用nVidia GLX库

eselect opengl set nvidia

激活全局nvidia支持

一些工具,如media-video/mplayermedia-lib/xine-lib使用一个本地USE flag称为xvmc来激活XvMCNVIDIA支持,对于高分辨率的电影有用。所以建议添加xvmc到USE变量/etc/portage/make.conf。此外有些程序也使用nvidia这个USE flag,也建议添加。

修改USE flag后,应该使用emerge -uD --newuse @world确保配置生效重新编译必要软件包。

使用nVidia设置工具

nVidia提供了一个设置工具,可以无需重启X server来使用监视器和修改显示设置,这个软件包就是media-video/nvidia-settings,注意需要使用gtk的USE flag。

激活OpenGL/OpenCL

eselect opengl set nvidia
eselect opencl set nvidia

使用

测试显卡

glxinfo | grep direct

应该显示

direct rendering: Yes

可以使用x11-apps/mesa-progs软件包提供的glxinfo检查,以及运行glxgears检查FPS

问题排查

  • 编译时候报有关"drm"错误

depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_plane_destroy_state
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_kms_helper_poll_fini
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_kms_helper_poll_disable
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_kms_helper_poll_init
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_disable_plane
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_cleanup_planes
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_helper_hpd_irq_event
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_crtc_destroy_state
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_connector_dpms
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_check
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_connector_destroy_state
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_plane_duplicate_state
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_plane_reset
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_prepare_planes
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_helper_mode_fill_fb_struct
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_set_config
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_connector_duplicate_state
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_crtc_reset
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_kms_helper_hotplug_event
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_swap_state
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_page_flip
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_connector_reset
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_crtc_duplicate_state
depmod: WARNING: /lib/modules/4.5.0-gentoo-r1-x/video/nvidia-drm.ko needs unknown symbol drm_atomic_helper_update_plane

参考 Unable to load kernel module for 364.12 要支持DRM_KMS_HELPER,在内核编译选择时至少要选择一个显卡,以便能够激活显卡需要的DRM_KMS_HELPER。注意,不要编译nouveau模块,例如可以选择 Intel显卡编译成模块这样旧可以自动具备DMA_KMS_HELPER

  • 启动时候显示启动参数后就没有响应,而以前使用开源nouveau驱动此时会切换字符终端的显示分辨率并启动

参考 [Apple Macbook Pro Retina 15-inch (early 2013)](https://wiki.gentoo.org/wiki/Apple_Macbook_Pro_Retina_15-inch_(early_2013))

  • 在内核参数中需要添加nomodeset

  • 使用命令nvidia-xconfignvidia-settings来创建xorg.conf

如果使用开源驱动,建议同时编译配置Intel和Nouveau显卡驱动,即使你只准备使用其中之一。因为同时安装这两个驱动就可以使用vga_switcheroo来切换,并且可以通过关闭其中之一来节电。切换方法参考 vga_switcheroo

参考 vga_switcheroo

可以使用Hprofile在Intel和Nouveau之间无缝切换,但是如果使用Nvidia闭源驱动,则要重启(kernel 3.14之后的内核)

要使用内核 3.9 和 nvidia-drivers-319.17 ,最新的内核或显卡版本似乎不能工作,并且要在内核参数设置nomodeset

参考

Last updated