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卡没有被列入黑名单。
任何人都知道可能导致这种情况的原因是什么?
我遇到了和你一样的问题(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 存根
| 归档时间: |
|
| 查看次数: |
17832 次 |
| 最近记录: |