显卡虚拟化kvmgt

编译内核
参考文档
http://blog.chinaunix.net/uid-20788636-id-5761292.html
https://github.com/intel/gvt-linux/wiki/GVTg_Setup_Guide#22-hardware-requirements

测试环境

cpu G3865

系统centos7.3

安装依赖环境
yum install asciidoc newt-devel xmlto audit-libs-devel binutils-devel elfutils-devel numactl-devel java-1.8.0-openjdk-devel perl slang-devel ncurses-devel pciutils-devel perl-ExtUtils-Embed -y
yum install libarchive-dev libghc-bzlib-dev libpci-dev mercurial gettext bcc iasl libncurses5-dev kpartx bc libperl-dev libgtk2.0-dev libc6-dev-i386 libaio-dev libsdl1.2-dev libyajl-dev libx11-dev autoconf libtool xsltproc bison flex xutils-dev xserver-xorg-dev x11proto-gl-dev libx11-xcb-dev vncviewer libxcb-glx0 libxcb-glx0-dev libxcb-dri2-0-dev libxcb-xfixes0-dev python-dev bin86 git vim libssl-dev gcc gcc-c++ glib2 glib2-devel zlib zlib-devel automake -y
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

下载 nosrc文件
rpm -ivh http://elrepo.org/linux/kernel/el7/SRPMS/kernel-ml-4.15.14-1.el7.elrepo.nosrc.rpm
cd rpmbuild/SOURCES
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.15.14.tar.xz
编辑配置文件 config-4.15.14-x86_64
打开功能
CONFIG_DRM_I915_GVT=y
CONFIG_DRM_I915_GVT_KVMGT =y
CONFIG_VFIO_MDEV =y
CONFIG_VFIO_MDEV_DEVICE=y
编译内核
rpmbuild -bb /rpmbuild/SPECS/kernel-ml-4.15.spec
在rpms目录 生成内核rpm包

安装内核 首先需要配置默认加载的模块
编辑配置文件/etc/dracut.conf
add_drivers+="kvmgt vfio vfio-pci vfio-mdev" 添加驱动模块

然后安装内核
rpm -ivh kernel*
查看boot 添加内核参数
i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=on

开机后查看内核模块
lsmod |grep kvmgt
lsmod |grep vfio-mdev

查看是mdev_supported_types 目录是否存在
/sys/bus/pci/devices/0000\:00\:02.0/ 这个路径通过lspci可以查看到 集成显卡的路径

编译qemu 是用2.10的测试
git clone https://github.com/intel/igvtg-qemu
git checkout stable-2.10.0
git submodule update --init roms/seabios
yum install SDL2-devel mesa-libgbm-devel libepoxy-devel spice-server-devel spice-protocol -y
./configure --prefix=/usr/local/qemu --enable-kvm --disable-xen --enable-debug-info --enable-debug --enable-sdl --enable-vhost-net --disable-debug-tcg --target-list=x86_64-softmmu --enable-gtk --enable-opengl --enable-vhost-vsock --enable-spice
make -j8
cd roms/seabios/
make -j
make install
cp roms/seabios/out/bios.bin /usr/local/qemu/
重启
创建vcpu
生成一个uuid 然后创建
uuidgen
c00d96bb-081a-4c91-94bb-37b1e18ef1e9
echo "c00d96bb-081a-4c91-94bb-37b1e18ef1e9" > /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create

编译写个网卡启动脚本
chmod +x /etc/qemu-ifup
#!/bin/sh
set -x

switch=br0

if [ -n "$1" ];then
# tunctl -u `whoami` -t $1 (use ip tuntap instead!)
ip tuntap add $1 mode tap user `whoami`
ip link set $1 up
sleep 0.5s
# brctl addif $switch $1 (use ip link instead!)
ip link set $1 master $switch
exit 0
else
echo "Error: no interface specified"
exit 1
fi

启动虚拟机脚本
#! /bin/bash -x
/usr/local/qemu//bin/qemu-system-x86_64 \
-m 8192 -smp 4 -M pc \
-vga none \
-display egl-headless \
-name gvt-g-guest \
-hda /adminpool/S-1-tea64.win7 \
-bios /usr/local/qemu//bios.bin -enable-kvm \
-net nic,macaddr=00:A1:00:00:00:2A -net tap,script=/etc/qemu-ifup \
-k en-us \
-serial stdio \
-machine kernel_irqchip=on \
-global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 \
-cpu host -usb -usbdevice tablet \
-device vfio-pci,sysfsdev=/sys/bus/pci/devices/0000:00:02.0/c00d96bb-081a-4c91-94bb-37b1e18ef1e9,x-display=on,x-igd-opregion=on \
-spice port=5911,addr=0.0.0.0,disable-ticketing

使用libvirt xml文件启动虚拟机

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<os>
<type arch='x86_64' machine='pc-i440fx-2.10'>hvm</type>
<boot dev='hd'/>
</os>

<device>
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
<source>
<address type='mdev' uuid='c00d96bb-081a-4c91-94bb-37b1e18ef1e9'/>
</source>

</hostdev>
</device>

<qemu:commandline>
<qemu:arg value='-set'/>
<qemu:arg value='device.video0.driver=ne2k_pci'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev0.x-igd-opregion=on'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev0.x-display=on'/>
<qemu:arg value='-display'/>
<qemu:arg value='egl-headless'/>
</qemu:commandline>
</domain>

修改权限
usermod -a -G video qemu
vi /etc/libvirt/qemu.conf
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm", "/dev/kqemu",
"/dev/rtc","/dev/hpet", "/dev/vfio/vfio",
"/dev/dri/renderD128"
]
重启服务
service libvirtd restart

使用脚本 去启动虚拟机
vi /usr/bin/qemu-kvm.mdev
!/bin/bash
args=`echo "\$@" | sed "s#vfio-pci#vfio-pci,x-display=on,x-igd-opregion=on#g"`
echo ${args} > /tmp/args
echo ${args}|grep vfio-pci
if [ $? == 0 ]; then
argss="${args} -display egl-headless -spice port=5911,addr=0.0.0.0,disable-ticketing"
else
argss=$args
fi
exec /usr/local/qemu/bin/qemu-system-x86_64 $argss

猜你喜欢

转载自www.cnblogs.com/pdjun/p/9212087.html