首页 运维杂谈Intel显卡分配原理

Intel显卡分配原理

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

朋友们,感觉是时候说,Intel显卡设备(IGD)目前在qemu.git中可用了,而且将成为即将到来的QEMU2.7发行版本的一部分。source tree上已经有了相当详细的文档,大家可以看下。其中描述了两种模式,传统模式和通用直通(UPT)模式,两者各有利弊。哪种模式更适合你取决于你的硬件。

UPT模式只适用于boardwell和更新的处理器,而传统模式适用于SandyBridge及其之后的处理器。如果你的处理器比SandyBridge更老,别用了,它不会为你工作的。如果你不清楚这些陌生名字的意义,到Wikipedia和 Ark看看。

高层次的概括就是,传统模式很像我们支持的GeForce,IGD想要成为虚拟机中主要的、独占的显卡设备。而且,虚拟机中IGD地址必然在PCI 00:02.0,目前只有Seabios支持,以及只有440FX芯片组支持(不是Q35),IGD设备必须是主要的主机显卡设备,主机需要运行在v4.6或者更高版本的内核上。明确地分配主机的主显卡,有点和我们的GPU分配策略大相径庭。

但是我们依赖于运行IGD视频ROM,同样也就是依赖于VGA和强加大部分以上的需求(添加CONFIG_VFIO_PCI_VGA到需求列表)。我已经看到支持UEFI的IGD ROM,也就是为什么OVMF(开放虚拟机固件)没有支持,但可能在OVMF中会支持CSM(兼容性支持模块)和一些的额外代码。

传统模式工作在Linux和Windowns客户机(如果你愿意也可以是其他)。i915驱动深受通用视频驱动问题的困扰,也就是解绑和重新绑定IGD到驱动上的时候,有时整个系统会崩溃。我个人是将i915驱动列入黑名单来避免这种情况。当然一些人已经发现尝试用独立的GPU来完成,大量的驱动准备投入到设备中保持控制台工作。我见过的主要的驱动是vesafb和efifb,哪个用在你的系统上取决于你的主机防火墙设置,传统的BIOS还是UEFI。

关闭这些配置,只要简单添加video=vesafb:off或者video=efifb:off到内核命令行(不确定用哪个?两个都试一下吧,video=vesafb:off,efifb:off)。首先你要注意的是,当你用已经列入黑名单的i915驱动启动一个IGD系统,更多基础的帧缓存驱动关闭,就意味着在grub之后,你在显卡上得不到任何东西。为此,我使用一个串行控制台,或许你更喜欢盲目运行,寄希望于系统启动可以ssh远程登录。

如果你按照这个过程,可以在你的libvirt XML简单地创建一个<hostdev>,像这样:

<hostdev mode=’subsystem’ type=’pci’managed=’yes’>

<driver name=’vfio’/>

<source>

<address domain=’0x0000′ bus=’0x00′ slot=’0x02’function=’0x0’/>

</source>

<alias name=’hostdev0’/>

<address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x02’function=’0x0’/>

</hostdev>

而且,分配IGD设备(总是00:02.0)到地址00:02.0是必要的。删除<video>和<graphics>部分,一切都能神奇地工作。警告一下,我最新的CPU是Broadwell,我已经说过这要skylake工作,但是IGD几乎不是标准化的,每个新的实现似乎都会调整一些东西。

一些人可能会好奇为什么它不能工作在Q35上,这就引出了对UPT模式的探讨;IGD不是个独立的GPU,但是”集成“不仅仅意味着GPU嵌入到系统中,这里是指GPU是附加在系统上。这就是为什么IGD分配没有“只是工作”,为什么你需要一个通过vfio和BIOS支持暴露某些区域的主机内核,以及它需要一个特定的地址等等。

其中一个需求是视频ROM实际关心设备在PCI地址00:1f:0,即ISA/LPC桥上的一些属性。Q35在那个位置有着它自己的桥,我们不能因为兼容性就简单地修改桥的ID。因此桥和Q35冲突,意味着IGD分配不能工作在Q35上。也就意味着PCI地址00:1f:0不能使用在440FX机器上。

UPT就是这样。Intel深知IGD的发展使得它难于处理设备分配。为了应付这个问题,软件和硬件上都要做出了改变来助力IGD更友好地分配。好消息,对吗?首先,在UPT模式下,IGD作为虚拟机的次要显卡,没有VGA模式支持(顺便说一句,传统模式下x-vga=on 自动添加到QEMU)。

事实上,默认情况下UPT模式不支持任何类型的输出。你问这有什么用? 在模拟显卡和你可以建立镜像的IGD之间,你有一个远程能力、硬件加速显卡虚拟机。另外,如果你添加可选选项x-igd-opregion=on到vfio-pic设备,可以得到物理显示输出,但是需要你的主机运行v4.6或更新的内核以及即将到来的QEMU2.7,而没有输出的UPT可能已经工作相当长的一段时间了。

UPT模式对IGD的PCI地址没有要求,但是要注意,大多数虚拟机的防火墙、SeaBIOS或者OVMF,定义主显卡为最低PCI地址的那张。通常这不是问题,但是某些人可能会创建疯狂的配置。你依然需要完成上述的黑名单和视频禁用,否则就冒险从主机绑定和解绑i915驱动,赌一把看它会不会每次都崩溃。

UPT听起来不错,除了为什么opregion可选?事实证明,如果你想要制作上面提到的镜像,以及用opregion开启物理输出的话,你真的需要一个显示器连接到设备,否则你的应用程序不能得到硬件加速。如果IGD没有任何输出,那么放心地使用硬件加速,别管什么物理连接。但是读者如果需要这个功能(类似于x-vga=on),应该知道怎么创建包装脚本,添加这个额外的选项。我不认为Intel真的想要支持这种混杂模式,才加了实验性的x- 可选前缀标签。

对于UPT模式的多一个收获,intel似乎另有期待,我尝试用UPT运行linux客户机,但是没有成功。只是先走一步,仅在这一点上也是为了你的windowns客户机。

还有就是,笔记本的显示功能应该正常,我相信开关输出也可以,但是在笔记本上工作不方便,因为你没有可用的串行控制台。要注意,当你使用input-linux绑定到笔记本键盘和鼠标(不是触控式的IME),我不知道怎么使热键工作,这是个大麻烦。一些IGD驱动在分配时会在主机上产生DMAR错误,尤其是每台主机首次开机。

不用过于紧张,尤其是显示初始化之前如果它停止了。这似乎是在一个不能访问BIOS设置的页表的IOMMU上下文时,重置IGD引起的。除非是不断地打印,否则它们多半是可以被忽略的。如果你有一些比SandyBridge更老的硬件,并希望它们能派上用场,即便被告知应该停止的情况下也要继续尝试,对不起,SandyBridge有了一些硬件改进,我还没有对更老的设备做任何测试,也真的不想为这些过时的硬件支持额外的代码。此外,这些相当老的硬件,无论如何你都需要一个升级的理由。

有了这些支持,我切换到桌面系统后,主机从U盘启动,之前的裸机fedora安装使用IGD虚拟化,运行在我创建好的GeForce虚拟机上。试一下吧,祝你好运。

文章出处:KVM虚拟化实践(公众号ID:kvm_virt)

本文翻译自以下链接:

http://vfio.blogspot.com/2016/07/intel-graphics-assignment.html

译者:韩卫 KVM云技术社区金牌翻译

本文链接:http://www.yunweipai.com/9197.html

网友评论comments

发表评论

邮箱地址不会被公开。

暂无评论

Copyright © 2012-2021 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部