将用于 qemu/kvm passthrough 的 Nvidia gpu 列入黑名单

Mat*_*hyn 7 nvidia kvm qemu pci elementary

我试图在虚拟机中运行 Windows,同时让 VM 直接传递到 GPU 以获得更好的性能。

我有一个集成的英特尔 GPU(我将把这个用于主机)和一个 Nvidia GTX980(我想要这个用于 VM)。我使用 Elementary OS 0.3.2 Freya 64 位。

我已遵循指南,但现在卡在第 2 步。我无法将 Nvidia gpu 列入黑名单。

首先我做 lspci -nn | grep NVIDIA

这导致以下输出

01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:13c0] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:0fbb] (rev a1)
Run Code Online (Sandbox Code Playgroud)

接下来,我将此行添加到/etc/initramfs-tools/modules文件中。

pci_stub ids=10de:13c0,10de:0fbb
Run Code Online (Sandbox Code Playgroud)

然后我重新加载使用update-initramfs -u然后重新启动。

在我运行时重新启动后,dmesg | grep pci-stub我得到以下输出:

[    2.029626] pci-stub: add 10DE:13C0 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.029630] pci-stub: add 10DE:0FBB sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.029637] pci-stub 0000:01:00.1: claimed by stub
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,音频或视频都没有被存根声明。

我还尝试将此选项直接添加到 grub 文件中,etc/default/grub因此该GRUB_CMDLINE_LINUX_DEFAULT行如下所示:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci-stub.ids=10de:13c0,10de:0fbb"
Run Code Online (Sandbox Code Playgroud)

但这也导致Nvidia卡没有被列入黑名单。

任何人都知道可能导致这种情况的原因是什么?

Ale*_*nux 5

我遇到了和你一样的问题(Lubuntu 16.04)。这是由于驱动程序/模块在 pci-stub 能够执行此操作之前将设备绑定到它们。您在这里至少有两个选择:

第一个也是最简单的方法是将声称该设备的模块列入黑名单。 输入lspci -knn | grep VGA -A 5以查看所有 VGA pci 设备及其设备编号和内核模块。

01:00.0 VGA 兼容控制器 [0300]: NVIDIA Corporation Device [10de:128b] (rev a1)
    子系统:微星国际有限公司 [MSI] 设备 [1462:8c93]
    正在使用的内核驱动程序:nouveau
    内核模块:nvidiafb、nouveau
01:00.1 音频设备 [0403]:NVIDIA Corporation GK208 HDMI/DP 音频控制器 [10de:0e0f] (rev a1)
    子系统:微星国际有限公司 [MSI] GK208 HDMI/DP 音频控制器 [1462:8c93]
——
02:00.0 VGA 兼容控制器 [0300]: NVIDIA Corporation GM204 [GeForce GTX 970] [10de:13c2] (rev a1)
    子系统:ZOTAC International (MCO) Ltd. GM204 [GeForce GTX 970] [19da:1366]
    正在使用的内核驱动程序:nouveau
    内核模块:nvidiafb、nouveau
02:00.1 音频设备 [0403]: NVIDIA Corporation GM204 高清晰度音频控制器 [10de:0fbb] (rev a1)
    子系统:ZOTAC International (MCO) Ltd. GM204 高清音频控制器 [19da:1366]

现在您需要检查正在使用的驱动程序。例如,nouveau 抓取了我想用于我的 VM 的 VGA 设备 02:00.0,所以我将该设备列入黑名单:

须藤纳米 /etc/modprobe.d/blacklist.conf blacklist nouveau

你已经完成了。

就我而言,这会导致问题,因为我安装了两个 nVidia VGA(01:00.0 和 02:00.0),它们都使用相同的驱动程序运行。就我而言,我不会将驱动程序列入黑名单。

从我的 02:00.0 VGA 卡上手动取消绑定nouveau,因为我想将该卡用于我的 VM-guest,而 01:00.0 VGA 用于我的 Linux 主机。感谢本指南,我发现了如何做到这一点:https : //lwn.net/Articles/143397/

输入sudo tree /sys/bus/pci/drivers/nouveau. 将 nouveau 与占用您设备的任何模块交换。

您应该收到如下列表:

/sys/bus/pci/drivers/nouveau
???0000:01:00.0 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:01:00.0
???0000:02:00.0 -> ../../../../devices/pci0000:00/0000:00:05.0/0000:02:00.0
???绑定
???模块 -> ../../../../module/drm
???new_id
???remove_id
???事件
???解绑

我们看到 driver nouveau 必须绑定到设备:0000:01:00.0 和 0000:02:00.0

要解除绑定和绑定我的图形卡,我首先需要关闭 lightdm.service。因此,例如,我使用 CTRL+ALT+F2 在桌面环境之外打开控制台。以 root 身份登录并输入systemctl stop lightdm.service

现在我可以解除模块与显卡的绑定:

