在具有 optimus 功能的笔记本电脑上通过 kvm/qemu 进行 vga-passthrough

在具有 optimus 功能的笔记本电脑上通过 kvm/qemu 进行 vga-passthrough

我有一台华硕 n550jv 笔记本电脑,其输出如下lspci -nn | grep "VGA|3D"

00:02.0 VGA compatible controller [0300]: Intel Corporation 4th Gen Core Processor Integrated Graphics Controller [8086:0416] (rev 06)
01:00.0 3D controller [0302]: NVIDIA Corporation GK107M [GeForce GT 750M] [10de:0fe4] (rev ff)

我想运行带有 vga-passthrough 的 Windows 8.1 VM,这样我就不必双重启动。我读到过你需要一张带有专用输出端口的卡,但我还没弄清楚为什么,而且论坛上有一些帖子表明它可能还可以工作。

我正在尝试用以下命令运行虚拟机:

qemu-system-x86_64 -enable-kvm -M q35 -m 4096 -cpu host \
-smp 4,sockets=1,cores=4,threads=2 \
-bios /usr/share/ovmf/OVMF.fd \
-usb -usbdevice tablet \
-soundhw hda \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,x-vga=on \
-drive file=/home/duke/windows.img,id=disk,format=raw -device ide-hd,bus=ide.0,drive=disk \
-drive file=/home/duke/Downloads/windows.iso,id=isocd -device ide-cd,bus=ide.1,drive=isocd \
-vga vmware \
-boot menu=on

我想使用 vga-passthrough 但我一直收到有关 x-vga 的错误:

qemu-system-x86_64: -device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,x-vga=on: vfio: Device does not support requested feature x-vga qemu-system-x86_64: -device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,x-vga=on: vfio: failed to get device 0000:01:00.0
qemu-system-x86_64: -device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,x-vga=on: Device initialization failed.
qemu-system-x86_64: -device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,x-vga=on: Device 'vfio-pci' could not be initialized

我在 arch vga-passthrough 线程上找到了此信息

这意味着 a) 您的内核不支持 CONFIG_VFIO_PCI_VGA 或 b) 该设备不是 VGA 设备。要测试 a):

$ grep CONFIG_VFIO_PCI_VGA / boot / config-uname -r

测试b):

$ lspci -s 2:00.0 | grep VGA

如果您有 Intel 主机显卡,您仍然需要 i915 内核补丁。如果您有 Radeon 主机显卡,您需要其他 VGA 仲裁器补丁。据我回忆,这两个补丁在最后几页中都有提及。

我得到CONFIG_VFIO_PCI_VGA=y了 (a)。在我的情况下 (b) 是lspci -s 1:00.0 | grep VGA并且它没有输出任何内容,因为我的 nvidia 卡被列为“3d 控制器”,所以我有疑问:

  1. i915 补丁或 ovmf 是否支持被列为 3d 控制器的 nvidia 卡?

    • 如果没有,有什么方法可以让 nivida 卡被识别为与 vga 兼容?
  2. 运行 ovmf 是否像设置一样简单-bios /usr/share/ovmf/OVMF.fd

  3. 为什么-vga=none需要 vga 分配?

    • 如果-vga=none确实需要,那么还有其他方法可以实际看到屏幕吗?例如,我可以将 nvidia 卡重定向到 hdmi 端口或让 nvidia 卡完全接管笔记本电脑屏幕吗?

我也遇到了 alsa/pulse 的错误,其中很多错误通常会随之而来

alsa: Could not initialize ADCk
alsa: Failed to open `default':
alsa: Reason: Connection refused
Home directory not accessible: Permission denied
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Connection refused

我知道这是因为 root 无法访问用户级脉冲,但我不想在系统级运行脉冲,有没有办法让 pulseaudio 工作而不需要在系统模式下启动它?如果没有,我无论如何都无法启用系统模式。有一个解释这里并且pulseaudio --system可以工作,但是我无法将任何客户端连接到脉冲服务器,我不断收到类似的错误ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Access denied

答案1

需要专用视频输出的原因是,主机操作系统当前无法访问分配给客户操作系统的卡的输出帧缓冲区。

VT-d 限制主机直接访问/内存映射图形内存。

通常情况下,修改后的驱动程序(Linux 上的 Nvidia Optimus 或 Bumblebee)会将 Nvidia 卡上运行的窗口的结果作为纹理显示给 Intel 显卡,然后将其混合到您的桌面环境中。

这需要修改两个显卡的驱动程序并进行通信/共享内存,据我所知,这在主机和客户操作系统之间是不可能的。

通过专用的输出端口,分配给虚拟机的卡可以完全不知道这种虚拟化胡言乱语,并且可以使用普通驱动程序在物理输出端口上显示输出,就像在裸机上运行时一样。

据我所知,专用输出端口仅适用于台式机或具有双显卡的联想 ThinkPad(后者将一些输出端口直接连接到 Nvidia,从而扰乱了 Linux 上的 Bumblebee 支持)。

答案2

我可能弄错了,但 KVM 目前不是只适用于独立显卡吗(GT 750M 是 Optimus 卡)?

参考:http://www.linux-kvm.org/wiki/images/b/b3/01x09b-VFIOandYou-small.pdf

答案3

您没有提到您需要做的一件事是:

进入 BIOS 并启用室性心动过速选项。需要 VT-d 将 PCI 设备直通到虚拟机

http://kmpic.asus.com/images/2014/12/29/6bd4ef8d-62a3-4b0c-9674-5a2b0fa53c79.jpg

(即使这不能解决问题,你仍然应该保持启用状态,因为它将部分解决方案。)

相关内容