KVMGT in Linux 4.10 – 流媒体服务器、游戏、车载大屏等场景的应用技术预研

UPDATE: 2018-04,现在KVMGT相关upstream基本已全部进入master,可以参考GVTg_Setup_Guide或者GVTd_Setup_Guide,如果需要本地显示参考DMA_BUF User Guide

UPDATE: 2017-08-08,Intel有了X系列处理器i9,这个核数肯定适合跑桌面了。

UPDATE:鉴于KVMGT的产品化集成难度较之前有所降低,所以最近有很多人都打算搞搞集成,那我先来集成一把吧。

果不其然,直接并进内核了(书要改吗。。当然不,本文简单增补即可。。)

4.10非常具有的代表性即是添加了Mediated Device(vfio-mdev),Intel有自家方案,nVidia也要支持,但Linux社区说你俩给个统一框架吧,要不太乱,于是就有了它。如此以来,N家的显卡便可以很快开发出对应的驱动(不要相信他们家销售说的话,14年偶尔问了一下说要支持的,都过去80年啦),可以看看N家去年(2016.9)放的PPT,02×03-Neo_Jia_and_Kirti_Wankhede-vGPU_on_KVM-A_VFIO_based_Framework

相较于之前的文章intel-igvt-g-vgpu-in-kvm-kvmgt-howto,这次的并入减少了我们的不少工作。

4.10 ChangeLog:https://kernelnewbies.org/Linux_4.10

参考https://github.com/01org/gvt-linux/wiki/GVTg_Setup_Guide

另外,RHEL 7.4也已加入了KVMGT/XenGT,可以试用一下。

来看看支持哪些CPU吧:

As a long-standing member of the open source community, Intel works upstream to ensure that full, open source implementations of Intel® GVT exist for open source virtualization hypervisors, KVM* and Xen*, known respectively as KVMGT and XenGT. KVMGT and XenGT deliver excellent virtual GPU performance in VMs across 5th and 6th generation Intel® Core™ processors (Intel® Core™ i3, Intel® Core™ i5, and Intel® Core™ i7 processors) with Intel Processor Graphics as well as Intel® Xeon® processors E3 v4 family with Intel Processor Graphics.

首先安装并编译4.10的内核:

$ git clone https://github.com/01org/gvt-linux
$ sudo yum install openssl-devel ncurses-devel
$ cd gvt-linux
$ git checkout gvt-stable-4.10
$ echo ""|make oldconfig
$ make menuconfig

搜索关键字kvmgt, mdev,vfio-iommu-type1,并将其标记为“M”。 模块标记完成后,进行编译安装。

$ make -j4
$ sudo make modules_install
$ sudo make install
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg

从elrepo安装的缺少模块和编译环境。

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
# yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel

然后修改grub文件:

menuentry 'CentOS Linux (4.10.10) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.10.2.el7.x86_64-advanced-6a3987e2-9cb7-4b38-9a53-1642aefada46' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  3fc34ea6-30d7-491e-931d-d0941884fb6b
        else
          search --no-floppy --fs-uuid --set=root 3fc34ea6-30d7-491e-931d-d0941884fb6b
        fi
        linux16 /vmlinuz-4.10.10 root=/dev/mapper/cl-root ro rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet LANG=en_US.UTF-8 i915.enable_gvt=1 kvm.ignore_msrs=1
        initrd16 /initramfs-4.10.10.img
}

为什么添加ignore_msrs呢?

Since some windows guest 3rd patry application / tools (like GPU-Z / Passmark9.0) will trigger MSR read / write directly, if it access the unhandled msr register, guest will trigger BSOD soon. So we added the “kvm.ignore_msrs=1” into grub for workaround.

然后继续编译QEMU,这次只要下载upstream的即可。

$ git clone git://git.qemu.org/qemu.git
$ cd qemu
$ git checkout v2.8.1
$ git submodule update --init roms/seabios
$ ./configure --prefix=/usr \
    --enable-kvm \
    --disable-xen \
    --enable-debug-info \
    --enable-debug \
    --enable-sdl \
    --enable-vhost-net \
    --enable-spice \
    --disable-debug-tcg \
    --target-list=x86_64-softmmu