echo -n "0000:02:00.0" > /sys/bus/pci/drivers/nouveau/unbind

并将其绑定到我想要的任何模块(pci-stub 或 vfio-pci)。我使用了 vfio-pci。

echo -n "0000:02:00.0" > /sys/bus/pci/drivers/vfio-pci/bind

之后,您可以再次启动桌面管理器: systemctl start lightdm.service

如果一切正常,您应该通过lspci -knn | grep VGA -A 5再次查找发现您的设备已绑定到您指定的模块。

01:00.0 VGA 兼容控制器 [0300]: NVIDIA Corporation Device [10de:128b] (rev a1)
    子系统:微星国际有限公司 [MSI] 设备 [1462:8c93]
    正在使用的内核驱动程序:nouveau
    内核模块:nvidiafb、nouveau
01:00.1 音频设备 [0403]:NVIDIA Corporation GK208 HDMI/DP 音频控制器 [10de:0e0f] (rev a1)
    子系统:微星国际有限公司 [MSI] GK208 HDMI/DP 音频控制器 [1462:8c93]
——
02:00.0 VGA 兼容控制器 [0300]: NVIDIA Corporation GM204 [GeForce GTX 970] [10de:13c2] (rev a1)
    子系统:ZOTAC International (MCO) Ltd. GM204 [GeForce GTX 970] [19da:1366]
    正在使用的内核驱动程序:vfio-pci
    内核模块:nvidiafb、nouveau
02:00.1 音频设备 [0403]: NVIDIA Corporation GM204 高清晰度音频控制器 [10de:0fbb] (rev a1)
    子系统:ZOTAC International (MCO) Ltd. GM204 高清音频控制器 [19da:1366]

不幸的是,此解决方法在重新启动后失效。然而我没有找到如何让它持久化。也许其他人可以给我一个提示。我猜想像开始脚本这样的东西是可能的。但是最好能够将设备绑定到特定模块而不必先解除绑定。想象一下,有一天我想使用 nvidia 驱动程序。在这种情况下,从 nouveau 解除绑定将毫无用处,因为显卡将绑定到 nvidia 模块。


小智 3

我也在设置 qemu-kvm 直通,我遇到了和你一样的问题。我使用集成英特尔显卡作为主 GPU,因此我打开了 nvidia 设置并禁用了混合显卡,因此不会使用 nvidia 卡:(图片相关)

之后我将卡绑定到 vfio-pci 就没有问题了。

nvidia 模块可能会以某种方式在启动 qemu 时给您带来麻烦,或者您没有关闭混合显卡的选项。如果是这种情况,您也可以尝试我所做的,并使用类似这样的脚本从控制台模式手动禁用 nvidia 模块 (CTRL+ALT+F1):

#!/bin/bash
sudo service lightdm stop
sudo rmmod nvidia_uvm
sudo rmmod nvidia_drm
sudo rmmod nvidia_modeset
sudo rmmod nvidia
sudo service lightdm start
Run Code Online (Sandbox Code Playgroud)

这会停止显示管理器(在我的例子中是 lightdm),按顺序禁用 nvidia 模块,然后重新启动显示管理器。确保在控制台模式下启动它,因为从桌面运行它很可能会在第一行之后中断脚本。

当您重新启动时,nvidia 模块将自动再次加载,但您也可以使用以下命令再次手动加载它们:

modprobe nvidia nvidia_modeset nvidia_drm nvidia_uvm
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


小智 0

您的音频已被存根认领

[    2.029637] pci-stub 0000:01:00.1: claimed by stub
Run Code Online (Sandbox Code Playgroud)

视频不是。我有同样的问题,我已将 Nvidia 和/或 Nouveau 列入黑名单。我使用的是 Ubuntu 服务器 15.10,所以不完全相同,但我有同样的问题。我已经在互联网上搜索了几个星期,但一无所获。

编辑终于修复了它,我在这里找到了它: https ://forum.level1techs.com/t/pci-stub-not-claming-secondary-graphics-card/88728

所以我将 Nvidia 和 Nouveau 模块列入黑名单并重新启动。希望能帮助到你

再次编辑:

我当前将 pci 卡绑定到内核 4.10.1-1 的 arch 上的 pci-stub 所采取的步骤。

我编辑 /etc/default/grub 看起来像这样 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pci-stub.ids=1002:6798,1002:679a,1002:aaa0,1106:3483"

然后我创建新的 grub 配置文件

$ sudo grub-mkconfig -o /boot/grub/grub.cfg

然后重新启动。

在 /etc/mkinitcpio.conf 中,我将 pci-stub 添加到模块中,使其看起来像: MODULES="pci-stub"

然后运行

$ sudo mkinitcpio -P

重建所有 initramfs 映像。然后重新启动。

然后这个命令只是为了确保它们已被 pci-grub 声明

$ dmesg | grep PCI 存根