最近零零散散大概花了一个多月时间研究有关虚拟化的问题,主要是希望复用一台高性能的主机。尝试了ESXi,解决了非官方网卡问题,还是最终有关机紫屏PSOD,放弃,最终选择了PVE(KVM based)的方案。基本使用没有问题,不禁感慨linux的kernerl真的强大,kvm 承载windows居然如此顺滑,也感谢rehat等一系列厂商的优化。
虚拟化当中最有趣的是直通,也就是虚拟机直接连接pci总线;目前可以实现控制器、pci外置设备以及pci总线上面的内置设备的直通,主要依赖vfio这个magic。有关gpu的直通着重写一点:
(update1: windows 的VM安装完后第一件事一定是安装virtIO的驱动,redhat提供的各种驱动你都可以装上! 可以避免很多问题)
(update3: 不要使用chrome连接pve控制台。novnc永远连不上。)
v卡gpu直通有两种方案:
pci直通和vGPU共享,前者和普通的pci直通没什么区别,正确设置参数就好,而且在efi模式下也不存在vga仲裁的问题,host端的驱动被blacklist就可以(另外提一句,grub的command line可以支持把所有的vfio和black参数都写进去,可以不需要修改文件)。VGA模式下可能在BIOS里面特殊设置,一般保持默认即可。
linux的VM一般完美驱动,windows系列的主机部分会有driver的lock,有相关的patch可以解锁非专业卡的直通,或者将kvm的特征隐藏起来。google上面很多相关内容。
vGPU共享需要购买nvidia的授权和专用驱动,个人很少使用,没有研究。
i卡gou直通非常复杂,原因和intel自己的产品思路以及作为内置显卡和bios耦合太紧密导致的。直通有N种方案,包括民间的官方的各种尝试。总结起来是:官方对于gpu加速支持的很好,推荐GVT-g,完美支持3d加速。民间对于视频直出需求很多,目前看来只有BIOS+VGA+GVT-d以及UEFI+modeified OVMF+IGD ROM+GVT-d方式有可能实现,但基本上很难实现外接显示器和虚拟显卡共存,(vnc远程桌面可以,但是基于虚拟显卡的不行,比如spice),而且这些限制是由于intel的windows驱动+VBIOS导致的,硬件上其实没有限制!
主要的方案有以下几种:
GVT-d:pci直通,优点是可以视频输出,并且相对支持较好。缺点是设置很复杂,需要绕过很多限制。一致的成功案例有 案例1 案例2 , 这两个思路非常清晰,分别是BIOS和UEFI模式下的,很多点也讲的很清楚。但貌似intel的windows驱动有限制,有可能无法正常使用,在ubuntu下一直可以正常使用,windows下面我自己尝试无果。
有具体分为BIOS下面和UEFI下面。前者需要解决的麻烦是VGA仲裁,需要保证bios正确处理了内外置显卡、grub veasfb和efifb和nomodset选项、VGA驱动、等等复杂的问题。在这个非常全面的直通资料里面有部分章节讲到。后者的麻烦是VBIOS和GOP驱动,需要提到到VM的OVMF里面,以保证启动命令可以发给显卡,需要写手工活处理UEFI的固件。具体详见案例2
(update2:有关vga的问题,目前有限的参数包括vfio里面的disable-vga, qemu里面的x-vga=on, igd-opregion grub里面的vesafb, efifb,以及bios里面的主显卡选择)
GVT-g:这种方式是官方支持的,可以多个VM共享3d计算能力,具体可以google,默认设置即可驱动起来。
总结:目前放弃使用IGD(集成显卡)输出VM的内容;使用其作为HOST的shell monitor;另外购买亮机显卡,直通给不同的VM做显示,基本上也可以满足工作站的需要。至于HTPC用户可能要自行研发了。
不知道要对intel说些什么好。
EOF