pve-ubuntu22.04虚拟机直通GPU

NVIDIA 官方驱动和 Ubuntu 自带的 nouveau 驱动互斥。当 nouveau 先加载并控制了你的 RTX 2060 后,nvidia 模块就会因为设备已被占用而报 No such device``modprobe: ERROR: could not insert 'nvidia': No such device 这个报错,结合 lspci 能看到显卡,说明模块文件编译成功了,但加载时被底层驱动“抢了先”。

简单来说,DKMS 的作用是让 NVIDIA 驱动能在内核升级后自动重新编译,避免你每次系统更新后都面临“驱动失效、黑屏、手动重装”的麻烦。

没有 DKMS 会怎样?

NVIDIA 驱动包含的核心部分叫做内核模块(如 nvidia.ko)。它必须针对你正在运行的特定内核版本进行编译,才能加载运行。

  • 一次性编译:如果你直接安装预编译好的驱动包,它只适用于安装时的那一个内核版本。一旦系统更新内核,旧驱动模块就无法被新内核加载,图形界面可能会崩溃。
  • DKMS 的动态编译:DKMS 是一个框架,它把驱动源码放在系统里。当检测到新内核时,它会自动调用编译器,为新内核重新构建并安装这个模块。

为什么要装 linux-headers-$(uname -r)?

DKMS 本身只是个“调度员”,真正编译需要内核头文件(Headers)。这些文件包含了内核的接口定义,是编译任何内核模块的“图纸”。

你命令里的 linux-headers-$(uname -r) 精确匹配当前正在运行的内核版本,确保 DKMS 能构建出当前能立即加载的模块。如果只装通用的头文件包,可能因为版本不匹配导致编译失败。

虚拟机配置

1、屏蔽开源驱动

1
2
3
4
5
6
7
# 查看是否被驱动占用显卡
lsmod | grep nouveau
# 屏蔽开源驱动
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nvidia-nouveau.conf
echo "options nouveau modeset=0" | sudo tee -a /etc/modprobe.d/blacklist-nvidia-nouveau.conf
sudo update-initramfs -u
sudo reboot

2、安装驱动

1
2
sudo apt install -y dkms linux-headers-$(uname -r)
sudo apt install -y nvidia-dkms-580-server nvidia-utils-580-server

效果