在支持 optimus 的笔记本电脑上使用 kvm/qemu 进行 vga-passthrough

erp*_*erp 6 laptop qemu linux-kvm optimus nvidia-graphics-card

我有一台 asus 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)
Run Code Online (Sandbox Code Playgroud)

我想使用 vga-passthrough 运行 Windows 8.1 虚拟机,这样我就不必双启动了。我读到您需要一张带有专用输出端口的卡,但我还没有弄清楚原因,而且论坛上有一些帖子表明它可能还可以工作。

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

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
Run Code Online (Sandbox Code Playgroud)

我想使用 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
Run Code Online (Sandbox Code Playgroud)

我在 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 | VGA

如果你有 Intel 主机显卡,你的内核仍然需要 i915 补丁。如果您使用 Radeon 主机显卡,则需要其他 VGA 仲裁器补丁。这两个都在最后几页中被引用,IIRC。

我得到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
Run Code Online (Sandbox Code Playgroud)

我知道这是因为 root 无权访问用户级脉冲,但我不想在系统级运行脉冲,有没有办法让脉冲音频工作而不必在系统模式下启动它?如果没有,无论如何我都会遇到启用系统模式的问题。这里有一个解释这里pulseaudio --system工作,但我不能任何客户端连接到服务器的脉搏,我一直喜欢把自己的错误ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Access denied

小智 7

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

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

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

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

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

一个专用的输出端口,就我在野外遇到的而言,只在台式机或带有双显卡的联想 ThinkPad 上可用(后者将一些输出端口直接连接到 Nvidia,搞乱了 Linux 上的 Bumblebee 支持正在进行中)。