$ make -j4
$ cd roms/seabios
$ make -j8
$ cd -
$ sudo make install
$ sudo cp roms/seabios/out/bios.bin /usr/bin/bios.bin

32 评论

  1. 你好!我也在ubuntu17.04下也尝试KVMGT,采用的gvt-linux-gvt-stable-4.10,Igvtg-qemu-stable-2.9.0;一直无法成功,用的是Intel i7处理器;一直无法在VM中看到Host的GPU设备;我是按照GVTg_Setup_Guide的流程做的,在编译内核之前,把gvt-linux-gvt-stable-4.10目录下的.config文件中的关于I915和mdev以及VFIO相关的选项都置为Y;编译并且安装内核后,一致无法在/sys/bus/pci/0000:00:02:0/的目录下生产mdev_support_xx的路径,请问哪里是否还有问题?

    1. 你好!编译并且安装内核后,一致无法在/sys/bus/pci/0000:00:02:0/的目录下生产mdev_support_xx的路径;VM中看不到Host的GPU设备。

      1. mdev_support_xx 这个路径不再 /sys/bus/pci下
        而是在 /sys/class/mdev_bus/0000:00:02.0

        1. 你好,我在16.04上面做的,这个两个路径下面都没有mdev_support_xx这个文件夹,求帮助,谢谢!

      2. 你是不是没有通过kenrel启动参数将gvt-g使能,检查启动参数中是否添加了i915.enagle_gvt=1

        1. 你好,我在16.04上面做的,在/sys/bus/pci/0000:00:02:0/的目录下没有产生mdev_support_xx这个文件夹,启动参数中添加了 i915.enagle_gvt=1,请帮组!谢谢

      3. 你好,你的问题解决了吗?遇到了和你同样的问题了,不知道原因出在何处了。

    2. 你是不是没有通过kenrel启动参数将gvt-g使能,检查启动参数中是否添加了i915.enagle_gvt=1

      1. 你好我按照这篇文档没有跑通,你能否把你跑通的流程发我一下呐,谢谢,如果成功的话,给你发个大红包!

          1. 你好我按照你给我发文档走到创建vgpu的时候,这个路径下面/sys/bus/pci/devices/0000:00:02.0没有mdev_supported_types这个文件夹,求帮助,谢谢

          1. 我用已经是最新的gvt_linux的内核了,用的是gvt-stable-4.14新的内核了,系统是ubuntu16.0.4和操作系统有关系吗?

          2. 不要纠结了,换18.04,不行的话就是主板或者CPU的问题

          3. 我主机得cpu: Intel(R) Celeron(R) CPU 3865U @ 1.80GHz
            你好,我主机得vga: 00:02.0 VGA compatible controller: Intel Corporation Device 5906 (rev 02)
            编译内核得时候有警告:Possible missing firmware /lib/firmware/i915/kbl_dmc_ver1_01.bin for module i915 说找不到固件,是不是和我得硬件有关系,硬件配置太低了? 系统是 16.04 gvt-stable-4.14 igvtg-qemu2.10.0,请回复,谢谢

          4. 兄弟加我一下qq吧:851728497,谢谢(刚才那个qq号写错了,尴尬),加我一下哈,谢谢!。

    3. 你好,你的问题解决了吗?遇到了和你同样的问题了,不知道原因出在何处了。

  2. 我这个测试成功了 但是使用spicy连接的效果 不好 鼠标会飘动, 请问楼主是用的什么远程协议去连接的呢

  3. virsh define vm0.xml 遇到如下问题
    error: Failed to define domain from vm0.xml
    error: unsupported configuration: unknown host device source address type ‘mdev’

    附xml片段

  4. gvt-g环境下,spice协议传输画面的源码处理流程和架构啥样的啊,知道吗,可以私聊

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注