KVM,PCI直通,Looking Glass和所有功能

在成功过渡到Linux软件开发人员之后,此刻开始了一些工作,同时也更改了主要的OS。 担心是由支持现有项目的necro-platform软件引起的。 该软件的一部分通过wine进行工作。 但是,事实证明某些软件拒绝在Wine下工作。 决定在QEMU + KVM虚拟机上运行软件。 该软件开始运行,但是运行起来很不方便。 软件虚拟视频卡的性能没有差异,并且3D图形支持非常有限。 我不得不揭开手鼓,寻找出路。

将单独的视频卡分配给来宾系统!


并没有花很长时间找到一条出路,但是用探照灯打铃鼓的想法却很奇怪。 关于将视频卡转发到虚拟机的主题,Internet上充斥着各种时间和各种硬件的指令。 在Arch Linux网站[0]上,有何大文章。 我将提供转发视频卡的简要说明。

0.检查硬件是否支持IOMMU


例如,这里[1]

1.我们在内核中包括对IOMMU的支持。


猫/ etc /默认/ grub
GRUB_CMDLINE_LINUX_DEFAULT =“安静的飞溅amd_iommu =开”

GRUB_CMDLINE_LINUX_DEFAULT =“安静的飞溅intel_iommu =开”


不要忘记sudo update-grub

2.我们从驱动程序中选择视频卡


我们搜索必要的设备,然后查看哪些驱动程序在使用它们。

lspci -nnk
04:00.0 VGA兼容控制器[0300]:NVIDIA Corporation GT218 [GeForce 210] [ 10de:0a65 ](rev a2)
使用的内核驱动程序: nouveau
内核模块:nvidiafb,nouveau
04:00.1音频设备[0403]:NVIDIA Corporation高清晰度音频控制器[ 10de:0be3 ](rev a1)
正在使用的内核驱动程序: snd_hda_intel
内核模块:snd_hda_intel


添加VFIO模块,以便在引导时加载它们。

猫/等/模块| grep vfio
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd


我们配置VFIO模块,使其能够拦截设备,从而防止加载主驱动程序。 如有必要,将主驱动程序添加到黑名单中。

猫/etc/modprobe.d/vfio.conf
选项vfio-pci ids = 10de:0a65,10de:0be3
黑名单


3.重新启动并检查是否一切正常


IOMMU已打开。

dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
DMAR:用于定向I / O的英特尔®虚拟化技术

AMD-Vi:在0000:00:00.2 cap 0x40处找到IOMMU
AMD-Vi:启用了中断重新映射
AMD-Vi:启用了惰性IO / TLB刷新


复合设备归为一组。

对于in / sys / kernel / iommu_groups / *; 确实找到$ a -type l; 完成| 排序--version-sort
/sys/kernel/iommu_groups/15/devices/0000:01:00.0
/sys/kernel/iommu_groups/15/devices/0000:01:00.1
/sys/kernel/iommu_groups/16/devices/0000:02:00.0
/sys/kernel/iommu_groups/17/devices/0000:03:00.0
/sys/kernel/iommu_groups/18/devices/0000:04:00.0
/sys/kernel/iommu_groups/18/devices/0000:04:00.1


已加载KVM和VFIO驱动程序。

lsmod | grep -e kvm -e vfio
 kvm_amd 94208 0
 ccp 90112 1 kvm_amd
 kvm 622592 1 kvm_amd
 vfio_pci 45056 0
 vfio_virqfd 16384 1 vfio_pci
 irqbypass 16384 2 vfio_pci,kvm
 vfio_iommu_type1 24576 0
 vfio 28672 2 vfio_iommu_type1,vfio_pci


VFIO捕获的来宾操作系统的视频卡。

