Xen虚拟化环境下显卡透传实现

Xen虚拟化环境下显卡透传实现
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 )

相关主题
相关文档
最新文档