跳转到主要内容
x

Ubuntu Linux下的NVIDIA显卡驱动及相关问题

通常在Ubuntu Linux系统安装之后,会自动启用开源NVIDIA驱动进行桌面环境图形渲染。不过,开源NVDIA驱动还是有较多问题。启用官方闭源驱动成为一种迫不得已的选择。不过,闭源驱动安装过程确实比较折腾。总的来说,会经历以下相应的过程和步骤:

1. 系统显卡设备查询

查询NVIDIA设备:

ls /dev/nvidia*

检查显卡参数:

lshw -numeric -C display

上面的命令可以获得如下的相关信息:

WARNING: you should run this program as super-user.
  *-display                 
       description: VGA compatible controller
       product: G94GL [Quadro FX 1800] [10DE:638]
       vendor: NVIDIA Corporation [10DE]
       physical id: 0
       bus info: pci@0000:04:00.0
       version: a1
       width: 64 bits
       clock: 33MHz
       capabilities: vga_controller bus_master cap_list rom
       configuration: driver=nvidia latency=0
       resources: irq:88 memory:fa000000-faffffff memory:e0000000-efffffff memory:f8000000-f9ffffff ioport:e000(size=128) memory:c0000-dffff
WARNING: output may be incomplete or inaccurate, you should run this program as super-user.

当然,我们也可以采用下面的命令进行查询:

lspci | grep VGA

上述命令可输出这样的结果信息:04:00.0 VGA compatible controller: NVIDIA Corporation G94GL [Quadro FX 1800] (rev a1)。可见,当前采用的是兼容NVIDIA驱动。

或者采用命令:

lspci | grep NVIDIA

上述命令可输出这样的结果信息:04:00.0 VGA compatible controller: NVIDIA Corporation G94GL [Quadro FX 1800] (rev a1)

查看nouveau驱动加载情况:

lsmod | grep nouveau

若返回有信息,标明系统使用了nouveau驱动。

2. NVIDIA开源兼容驱动Nouveau

NVIDIA开源驱动始于Nouveau。这是一个由社区开发人员经过逆向工程获得相关接口数据后所编写的程序。由于NVIDIA公司一直坚持闭源策略,社区Nouveau驱动无法完全利用其接口规范进行高性能图形驱动程序编写。Nouveau驱动基本上很难正常使用,性能十分低下。而且,有时还无缘无故系统重启,打断Linux下的工作。

Ubuntu/Debian Linux等系统一直采用xserver-xorg-video-nvidia、xserver-xorg-video-nouveau、libdrm-nouveau2:i386、libdrm-nouveau2等驱动程序包来提供图形系统渲染。由于Ubuntu/Debian Linux仓库中提供的NVIDIA开源驱动版本较低,问题更加严重,因此有必要低版本驱动,转而使用更高版本的NDVIDIA开源驱动

sudo apt-get purge xserver-xorg-video-nvidia xserver-xorg-video-nouveau libdrm-nouveau2:i386 libdrm-nouveau2

3. 采用Ubuntu驱动管理工具来探测和安装最合适的开源或闭源高版本驱动(Ubuntu标准软件仓库自动化安装)

ubuntu-drivers list

该命令用于显示,当前系统采用的驱动程序版本。

ubuntu-drivers devices

该命令用于输出推荐系统安装的驱动程序:

driver   : nvidia-340 - distro non-free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin

可见,该工具默认推荐两种驱动:nvidia-340(闭源)或xserver-xorg-video-nouveau(开源)。

ubuntu-drivers list-oem

该命令用于品牌制造商推荐使用的驱动程序。

sudo ubuntu-drivers autoinstall

该命令用于Ubuntu软件仓库中自动推荐安装的驱动程序nvidia-340。当然,我们可以使用如下命令还指定安装驱动程序版本:

sudo apt install nvidia-340

当然,Ubuntu还提供了software-properties-gtk额外驱动图形界面安装工具(Additional Drivers),它的界面如下:

software-properties-gtk