lspci -nnk
04:00.0 VGA兼容控制器[0300]:NVIDIA Corporation GT218 [GeForce 210] [ 10de:0a65 ](rev a2)
使用的内核驱动程序: vfio-pci
内核模块:nvidiafb,nouveau
04:00.1音频设备[0403]:NVIDIA Corporation高清晰度音频控制器[ 10de:0be3 ](rev a1)
使用的内核驱动程序: vfio-pci
内核模块:snd_hda_intel


4.配置QEMU并启动来宾操作系统


安装(如果尚未安装)
sudo apt安装qemu-kvm qemu-utils seabios ovmf virt-viewer

创建将在其中安装来宾操作系统的磁盘
qemu-img创建-f原始-o预分配=完整guest.img 50G

fallocate -l 50G guest.img

我们启动虚拟机时不会转发视频卡来安装来宾操作系统。 由于可以看到Looking Glass,因此对于宾客而言,值得选择Windows10。还支持根据最新数据的Windows 8 / 8.1。

vga_qxl.sh
#!/ bin / bash
远程查看器香料://127.0.0.1:5900&
须藤qemu-system-x86_64 \
机器q35,加速= kvm \
-启用-kvm \
-cpu主机,kvm = off,检查\
-smp cpus = 2,套接字= 1,核心= 2,线程= 1 \
-m 6G \
-rtc base =当地时间,clock =主机\
设备piix3-usb-uhci \
-设备USB平板电脑\
-drive if = pflash,格式= raw,只读,file = / usr / share / OVMF / OVMF_CODE.fd \
-drive文件='w10.iso',如果= ide,格式=原始,索引= 2,媒体= cdrom,缓存=无\
-drive文件='virtio-win-0.1.141_st.iso',如果= ide,格式=原始,索引= 3,介质= cdrom,缓存=无\
-drive文件='guest.img',如果= ide,格式=原始,索引= 4,媒体=磁盘,缓存=写回\
-vga qxl \
-spice端口= 5900,地址= 127.0.0.1,禁用票务\
-monitor stdio \
-netdev用户,id = n1,ipv6 =关闭,smb =“ /媒体/用户/数据” \
设备e1000,netdev = n1,mac = 67:77:78:88:89:99 \
“ $ @”

5.我们将视频卡转发到来宾操作系统


首先,使用两个视频卡启动。 我们认为转发的卡已出现在系统中,将驱动程序放在系统上,并确保它们能够正常工作。

vga_qxl_pass.sh
#!/ bin / bash
远程查看器香料://127.0.0.1:5900&
须藤qemu-system-x86_64 \
机器q35,加速= kvm \
-启用-kvm \
-cpu主机,kvm = off,检查\
-smp cpus = 2,套接字= 1,核心= 2,线程= 1 \
-m 6G \
-rtc base =当地时间,clock =主机\
设备piix3-usb-uhci \
-设备USB平板电脑\
-drive if = pflash,格式= raw,只读,file = / usr / share / OVMF / OVMF_CODE.fd \
-drive文件='virtio-win-0.1.141_st.iso',如果= ide,格式=原始,索引= 3,介质= cdrom,缓存=无\
-drive文件='guest.img',如果= ide,格式=原始,索引= 4,媒体=磁盘,缓存=写回\
-vga qxl \
-spice端口= 5900,地址= 127.0.0.1,禁用票务\
设备ioh3420,总线= pcie.0,addr = 1c.0,多功能=开启,端口= 1,机箱= 1,id =根\
-device vfio-pci,主机= 04:00.0,总线=根,addr = 00.0,多功能=在\
-device vfio-pci,主机= 04:00.1,总线=根,addr = 00.1 \
-monitor stdio \
-netdev用户,id = n1,ipv6 =关闭,smb =“ /媒体/用户/数据” \
设备e1000,netdev = n1,mac = 67:77:78:88:89:99 \
“ $ @”

在转发的视频卡如何工作之后,并在设备管理器中写入“设备运行正常”,我们仅使用转发的视频卡启动虚拟机。

