![kvm、pci 直通:无法为内核 5.4 及以上版本分离 nvidia 卡](https://linux22.com/image/921395/kvm%E3%80%81pci%20%E7%9B%B4%E9%80%9A%EF%BC%9A%E6%97%A0%E6%B3%95%E4%B8%BA%E5%86%85%E6%A0%B8%205.4%20%E5%8F%8A%E4%BB%A5%E4%B8%8A%E7%89%88%E6%9C%AC%E5%88%86%E7%A6%BB%20nvidia%20%E5%8D%A1.png)
通常,使用 pci 直通时,nvidia 驱动程序会被 vfio 驱动程序替换。在 /etc/modprobe.d/vfio.conf 中设置正确的选项即可实现这一点。从内核 5.4 开始,不会加载 vfio 驱动程序,而是加载本机 nvidia 驱动程序。我不想将 nvidia 驱动程序列入黑名单,因为我有 2 个 nvidia 卡。只有一个用于直通。内核 5.3.0-19 及以下版本没有问题。
将 vfio 驱动程序分配给新内核中的一张 nvidia 卡的正确方法是什么。
答案1
不知道您是否解决了这个问题,但在更新到 Kubuntu 20.04 和内核 5.4 后,我的 VFIO 配置也停止工作了。这个解决方案是我以前不需要做的,这里是我使用的解决方案的链接。如果将来链接坏了,我会在下面附上信息,以便人们可以找到它。
https://github.com/rmayobre/PopOs-VFIO-Tutorial/wiki/VFIO-Steps
步骤 1 - 安装所需软件
您将需要 QEMU、Virt-Manager 以及一些软件包。运行此行:
sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager ovmf
第 2 步 - 添加所需的内核参数
sudo kernelstub -a 'intel_iommu=on' sudo kernelstub -a 'iommu=pt' sudo kernelstub -a 'iommu=1' sudo kernelstub -a "pci=noaer" Add this if you have problems with your VM starting when a USB Controller is attached.
步骤 3 - 通过 ID 查找 PCI 设备
注意:请务必记下 ID(稍后您将需要它们)。GPU 和音频输出
运行命令:lspci -vnn 并搜索您希望传递到客户操作系统的 GPU。您的 GPU 的音频输出应位于其下方。您的输出应如下所示(当然,如果您使用的是 Radeon,则情况会有所不同):
09:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] [10de:1b82] (rev a1) (prog-if 00 [VGA
控制器])09:00.1 音频设备[0403]: NVIDIA Corporation GP104 高清晰度音频控制器[10de:10f0] (rev a1)
记住设备前面的数字(例如 09:00.0 和 09:00.1)。步骤 4 - 将 VFIO 驱动程序连接到 PCI 设备
我们需要将 VFIO 驱动程序绑定到我们的 GPU 以及 GPU 的音频控制器。为此,我们将创建一个脚本来帮助我们将 VFIO 驱动程序连接到指定的 PCI 设备。创建此文件:
sudo nano /etc/initramfs-tools/scripts/init-top/bind_vfio.sh
然后将此脚本粘贴到新创建的文件中:
#!/bin/sh PREREQS="" DEVS="0000:09:00.0 0000:09:00.1" for DEV in $DEVS; do echo "vfio-pci" > /sys/bus/pci/devices/$DEV/driver_override done modprobe -i vfio-pci
将 0000:09:00.0 和 0000:09:00.1 替换为您的 GPU 编号(注意:必须在编号开头附加 0000:)。将您的脚本添加到初始 RAM 磁盘
这可以通过使脚本可执行来实现:
sudo chmod 755 /etc/initramfs-tools/scripts/init-top/bind_vfio.sh
现在添加脚本:
sudo chown root:root /etc/initramfs-tools/scripts/init-top/bind_vfio.sh
最后,更新初始 RAM:
sudo update-initramfs -u
然后,您可以通过运行以下命令来验证初始 ramdisk 确实已准备好脚本(将 /boot/initrd.img-5.0.0-55-generic 替换为您的文件):
sudo lsinitramfs /boot/initrd.img-5.0.0-55-generic |grep vfio
现在我们必须将 vfio-pci 附加到此文件并保存:
sudo nano /etc/initramfs-tools/modules
再次运行:
sudo update-initramfs -u
重启系统。当系统上线后,运行以下命令:
lspci -nnv
你的 GPU 应该有内核驱动程序:vfio-pci(如此输出):
09:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] [10de:1b82] (rev a1) (prog-if 00 [VGA
控制器])子系统:微星国际有限公司[MSI] GP104 [GeForce GTX 1070 Ti] [1462:330f]标志:总线主控,快速设备,延迟0,IRQ 70,NUMA节点0内存在b0000000(32位,不可预取)[size=16M]内存在90000000(64位,可预取)[size=256M]内存在a0000000(64位,可预取)[size=32M] I/O端口在3000 [size=128]扩展ROM在b1000000 [已禁用] [size=512K]功能:正在使用的内核驱动程序:vfio-pci内核模块:nvidiafb,nouveau,nvidia_drm,nvidia
09:00.1 Audio device [0403]: NVIDIA Corporation GP104 High Definition Audio Controller [10de:10f0] (rev a1) Subsystem: Micro-Star International Co., Ltd. [MSI] GP104 High Definition Audio Controller [1462:330f] Flags: bus master, fast devsel, latency 0, IRQ 71, NUMA node 0 Memory at b1080000 (32-bit, non-prefetchable) [size=16K] Capabilities: <access denied> Kernel driver in use: vfio-pci Kernel modules: snd_hda_intel
步骤 5 - 完成
如果您已经完成了这一步,那么您已经完成了 VFIO 驱动程序的设置。现在您可以转到有关配置虚拟机和 Virt-Manager 的部分。第 5 页 VFIO 和 GPU 直通
Home Hardware Configurations VFIO Attachment Virtual Machine Configurations Windows 10 Install
本地克隆此 wiki
答案2
我已经按照以下方法解决了这个问题:我所要做的就是在 X11 启动之前重新分配 pci。阻止 pci 分配的是 X11,而不是 nvidia 驱动程序。我的 rc.local 中有以下内容:
/usr/bin/virsh nodedev-detach pci_0000_17_00_0
echo "vfio-pci" > "/sys/bus/pci/devices/0000:17:00.3/driver_override"
我最大的问题是“nvidia-gpu”模块,它不用于图形。它用于 pci 总线 17:00.3。我还必须将此内核模块列入黑名单。这并没有将图形 nvidia 模块列入黑名单。