使用这个工具进行驱动切换,其实与上面的ubuntu-drivers autoinstall功能是等效的。采用这种方式,不需要手动去设置/etc/modprobe.d/blacklist.conf配置。因为安装过程,会自动将nouveau加入该文件的黑名单列表中。在这点上,与在Deepin 15.11或者Deepin 20系统中使用deepin-graphics-driver-manager来使用“bumblebee”(大黄蜂)驱动切换是一致的。

bumblebee驱动切换在具体操作过程中,会首先建立一个开源驱动黑名单(/etc/modprobe.d/bumblebee.conf),屏蔽来自Ubuntu/Debian Linux仓库所提供的开源NVIDIA驱动版本,然后再下载专有驱动文件进行安装切换,具体可查看这个页面

4. 基于PPA仓库安装最新NVIDIA闭源驱动

Ubuntu仓库提供的340显然需要升级了。为此,我们可如下进行操作:

首先,我们需要添加相应的仓库地址并更新软件仓库列表:

sudo add-apt-repository ppa:graphics-drivers/ppa

sudo apt-get update

进行该操作后,即可采用前面提及到的ubuntu-drivers和software-properties-gtk方式进行最新驱动程序安装。

不过,Ubuntu仓库所使用的NVIDIA闭源驱动版本始终是慢一步的。如果要使用最新版本NVIDIA驱动,还需要参考下面的两种方式:

5. 安装NVIDIA官方闭源驱动

对于GPU高性能计算(如针对神经网络的cuda,图像人工智能的tensorflow),显卡驱动版本至少需要nvidia-driver 410以上。Ubuntu/Debian Linux仓库所提供的驱动版本,很显然无法满足需求。因此,安装NVIDIA官方驱动成为必要途径。

NVIDIA官方提供了相关型号的Linux驱动(455.38):https://cn.download.nvidia.cn/XFree86/Linux-x86_64/455.38/NVIDIA-Linux-x86_64-455.38.run

在安装NVIDIA官方驱动之前,还需要进行以下设置:

1)首先删除来自Ubuntu或PPA仓库的NVIDIA驱动程序

sudo apt-get remove –purge nvidia*

2)禁用BIOS中的安全启动(secure boot)

重启计算机,进入BIOS设置界面,将secure boo禁用(disable)

3)配置blacklist.conf文件,屏蔽nouveau开源兼容驱动模块的加载(其实可参考Deepin对显示卡处理的那个bumblebee.conf文件)

sudo nano /etc/modprobe.d/blacklist.conf

加入:

blacklist nouveau

然后按ctrl+x退出,再按y保存

4)更新内核,防止内核加载nouveau

sudo update-initramfs -u

5)停止当前系统图形显示服务器

sudo service lightdm stop

Xubuntu 20.04采用lightdm作为图形显示服务器加载其他相关图形驱动程序进行桌面环境渲染。要避免当前相关图形显示驱动对NVIDIA官方驱动程序安装的干扰,必须事先停止图形显示服务器。一旦完成下面的安装过程,可通过这个命令切换到图形系统:

sudo service lightdm start

当然,如果对Ubuntu Linux中的图形显示服务器不了解,可以参考这个页面Switch Display Manager in Ubuntu 20.04

6)将下载的NVIDIA安装包设置为可执行后进行安装安装

chmod a+x NVIDIA-Linux-x86_64-455.38.run

sudo sh ./NVIDIA-Linux-x86_64-455.38.run --no-opengl-files

–no-opengl-files 不安装OpenGL文件,防止循环登录(loop login)
–no-x-check 驱动安装时不检查X服务
–no-nouveau-check 驱动时安装不检查nouveau

7)安装后的相关配置和操作

7.1) 采用nvidia-smi测试

nvidia-smi主要用于显卡的管理和状态监控:

nvidia-smi

Thu Dec 17 17:39:13 2020       
+------------------------------------------------------+                       
| NVIDIA-SMI 340.108    Driver Version: 340.108        |                       
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro FX 1800      Off  | 0000:04:00.0     N/A |                  N/A |
| 30%   59C    P0    N/A /  N/A |    373MiB /   767MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Compute processes:                                               GPU Memory |
|  GPU       PID  Process name                                     Usage      |
|=============================================================================|
|    0            Not Supported                                               |
+-----------------------------------------------------------------------------+

如果出现nvidia_uvm未加载的情况,可如下排查:

lsmod | grep nvidia

同时,采用如下命令查找一下可能具有的驱动UVM位置:

sudo updatedb 

locate --regex nvidia.*uvm.ko

可能会输出这样的信息:

/usr/lib/modules/5.4.0-42-generic/updates/dkms/nvidia_uvm.ko
/usr/lib/modules/5.4.0-58-generic/updates/dkms/nvidia_uvm.ko

此时可进行加载加载,可手动加载:

sudo depmod /usr/lib/modules/5.4.0-58-generic/updates/dkms/nvidia_uvm.ko

sudo modprobe nvidia_uvm

采用nvidia-settings查看相关显卡设置

nvidia-settings

8) 更多其他资料

8.1)NVIDIA Persistence守护进程

Persistence只提供GPU外部客户端模拟(提供GPU外部工具连接、监视和控制),但并不将GPU用于任何其他工作。可以通过下面的命令来临时开启:

sudo nvidia-smi -pm 1

当然,也可以使之成为系统服务进行启用:

sudo systemctl enable nvidia-persistenced

如果出现这样错误:Failed to enable unit: Unit file nvidia-persistenced.service does not exist。该信息是表明在/lib/systemd/system/下缺少nvidia-persistenced.service配置文件。这个文件本来应该由nvidia-utils工具来创建(该工具同时会创建nvidia-persistenced用户组及相应的nvidia-persistenced密码):

sudo getent group nvidia-persistenced &>/dev/null || groupadd -g 143 nvidia-persistenced
sudo getent passwd nvidia-persistenced &>/dev/null || useradd -c 'NVIDIA Persistence Daemon' -u 143 -g nvidia-persistenced -d '/' -s /sbin/nologin nvidia-persistenced

不过,由于NVIDIA 340未提供这个工具,因此只好手动创建:

sudo nano /lib/systemd/system/nvidia-persistenced.service

代码如下:

[Unit]
Description=NVIDIA Persistence Daemon
Wants=syslog.target

[Service]
Type=forking
PIDFile=/var/run/nvidia-persistenced/nvidia-persistenced.pid
Restart=always
ExecStart=/usr/bin/nvidia-persistenced --verbose
ExecStopPost=/bin/rm -rf /var/run/nvidia persistenced

[Install]
WantedBy=multi-user.target

保存上述文件后,随即,执行命令重启所有系统服务:

sudo systemctl daemon-reload

此时,可通过下面的命令查看相应的nvidia Persistence服务信息:

systemctl list-units | grep nvidia

返回这样的信息可能是这样:

nvidia-persistenced.service
loaded active running
NVIDIA Persistence Daemon

开启nvidia-persistenced服务后,以后就可以随时对NVIDIA显卡信息进行读取。例如,可使用下面的命令来查看GPU的核心数(与查看CPU核心信息有异曲同工之妙):

nvidia-smi -L

当然,还可以查看更详细的信息:

nvidia-smi --query-gpu=index,name,uuid,serial --format=csv

显示显卡GPU时钟频率:

nvidia-smi -q -d SUPPORTED_CLOCKS

查看GPU运行速率:

nvidia-smi -q -d CLOCK

8.2)对于其他支持GPU计算的NVIDIA显卡,其实可以使用nvidia-modprobe来加载模块至内核中以及创建设备节点

sudo apt install nvidia-modprobe
nvidia-modprobe

8.3 可能的相关错误

(nvidia-settings:2236): GLib-GObject-CRITICAL **: 07:36:28.746: g_object_unref: assertion 'G_IS_OBJECT (object)' failed

8.4 显卡驱动与Linux内核问题

如果您使用的显卡只能适配nvidia-340这种驱动,那么这种NVIDIA显卡是没有什么GPU性能的。比如Quadro FX 1800这种类型的显卡,基本上只能适配linux-image-5.4.0-58-generic内核。而且,为了显示稳定性,最好将nvidia-340、nvidia-340-uvm、nvidia-opencl-icd-340等显卡驱动包重新安装与linux-image-5.4.0-58-generic、linux-image-generic-hwe-20.04(5.4.0-58)进行适配。否则,可能你在使用系统过程中会不时发生无故系统重启事件。