vga_pass.sh
#!/ bin / bash
须藤qemu-system-x86_64 \
机器q35,加速= kvm \
-启用-kvm \
-cpu主机,kvm = off,检查\
-smp cpus = 2,套接字= 1,核心= 2,线程= 1 \
-m 6G \
-rtc base =当地时间,clock =主机\
设备piix3-usb-uhci \
-设备USB平板电脑\
-drive if = pflash,格式= raw,只读,file = / usr / share / OVMF / OVMF_CODE.fd \
-drive文件='virtio-win-0.1.141_st.iso',如果= ide,格式=原始,索引= 3,介质= cdrom,缓存=无\
-drive文件='guest.img',如果= ide,格式=原始,索引= 4,媒体=磁盘,缓存=写回\
-vga none \
设备ioh3420,总线= pcie.0,addr = 1c.0,多功能=开启,端口= 1,机箱= 1,id =根\
-device vfio-pci,主机= 04:00.0,总线=根,addr = 00.0,多功能=在\
-device vfio-pci,主机= 04:00.1,总线=根,addr = 00.1 \
-monitor stdio \
-netdev用户,id = n1,ipv6 =关闭,smb =“ /媒体/用户/数据” \
设备e1000,netdev = n1,mac = 67:77:78:88:89:99 \
“ $ @”

我们将监视器连接到它,并欣赏客户机OS的桌面映像。

简单的决定结束的地方


然后乐趣就开始了。 有人,一切都很好,图片已经消失了,一切都很简单。 在缺乏形象的阶段,我的经历跌跌撞撞了两次。 第一次是转发Intel 6700T HD 530处理器的集成图形卡,视频输出为空,故障归因于插件运行不正常的事实。 第二次外部Nvidia GF210被扔掉了,这是专门为实验而购买的。 结果更加有趣。 在非EFI模式下,视频卡成功转发,甚至显示了图片,但是关闭了来宾OS触发失败

随后的转发可能只是使主机挂起。 几个小时的简单谷歌搜索导致冻结视频卡的问题非常普遍。 这将导致虚拟机的错误关闭,甚至可能导致正确的关闭。 作为输出,建议以EFI模式转发。 但是VBIOS Nvidia GF210不支持EFI ...

缝或不缝,这是问题


不要缝。 转发视频卡时,QEMU支持VBIOS欺骗。 但是仍然必须教导VBIOS支持EFI模式。 通常,建议在开始转发视频卡之前先进行检查,例如此处[2] 。 但是必须处理什么,并且不想寻找具有EFI支持的新视频卡。 因此,您需要修补VBIOS。 使用VBIOS执行的所有操作均需自担风险。 我从这里[3]使用了一个软件包及其说明。 读取VBIOS之后,我们得到文件gt210.rom ,patch,在输出处有gt210_uefi.rom 。 加载虚拟机时,您需要在此处滑动视频卡。

vga_pass_rom.sh
#!/ bin / bash
须藤qemu-system-x86_64 \
机器q35,加速= kvm \
-启用-kvm \
-cpu主机,kvm = off,检查\
-smp cpus = 2,套接字= 1,核心= 2,线程= 1 \
-m 6G \
-rtc base =当地时间,clock =主机\
设备piix3-usb-uhci \
-设备USB平板电脑\
-drive if = pflash,格式= raw,只读,file = / usr / share / OVMF / OVMF_CODE.fd \
-drive文件='virtio-win-0.1.141_st.iso',如果= ide,格式=原始,索引= 3,介质= cdrom,缓存=无\
-drive文件='guest.img',如果= ide,格式=原始,索引= 4,媒体=磁盘,缓存=写回\
-vga none \
设备ioh3420,总线= pcie.0,addr = 1c.0,多功能=开启,端口= 1,机箱= 1,id =根\
-device vfio-pci,主机= 04:00.0,总线=根,addr = 00.0,多功能=开启, romfile = gt210_uefi.rom \
-device vfio-pci,主机= 04:00.1,总线=根,addr = 00.1 \
-monitor stdio \
-netdev用户,id = n1,ipv6 =关闭,smb =“ /媒体/用户/数据” \
设备e1000,netdev = n1,mac = 67:77:78:88:89:99 \
“ $ @”

