Xen虚拟化环境下显卡透传实现
Xen VGA graphics adapter passthrough 一.显卡虚拟化调研报告
1.1 简介
Xen VGA graphics adapter passthrough是指将显卡绑定到虚拟机,虚拟机可以直接的独占的使用显卡,获得更好的3D和视频加速性能。
Xen VGA passthrough只能用于全虚拟化虚拟机,不支持半虚拟化虚拟机。Xen VGA passthrough需要Xen4.0或更新版本,需要dom0内核包含pci后端驱动。
Xen VGA passthrough需要硬件(CPU,主板,芯片组,BIOS)支持IOMMU(Intel VT-d或 AMD IOMMU)技术,满足要求的硬件参考https://www.360docs.net/doc/d218258513.html,/xenwiki/VTdHowTo。
1.2 原理
VGA passthrough的技术基础是PCI passthrough,PCI passthrough需要硬件支持IOMMU,主要用于网卡,U盘等PCI设备的直接访问。显卡的一些特殊性使其不能直接使用PCI passthrough,比如VGA显卡有自己的bios,集成显卡需要固定内存作为显存等。
VGA passthrough的步骤如下:
1)映射VGA帧缓存到虚拟机。
2)拷贝VGA BIOS 到虚拟机。
3)映射VGA I/O 端口。
4)关闭Xen的VGA模式,即禁止dom0使用该VGA显卡。
1.3 显卡支持情况
Xen4.0的显卡支持情况
●支持intel集成显卡
●支持主显卡适配器(primary graphics adapters),即开机启动时默认使用
的显卡。
●部分Nvidia和ATI的显卡需要而外的patch来支持FLR(Function Level
Reset)。
●部分Nvidia显卡需要而外的使vBAR=pBAR的patch。
●部分显卡需要修改VGA BIOS。
1.4 成功案例
1)Wiki上测试过的显卡
网址:https://www.360docs.net/doc/d218258513.html,/xenwiki/XenVGAPassthroughTestedAdapters。
●Intel Corporation 82Q35 Express Integrated Graphics Controller,下图显示
相关的配置信息。
●Nvidia显卡,官方数据仅有FX 3800, 4800 and 5800支持graphics
passthrough,下图显示相关的配置信息。
●ATI显卡,经过测试的显卡有Radeon 4850,Radeon 4870,FirePro V5700和
FirePro M5800。用户报告测试成功的有ATI HD4550,ATI HD5750,Radeon 4770。ATI HD5750成功案例网址:https://www.360docs.net/doc/d218258513.html,/VGA-passthrough-GA-890FXA-with-ASUS-EAH5750-video-td3274626.html。
2)视频演示
软件环境:
Domain0操作系统:Fedora 11 Linux x86-64
Xen版本:Xen 3.5-unstable
Domain0内核:2.6.31.4 (pvops)
DomainU:Windows XP Home Edition SP3 32-bit,全虚拟化VM。
Intel GFX Passthrough Patches Applied: Version 1 (Provided by Han Weidong Intel),不知道这个patch具体是什么。
硬件环境:
显卡:NVIDIA GeForce 8400 GS PCI Express x16
CPU:Pentium(R) Dual-Core CPU E6300 2.8GHz
主板:Intel DQ45CB
内存:8GB DDR2-800
下图是虚拟机中显卡型号的显示(视频截图)。
以下视频中硬件和软件配置同上,视频地址:
https://www.360docs.net/doc/d218258513.html,/watch?v=3mxuNRiMxDU,虚拟机硬件信息展示。
https://www.360docs.net/doc/d218258513.html,/watch?v=5I13E1MQbMc,3D游戏测试。
https://www.360docs.net/doc/d218258513.html,/watch?v=yYg6n8yBktM,3D游戏测试。
https://www.360docs.net/doc/d218258513.html,/watch?v=Pikwgl8bac8,3D游戏测试。
https://www.360docs.net/doc/d218258513.html,/watch?v=5tLzYqIJ7Q0,3D游戏测试。
https://www.360docs.net/doc/d218258513.html,/watch?v=uL7JS4PMpzY,磁盘I/O的benchmark。
https://www.360docs.net/doc/d218258513.html,/watch?v=HHUwg_zxYgw,配置过程,虚拟机信息展示。
https://www.360docs.net/doc/d218258513.html,/watch?v=vLR-o9tX_Tw,CPU性能测试。
3)VGA passthrough:Nvidia 9500GT
软件环境:
Xen (build: xen-unstable, recent as of ~ 1/25/09 1:00AM-EST)
Dom0: Linux-2.6.18.8-xen (via xen-unstable.hg)
DomU: Windows XP (pro, sp3, 32-bit)
硬件环境:
Intel Q6600 Core 2 Quad-Core, G0 stepping (I think)
Intel DQ35JO Motherboard, Q35 Chipset, BIOS v.991 (1/9/09), VT and VT-d enabled
nVidia 9500GT (for VT-d passthrough - DomU)
nVidia GeForce2 MX200 (Dom0 console)
网址:
https://www.360docs.net/doc/d218258513.html,/Successful-PCIe-Graphics-VT-d-Passthrough-to-W in32-DomU-Q35-chipset-td2598400.html
二.xen4.0+安装介绍
2.1 准备工作
(1) 安装一个较新版的linux,比如64位的fedora12, fedora13 ,fedora14
(2) 安装必要的软件包
●Fedora12及更高版本安装以下软件包:
yum groupinstall "Development Libraries"
yum groupinstall "Development Tools"
yum install transfig wget libaio-devel dev86 glibc-devel e2fsprogs-devel gitk mkinitrd iasl xz-devel bzip2-devel pciutils-libs pciutils-devel SDL-devel libX11-devel gtk2-devel bridge-utils PyXML qemu-common qemu-img mercurial
●Ubuntu安装以下软件包:
apt-get install bcc bin86 gawk bridge-utils iproute libcurl3 libcurl4-openssl-dev bzip2 module-init-tools transfig tgif texinfo texlive-latex-base texlive-latex-recommended texlive-fonts-extra texlive-fonts-recommended pciutils-dev mercurial build-essential make gcc libc6-dev zlib1g-dev python python-dev python-twisted libncurses5-dev patch libvncserver-dev libsdl-dev libjpeg62-dev iasl libbz2-dev e2fslibs-dev git-core uuid-dev ocaml libx11-dev gcc-multilib xz-utils
2.2 安装xen4.0(xen4.1)
(1) 获得xen4.0(xen4.1)的源码
Xen4.1.1的稳定发行版下载网址:https://www.360docs.net/doc/d218258513.html,/products/xen_source.html。其他稳定发行版的xen源码下载网址:https://www.360docs.net/doc/d218258513.html,/products/xen_archives.html。在网址:https://www.360docs.net/doc/d218258513.html,/hg/上,可以找到xen的稳定测试版(如xen-4.0-testing.hg xen-4.1-testing.hg),测试版功能可能更全。
测试版的下载命令:hg clone https://www.360docs.net/doc/d218258513.html,/hg/xen-4.1-testing.hg
(2)获得配置stubdom所需的软件包
安装stubdom时会自动下载一些软件包,但是速度非常慢。
可以事先将安装stubdom所需的软件包下载下来,拷贝到xen安装目录下的stubdom目录中,比如xen-4.1.1\stubdom,这时编译、安装stubdom时会快些。Stubdom目录下所需软件的下载网址:
grub-0.97.tar.gz(ftp://https://www.360docs.net/doc/d218258513.html,/gnu/grub/grub-0.97.tar.gz)
lwip-1.3.0.tar.gz(https://www.360docs.net/doc/d218258513.html,/releases-noredirect/lwip/lwip-1.
3.0.tar.gz)
newlib-1.16.0.tar.gz(ftp://https://www.360docs.net/doc/d218258513.html,/pub/newlib/newlib-1.16.0.tar.gz) pciutils-2.2.9.tar.gz(https://www.360docs.net/doc/d218258513.html,/xen-extfiles/pciutils-2.2.9.tar.bz2) zlib-1.2.3.tar.gz(https://www.360docs.net/doc/d218258513.html,/zlib-1.2.3.tar.gz)
如果不安装stubdom,这步就不需要。(一般要安装stubdom)
(3)编译安装xen
在目录xen-4.1.1下,执行以下命令。
make xen
make tools
make stubdom
make install-xen
make install-tools
make install-stubdom
2.3 安装Linux内核2.6.32
(1)获得pvops的Linux内核(pvops 2.6.32.x)
Paravirt_ops简称pv-ops。以前xen相应的Linux内核版本为2.6.18。现在pv-ops可以将xen相应的Linux内核版本提高为2.6.32.x。关于xen pvops的详细信息请看网址:https://www.360docs.net/doc/d218258513.html,/xenwiki/XenParavirtOps。
获得pvops 2.6.32.x Linux内核的具体命令(教育网网速不行,需用电信网):git clone git://https://www.360docs.net/doc/d218258513.html,/pub/scm/linux/kernel/git/jeremy/xen.git linux-2.6-xen
cd linux-2.6-xen
git checkout -b xen/stable-2.6.32.x origin/xen/stable-2.6.32.x
(2)编译安装Linux内核
为了避免pv_ops dom0 kernel不能正常工作或启动,可以尝试网上给出的.config例子文件,网址:https://www.360docs.net/doc/d218258513.html,/xenwiki/XenParavirtOps。
在这个网页上的具体地方:如图
编译内核时,把它重命名为.config 放入Linux目录中。
在linux2.6.31*目录下执行以下命令:
1) make mrproper
2) 把config-2.6.32.27-pvops-dom0-xen-stable-x86_64改成.config放到内核目录下
3) make xconfig 或make menuconfig (最好使用make xconfig 命令,它可以使用搜索;此时内核配置时,搜索与xen相关的配置选项,全部选上,有的地方三选一时,选上xen passthrogh选项)
4) make bzImage
5) make modules
6) make modules_install
7) make install
Note: 第3)点中,主要是把将PCI后端驱动模块编译进内核。
CONFIG_XEN_PCIDEV_BACKEND_PASS=y
2.4 配置grub
以下是参考配置,对应系统现有的配置进行修改。
title Xen 4.1
root (hd0,4)
kernel /boot/xen.gz dom0_mem=1024M
module /boot/vmlinuz-2.6.32.41 ro root=UUID=c0aa23a0-294c-45df-9a80-62bfab032cb4 nomodeset
module /boot/initrd-2.6.32.41.img
注意:上面只是安装xen的一般grub配置。在显卡的passthrough中,grub还需要作另外的修改。这个我们在后面来说。
三.显卡passthrugh的实现细节
3.1 硬件及软件平台介绍
硬件:
主板技嘉X58
显卡AMD ATI HD5750
软件:
宿主机系统:fedora 14 X86_64位系统
Xen: xen4.1.1
Dom0: Linux pvops 2.6.32.41
DomU: winxp 和win7 (都是全虚拟化的镜像)
3.2 passthrough配置细节
(1) 主板芯片组支持IOMMU(Intel VT-d 或AMD IOMMU)技术
在BIOS设置界面,找到Advanced Chitset Features选项,将VT-D选项加入。
当xen安装完毕后,xend start启动xen后。用xm dmesg 命令,在它的输出中如果找到这一行:
(XEN) I/O virtualisation enabled
这说明xen支持IOMMU成功。
(2) 系统grub配置细节
title Xen 4.1
root (hd0,0)
kernel /boot/xen.gz iommu=1
module /boot/vmlinuz-2.6.32.41 ro root=UUID=7a0c2a3e-2124-49dd-baf2-2562e0270cc1 nomodeset xen-pciback.permissive xen-pciback.hide=(04:00.0)(04:00.1)
pci=resource_alignment=04:00.0;04:00.1
module /boot/initramfs-2.6.32.41.img
与一般配置xen的grub相比,上面加粗,标记为红、黄两色的部分,是在显卡passthrough 实验中增加的。红色的部分,是必须要有的,而黄色的部分可写、可不写。Iommu =1 表示在启动xen Dom0时打开VT-d技术。xen-pciback.hide=(04:00.0)(04:00.1) 表示绑定设备04:00.0和04:00.1(它们是用lspci查看到的设备号)到pciback。xen-pciback.hide是使用内核参数实现PCI设备使用VT-d技术实现pass-through的方法,这是最简单的方法。
xen-pciback.hide绑定设备到pciback,相当于从Dom0隐藏PCI设备,这是使用VT-d技术去实现PCI设备(如显卡)pass-through要做的第一步。
在这里,介绍另外一种从Dom0隐藏PCI设备的方法:Binding Devices to pci-stub具体信息可以参看网址:https://www.360docs.net/doc/d218258513.html,/xenwiki/VTdHowTo。
具体方法:
用命令lspci -n 得到PCI设备的设备号和设备ID。
03:00.0 0300: 1002:68be
03:00.1 0403: 1002:aa58
04:00.0 0300: 1002:68be
04:00.1 0403: 1002:aa58
如上图中显示的:03:00.0 为设备号,1002:68be为设备ID。
可以使用下面的命令来隐藏设备03:00.0。
echo "1002 68be" > /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:01:00.0" > /sys/bus/pci/drivers/0000:01:00.0/driver/unbind
echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/bind
使用pci-stub绑定设备的方法,仅适用于HVM guests的pci的passthrough。用内核参数xen-pciback.hide的方法适用于HVM和PV guests,在使用上,优先考虑使用xen-pciback.hide的方法。在我们的实现上,也是使用的xen-pciback.hide的方法。
(3) 虚拟机DomU配置文件
在虚拟机配置文件中,不要添加上这句:gfx_passthru=1。在我们原先的
显卡虚拟化调研中,一直认为在虚拟机配置文件中,要加上这句话。但加上这句话后,我们遇到的问题是:可以用命令xm create ****.hvm 创建起来一个虚拟机,但是用命令xm vncviewer ID去连接启起来的虚拟机时,发现Guest OS不能正常启动起来。
解决这个问题,是通过一个网址上的内容,它使用的是相同的显卡:https://www.360docs.net/doc/d218258513.html,/VGA-passthrough-GA-890FXA-with-ASUS-EAH5750-video-td3274626.html。
在系统grub文件配置细节中,我们介绍了xen-pciback.hide,它从Dom0隐藏pci设备。实现了这点,接下来的工作,是为虚拟机DomU指派pci设备。
在这里介绍两种方法为虚拟机DomU指派pci设备。
方法一:虚拟机DomU配置文件中添加上这一句:pci=['04:00.0']。它表示为此虚拟机指派pci设备:04:00.0。
方法二:VT-d Device Hot-Plug。它是针对全虚拟化虚拟机,它是在虚拟机启动完成后,再用命令行为此虚拟机指派一个pci设备。具体信息参考:https://www.360docs.net/doc/d218258513.html,/xenwiki/VTdHowTo。具体命令如下,xm pci-attach HVMDomainID 00:04:00.0
在我们的实验中,这两种方法都试验过,都可行。当给虚拟机DomU指派了pci设备后,用命令xm pci-list HVMDomainID 查看此虚拟机拥有的pci设备时,会有显示。如下:
[root@localhost image]# xm pci-attach 3 00:04:00.0
[root@localhost image]# xm pci-list 3
Vdev Device
05.0 0000:04:00.0
但是,用命令xm pci-list-assignable-devices,并没任何显示。
在我们的实验中,方法一和方法二还有个区别:用方法一实现显卡passthrouh的虚拟机启动后,第一次安装显卡驱动后,以后每次启动此虚拟机,显卡都是能正常可用的。当用方法二的虚拟机,第一次安装显卡驱动后,以后每次这样启动此虚拟机,它的显卡可以检测到,但并不可用,需要重启一下,显卡才能正常使用。
3.3 实现过程中可能会遇到的问题
(1) pci设备绑定的问题
在我们的实现过程中,创建虚拟机时,遇到了这样的问题:Error: pci: 0000:04:00.0 must be co-assigned to the same guest with 0000:04:00.1。我们要passthrough设备是0000:04:00.0(显卡)。这个问题的详细信息及解决方法见网址:https://www.360docs.net/doc/d218258513.html,/xenwiki/XenPCIpassthrough。
出现这样问题的原因:设备0000:04:00.0(显卡)和设备0000:04:00.1(声卡),同属于相同的pci bridge,不允许它们中的单独一个设备passthrough。在我们的解决方法中,是采用了pci设备绑定的方法,即让它们都从Dom0隐藏。具体的操作是:grub中,xen-pciback.hide=(04:00.0)(04:00.1)。
上图中提到了还有另外一种方法:修改/etc/xen/xend-config.sxp文件,指定"pci-passthrough-strict-check no"。此方法,在我们的实验中,没有尝试。
(2)网桥的问题
在虚拟机的配置文件中,会有关于网桥的这样一行:vif = [ 'type=ioemu, mac=00:16:3e:00:00:11, bridge=xenbr0' ]。Bridge=xenbr0或者xenbr1,这个取决于我们宿主机是eth0还是eth1,这个一般是默认配置。
在我们原先的虚拟机文件中,是xenbr1。在创建虚拟机的时候就出现了问题,它会提示找不到bridge xenbr1。Xen启动起来后,用命令brctl show,它显示的是bridge 为tmpbridge。修改虚拟机配置文件中,bridge=tmpbridge。此时虚拟机能正常启动起来。
但又出现了新的问题,进入虚拟机后,为虚拟机配置正确的IP后,它始终是不能上网的。问题就出在bridge=tmpbridge上。tmpbridge在Dom0中是不认可的。它正确的bridge不是tmpbredge。
其实从xen4.0开始,它的bridge都修改为了peth0或者peth1。在xend start 启动后,用命令brctl show出现下面的提示,就表示网桥配置正确了:
[root@localhost image]# brctl show
bridge name bridge id STP enabled interfaces
eth1 8000.1c6f65c3075e no peth1
tap6.0
vif6.0
我在这里就介绍下,在我们的实验中,fc14系统下配置网桥的要注意几点吧:1) 关闭NetworkManger服务,把它设为开机不启动。fc14的网络管理是由NetworkManger和network一起来管理,与ubuntu相比,它的网络管理比较混乱,索性把NetworkMagner设为开机不启动。(chkconfig NetworkManger off)2) fc14中perferences -> Network Connections 为空,如图
3) Administration -> Network中只有eth1 ,如图
4) Adminstration -> Network Device Control为空,如图
5) /etc/sysconfig/Network-scripts/下会有eth1,它里面有关于IP配置的信息完整。
6) xend start后,ifconfig会多出一个网桥peth1。
(3) 安装显卡驱动的问题
显卡passthrogh成功后,全虚拟化的虚拟机里面,能够检测到显卡的存在,它显示的是一个U盘符的形式,点击它,提示如图(上图为win7,下图为xp)
但是要安装显卡驱动后,显卡才能在设备管理器安全识别出来。安装显卡驱动的方法有二。
方法一:配置好虚拟机里面的网络,直接从网上下载对应型号的显卡驱动程序,进行安装,重启虚拟机,即可。
方法二:修改虚拟机的配置文件,在虚拟机里面挂载一个U盘,进入虚拟机后,能够识别读取U盘,即可。在win7虚拟机镜像的配置文件里面加的语句为:disk = [ 'file:/home/image/win7_64.img,hda,w','phy:sdd1,hdb,w'],红色部分即为添加的部分。sdd1对应于,此U盘插在物理机上时,用fdisk -l命令查看得到的U盘占用的磁盘分区号。在winxp虚拟机镜像配置文件里面加的语句为:disk = [ 'file:/home/image/winxp.img,ioemu:hda,w', 'phy:sdd1,sda,w']。
安装显卡驱动后,设备管理器的显示如下:(上图为win7,下图为xp)
3.4 显卡passthrough 的一些检测截图
(1) 全虚拟化虚拟机里面,GPU-Z 和CPU-Z 测试结果图:(上为win7,下为xp )
(2) 虚拟机里面3DMarks 测试结果图,winxp 里面跑的是3DMarks 06,win7里面跑的是3DMarks 11,在win7里面需要先安装.net framework4.0(上图为win7,下图为winxp )