将 Nvidia gpu 列入 qemu/kvm 直通的黑名单

将 Nvidia gpu 列入 qemu/kvm 直通的黑名单

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

我有一个集成的英特尔 GPU(我将用它作为主机)和一个 Nvidia GTX980(我想用它作为虚拟机)。我使用 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)

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

pci_stub ids=10de:13c0,10de:0fbb

然后我重新加载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

如您所见,音频和视频均未被 stub 声明。

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

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci-stub.ids=10de:13c0,10de:0fbb"

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

有人知道这可能是什么原因造成的吗?

答案1

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

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

01:00.0 VGA 兼容控制器 [0300]:NVIDIA Corporation 设备 [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 抓取了我的 VGA 设备 02:00.0,我想将其用于我的虚拟机,因此我将其列入黑名单:

sudo nano /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/驱动程序/nouveau
│ │ 0000:01:00.0 -> ../../../../设备/pci0000:00/0000:00:03.0/0000:01:00.0
│ │ 0000:02:00.0 -> ../../../../设备/pci0000:00/0000:00:05.0/0000:02:00.0
│ │ 绑定
│ │ 模块 -> ../../../../module/drm
│ │ 新_id
│ │ 删除id
│ │ 事件
└── 解除绑定

我们看到 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 设备 [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 模块。

答案2

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

此后,我将卡绑定到 vfio-pci 就没有任何问题了。

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

#!/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

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

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

modprobe nvidia nvidia_modeset nvidia_drm nvidia_uvm

希望这可以帮助。

答案3

使用 grub 配置停用 nvidia/nuveau。

有可能通过module_blacklist=<module1>[,<module2>] (文档)通过 grub2 命令行向内核发出指令。我能够通过以下附加操作停用 nuveau 和 nvidia 驱动程序GRUB_CMDLINE_LINUX_DEFAULT/etc/default/grub不要忘记发出sudo update-grub):

module_blacklist=nvidia,nvidia_uvm,nvidia_drm,nvidia_modeset,nouveau

还可以为每个内核自动生成带有或不带有此选项的 grub 条目:https://unix.stackexchange.com/questions/24670/choose-at-grub-menu-whether-nvidia-driver-should-be-used(第一个答案)。但结果比想象的要麻烦。ubuntu grub 配置非常复杂。在修改之前,请务必进行备份。

如果您想使用功能强大的 NVIDIA 卡在虚拟机中使用 VGA Passthrough 进行游戏,同时又可以选择将其用于深度学习,那么此功能尤其有用tensorflow。只需重新启动即可在两者之间切换。

答案4

您的音频已被 stub 声明

[    2.029637] pci-stub 0000:01:00.1: claimed by stub

视频不是。我遇到了同样的问题,我已经将 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-stub

相关内容