我们启动虚拟机并查看。

黑暗度


视频卡的输出在黑暗中闪烁。 道德再次通过了失败的考验。 首先想到的是,来宾操作系统在启动时崩溃。 日志,我需要她的日志。 为此,请运行vga_qxl.sh 。 我们看一下以前的发布。 那里一切都很好,除了食物被拉得很厉害。 事实证明,尽管不起作用,但它仍然有效。 第一个想法是通过RDP连接并查看在那里发生了什么,但是使用VNC仍然更好,例如,tightvnc [4] 。 我们安装VNC,配置端口5600然后转发此端口以供主机访问。

vga_vnc_pass_rom.sh
#!/ bin / bash
须藤qemu-system-x86_64 \
机器q35,加速= kvm \
-启用-kvm \
-cpu主机,kvm = off,检查\
-smp cpus = 2,套接字= 1,核心= 2,线程= 1 \
-m 6G \
-rtc base =当地时间,clock =主机\
设备piix3-usb-uhci \
-设备USB平板电脑\
-drive if = pflash,格式= raw,只读,file = / usr / share / OVMF / OVMF_CODE.fd \
-drive文件='virtio-win-0.1.141_st.iso',如果= ide,格式=原始,索引= 3,介质= cdrom,缓存=无\
-drive文件='guest.img',如果= ide,格式=原始,索引= 4,媒体=磁盘,缓存=写回\
-vga none \
设备ioh3420,总线= pcie.0,addr = 1c.0,多功能=开启,端口= 1,机箱= 1,id =根\
-device vfio-pci,主机= 04:00.0,总线=根,addr = 00.0,多功能=开启,romfile = gt210_uefi.rom \
-device vfio-pci,主机= 04:00.1,总线=根,addr = 00.1 \
-monitor stdio \
-netdev用户,id = n1, hostfwd = tcp:127.0.0.1:5600-:5600, ipv6 =关闭,smb =“ /媒体/用户/数据” \
设备e1000,netdev = n1,mac = 67:77:78:88:89:99 \
“ $ @”

我们连接并看到正在运行的机器,只有监视器具有一个奇怪的通用非即插即用监视器(通用监视器不是PnP)。 有图片,因此您可以尝试运行Looking Glass。

窥镜


尽管此技术使用OpenGL,但gl之后不需要任何空间。 但是您需要阅读项目网站上的说明[5] 。 对于来宾OS,下载屏幕捕获应用程序looking-glass-host.exe [6] ,下载并安装Microsoft Visual C ++ 2015 Redistributable [7] ,下载IVSHMEM设备的驱动程序[8] 。 对于主机,我们添加依赖项,下载并构建客户端应用程序。

build_looking_glass_a12.sh
#!/ bin / bash
sudo apt-get install cmake libsdl2-dev libsdl2-ttf-dev nettle-dev libspice-protocol-dev libfontconfig1-dev libx11-dev fonts-freefont-ttf libconfig-dev
wget github.com/gnif/LookingGlass/archive/a12.tar.gz
tar -xf a12.tar.gz
cd LookingGlass-a12
mkdir客户端/构建
cd客户端/构建
cmake ../
使

我们使用IVSHMEM设备启动虚拟机。 选择32Mb的内存大小,分辨率为1920x1080。

