kvm、pci 直通:无法为内核 5.4 及以上版本分离 nvidia 卡

kvm、pci 直通:无法为内核 5.4 及以上版本分离 nvidia 卡

通常,使用 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 模块列入黑名单。

答案3

请检查一下,有人用以下方法解决了它:

mkinitcipio -P linux-vfio and vfio kernel.

原始解决方案

相关内容