前期准备
我们需要去 NVIDIA 官网下载 LINUX 的驱动。下载地址
在宿主机安装 NVIDIA 驱动
首先将驱动文件上传到宿主机中,这里我已经上传好了。
root@pve:~# ls
NVIDIA-Linux-x86_64-440.82.run
然后我们更新一下系统。
apt-get update && apt-get dist-upgrade -y
然后我们安装一些驱动需要的依赖。
apt-get install sudo git gcc make pve-headers-$(uname -r) -y
然后我们运行驱动程序。
sh NVIDIA-Linux-x86_64-440.82.run
这里是提示我们,我们的电脑目前使用的 Nouveau 开源驱动,如果我们想安装 NVIDiA 驱动,我们需要关闭 Nouveau 开源驱动。
这里是提示我们,它会添加文件来帮我们关闭 Nouveau 开源驱动,这里我们选择关闭。
这里是告诉我们他添加了那些文件来关闭 Nouveau 开源驱动,如果我们想重新启动 Nouveau 开源驱动,我们需要删除那些文件。然后他告诉我们,如果想继续安装,需要重新启动。这里我们回车,他会自动退出驱动安装。然后我们重写启动一下系统,继续安装。
然后我们重启成功之后,再次启动驱动程序,如果显示下面的信息,就说明正在安装了。
这里是告诉我们 X config 的设置。
这里是让我们选择是否安装 32 位的库,这里我们选择否,如果你想安装,选择是也可以。
这里就告诉我们,我们的驱动已经安装完成了。我们回车就会自动退出驱动安装。
这时我们可以使用
nvidia-smi
来看下驱动是否安装成功。如果出现下面的信息,就是成功了。
nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.82 Driver Version: 440.82 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 860M Off | 00000000:01:00.0 Off | N/A |
| N/A 47C P0 N/A / N/A | 0MiB / 2004MiB | 1% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
注意
下面的操作是如果你要将设备共享到 docker 或者 LXC 当中需要进行的处理。
为什么要进行下面的操作
NVIDIA 的驱动是在有应用访问显卡的时候加载内核和设备的,但是我们用 docker 或者 LXC 访问宿主的显卡的话,驱动是不知道我们访问了显卡的,他就也不会自动加载内核和设备。所以我们下面需要做的就是,在系统启动的时候手动加载内核和设备,然后将设备共享给 docker 和 LXC,这样就可以正常使用驱动了。
首先我们需要添加两个启动时需要加载的内核模块。
nano /etc/modules-load.d/modules.conf
# /etc/modules-load.d/modules.conf
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
nvidia
nvidia_uvm
但是我们会发现虽然我们加载了驱动内核,但是还是没有加载驱动,这里我们就手动加一下设备。这里是说如果 nvidia 内核加载了,我们需要执行什么。Nvidia_uvm 内核加载了,我们需要执行什么。
nano /etc/udev/rules.d/70-nvidia.rules
# /etc/udev/rules.d/70-nvidia.rules
# Create /nvidia0, /dev/nvidia1 … and /nvidiactl when nvidia module is loaded
KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L'"
#
# Create the CUDA node when nvidia_uvm CUDA module is loaded
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u'"
上面我们虽然让系统可以在启动的时候加载驱动的内核模块和加载显卡设备,但是如果没有应用使用显卡的话,一段时间后,驱动程序会自动释放这些设备,所以我们就需要 nvidia-persistenced,驱动持久化软件。它会阻止驱动程序释放设备,但是需要我们手动运行,我们可以使用 NVIDIA 提供的一个脚本自动来安装一个 nvidia-persistenced 守护程序,这样我们就不需要自己手动添加自启动了。
git clone https://github.com/NVIDIA/nvidia-persistenced.git
cd nvidia-persistenced/init
然后我们执行安装。
./install.sh
如果提示下面的这些,就说明守护程序安装成功。
Adding user 'nvidia-persistenced' to group 'nvidia-persistenced'... done.
Installing sample systemd service nvidia-persistenced.service... done.
Enabling nvidia-persistenced.service... done.
Starting nvidia-persistenced.service... done.
systemd service successfully installed.
这里我们可以查询下守护程序是否成功,有一次我安装的时候,虽然守护程序安装成功了,但是服务没启动,我还以为安装出错了,折腾了一下午,才发现是守护程序被unmask, 然后手动 mask 就可以了。
systemctl status nvidia-persistenced
● nvidia-persistenced.service - NVIDIA Persistence Daemon
Loaded: loaded (/lib/systemd/system/nvidia-persistenced.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2020-06-21 20:51:55 CST; 56s ago
Process: 8335 ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced (code=exited, status=0/SUCCE
Main PID: 8338 (nvidia-persiste)
Tasks: 1 (limit: 4915)
Memory: 864.0K
CGroup: /system.slice/nvidia-persistenced.service
└─8338 /usr/bin/nvidia-persistenced --user nvidia-persistenced
这里我们可以看下驱动都加载成功没有,只要出现下面这五个设备,就说明安装成功了。
root@pve:~# ls -l /dev/nv*
crw-rw-rw- 1 root root 195, 0 Jun 21 20:54 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Jun 21 20:54 /dev/nvidiactl
crw-rw-rw- 1 root root 195, 254 Jun 21 20:54 /dev/nvidia-modeset
crw-rw-rw- 1 root root 236, 0 Jun 21 20:54 /dev/nvidia-uvm
crw-rw-rw- 1 root root 236, 1 Jun 21 20:54 /dev/nvidia-uvm-tools
到这里宿主机的部分就完成了然后就是 LXC 需要进行的设置。
这里允许的设备上面写的 195 和 236 是跟着上面进行不同的配置。我这里是 195 和 236,其他人可能就是 195 和 235,也有可能出现三个不同的,你就需要配三个设备允许规则。
nano /etc/pve/lxc/100.conf
lxc.cgroup.devices.allow: c 195:* rwm
lxc.cgroup.devices.allow: c 236:* rwm
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
LXC 系统操作
默认 LXC 安装的系统是不开启远程 root 登陆的,我们需要修改 ssh 配置文件,打开远程登陆。
nano /etc/ssh/sshd_config
开启下面三项设置。
PermitRootLogin yes
PwordAuthentication yes
PermitEmptyPasswords no
重启 ssh 服务。
systemctl restart sshd
查询一下 LXC 系统的 ip 地址
ip addr
将驱动上传到系统中,然后执行系统安装,这里需要注意,我们要加一个参数来跳过内核模块的安装,因为我们直接吧宿主机的设备映射进 LXC 中,就不需要在 LXC 中再次安装内核模块了。
sh NVIDIA-Linux-x86_64-440.82.run --no-kernel-module
然后我们安装结束后,可以看下安装成功没有。
nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.82 Driver Version: 440.82 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 860M Off | 00000000:01:00.0 Off | N/A |
| N/A 43C P8 N/A / N/A | 0MiB / 2004MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
看一下设备有没有正常加载。
ls -l /dev/nv*
crw-rw-rw- 1 nobody nogroup 195, 254 Jun 21 12:54 /dev/nvidia-modeset
crw-rw-rw- 1 nobody nogroup 236, 0 Jun 21 12:54 /dev/nvidia-uvm
crw-rw-rw- 1 nobody nogroup 236, 1 Jun 21 12:54 /dev/nvidia-uvm-tools
crw-rw-rw- 1 nobody nogroup 195, 0 Jun 21 12:54 /dev/nvidia0
crw-rw-rw- 1 nobody nogroup 195, 255 Jun 21 12:54 /dev/nvidiactl
这里我用 emby 测试一下是否映射成功,这里已经成功出现可以硬解的解码器,说明我们直通成功了。
本文由 makese 于2020年06月28日发表在 我的博客
如未特殊声明,本站所有文章均为原创;你可以在保留作者及原文地址的情况下转载
转载请注明:如何给PVE的LXC安装NVIDIA驱动 | 我的博客
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 236:* rwm
PVE 7以后,cgroup更新成了cgroup2
刚才去查了下,新版确实改成cgroup2了。因为换成unraid了,现在直接用docker了。
pve安装显卡驱动有点复杂
确实比较麻烦,而且有的时候更新pve的时候还容易丢驱动,相对来说还是用核显容易一些。