vga_vnc_lg_pass_rom.sh
#!/ bin / bash
如果[! -f / dev / shm /眼镜]; 然后
触摸/开发/嘘/窥镜
chown`whoami`:kvm / dev / shm /镜子
chmod 660 /开发/ shm /镜面
科幻
须藤qemu-system-x86_64 \
机器q35,加速= kvm \
-启用-kvm \
-cpu主机,kvm = off,检查\
-smp cpus = 2,套接字= 1,核心= 2,线程= 1 \
-m 6G \
-rtc base =当地时间,clock =主机\
设备piix3-usb-uhci \
-设备USB平板电脑\
-drive if = pflash,格式= raw,只读,file = / usr / share / OVMF / OVMF_CODE.fd \
-drive文件='virtio-win-0.1.141_st.iso',如果= ide,格式=原始,索引= 3,介质= cdrom,缓存=无\
-drive文件='guest.img',如果= ide,格式=原始,索引= 4,媒体=磁盘,缓存=写回\
-vga none \
设备ioh3420,总线= pcie.0,addr = 1c.0,多功能=开启,端口= 1,机箱= 1,id =根\
-device vfio-pci,主机= 04:00.0,总线=根,addr = 00.0,多功能=开启,romfile = gt210_uefi.rom \
-device vfio-pci,主机= 04:00.1,总线=根,addr = 00.1 \
-device ivshmem-plain,memdev = ivshmem,总线= pcie.0 \
对象内存后端文件,id = ivshmem,share =开,mem-path = / dev / shm /窥镜,大小= 32M \
-monitor stdio \
-netdev用户,id = n1,hostfwd = tcp:127.0.0.1:5600-:5600,ipv6 =关闭,smb =“ /媒体/用户/数据” \
设备e1000,netdev = n1,mac = 67:77:78:88:89:99 \
“ $ @”

我们通过VNC连接,在IVSHMEM设备上安装驱动程序,也许会在“系统设备”中安装标准驱动程序。 我们开始看Looking-glass-host.exe 。 在主机上,运行./LookingGlass-a12/client/build/looking-glass-client

在此上,装有NVidia GF210的系统为我工作,然后按照相同的路线启动了Intel HD530。 屏幕分辨率有一个小问题,要更改为罕见的分辨率,例如2048x1152,我必须使用“自定义分辨率实用程序” [9]

另一个细微差别是,在将Looking-glass-host.exe应用程序添加到自动加载时,您需要配置自动用户登录,出于安全原因,来宾操作系统不允许捕获登录屏幕。

后记


如果您没有设置任务,而是在物理视频输出上获取图像,则此结果足以获得具有物理视频卡和响应控制的有效虚拟机。 从主机在单独的窗口或全屏中进行管理。 但是,有细微差别。

表现 。 虚拟化的开销资源(不是最高效的来宾OS)无法让您轻松地在较弱和中低端的硬件上工作。 它将需要至少6-8个内核的强大处理器,用于来宾操作系统的良好图形卡,16GB + RAM,每个操作系统至少8GB。 并用铃鼓跳舞以充分利用铁。
忍耐 。 如果它不能立即生效,那么您将不得不花费大量时间和时间。 搜索,阅读,尝试。 再次查看,阅读并重试。 我会留下一些我遇到的链接,也许会有更多有用的信息。 [10] [11] [12]

参考文献

注意,链接将在此窗口中打开。

0. https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF
1. https://zh.wikipedia.org/wiki/List_of_IOMMU-supporting_hardware
2. https://www.techpowerup.com/vgabios/
3. https://www.win-raid.com/t892f16-AMD-and-Nvidia-GOP-update-No-requests-DIY.html
4. https://www.tightvnc.com/download.php
5. https://looking-glass.hostfission.com/quickstart
6. https://github.com/gnif/LookingGlass/releases
7. https://www.microsoft.com/zh-cn/download/details.aspx?id=48145
8. https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/upstream-virtio/
9. https://www.monitortests.com/forum/Thread-Custom-Resolution-Utility-CRU
10. https://heiko-sieger.info/running-windows-10-on-linux-using-kvm-with-vga-passthrough
11. https://ycnrg.org/vga-passthrough-with-ovmf-vfio/
12. https://www.reddit.com/r/VFIO/comments/8h352p/guide_running_windows_via_qemukvm_and_intel_gvtg/

Source: https://habr.com/ru/post/zh-CN433878/


All Articles