虚拟机里的游戏机 -- xen vga passthrough

最近正准备升级电脑,恰好看到关于xen的vga passthrough介绍,于是决定配一个来玩玩。

众所周知在虚拟机里玩3D游戏在以前是不太可能的,主要因为虚拟显卡没有3D加速。现在虽然各个虚拟机(vmware,virtualbox等)有基本的3D加速,但基本上只能运行有compositing的桌面而已,对付游戏则是无能为力了。而xen支持vga passthrough,虚拟机看到的是真实的硬件。于是,在vm里玩大型3D游戏成为了可能。

值得一说的是这个技术还远为成熟,现在可选的硬件和软件都不是很多。所以购买硬件前要调研清楚。关键是cpu、主板和显卡。本人用的是i7 2600(注意没有k)+Asrock exetreme4 gen3(Asrock exetreme4也可以)+Radeon HD 6850。xenwiki上有关于显卡的粗略介绍。其实最说不清的是主板,intel把这个功能叫vt-d,amd叫它做iommu,相对来说amd的主板支持这一功能的要多一些。

然后是软件,linux下有xen。kvm也有初步支持,但整体上落后至少一年。windows下有vmware ESXi。本人目前用的是debian sid 64bit, kernel 3.2 + xen 4.1.2。用amd/ati 显卡的话配置比较简单,基本上就是安装系统,安装xen...(下文中粗体为命令)。以下内容为配置。

都装好后,lspci,找到显卡的id。比如我运行lspci后的输出:
...
00:1f.2 SATA controller: Intel Corporation 6 Series/C200 Series Chipset Family SATA AHCI Controller (rev 05)
00:1f.3 SMBus: Intel Corporation 6 Series/C200 Series Chipset Family SMBus Controller (rev 05)
01:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Barts PRO [ATI Radeon HD 6800 Series]
01:00.1 Audio device: Advanced Micro Devices [AMD] nee ATI Barts HDMI Audio [Radeon HD 6800 Series]
03:00.0 SATA controller: Marvell Technology Group Ltd. 88SE9120 SATA 6Gb/s Controller (rev 12)
...

可以看到,01:00.0和01:00.1就是我的显卡。我们要让主机把设备空出来,这个可以通过pcistub或pciback驱动实现。debian 好像没有把pcistub编译进kernel,所以不能在grub里设置把该设备“藏”起来。其实,如果想在linux下用独显,也不能在
启动时就把显卡藏起来。本人在linux下只用集显输出,这样也省掉了显卡切换的麻烦。

我们用pciback。网上找到一个好用的脚本,保存为/sbin/pciback-bind下
$cat /sbin/pciback-bind

 1 #!/bin/bash
 2 
 3 if [ $# -eq 0 ]; then
 4         echo "Require PCI devices in format: <domain>:<bus>:<slot>.<function>"
 5         echo "Eg: $(basename $0) 0000:00:1b.0"
 6         exit 1
 7 fi
 8 
 9 [ -z "`lsmod | grep pciback`" ] && sudo /sbin/modprobe xen-pciback
10 
11 for pcidev in $@; do
12         if [ -h /sys/bus/pci/devices/"$pcidev"/driver ]; then
13                 echo "Unbinding $pcidev from" $(basename $(readlink /sys/bus/pci/devices/"$pcidev"/driver))
14                 echo -n "$pcidev" > /sys/bus/pci/devices/"$pcidev"/driver/unbind
15         fi
16         echo "Binding $pcidev to pciback"
17         echo -n "$pcidev" > /sys/bus/pci/drivers/pciback/new_slot
18         echo -n "$pcidev" > /sys/bus/pci/drivers/pciback/bind
19 done


只要
/sbin/pciback-bind 0000:01:00.0 0000:01:00.1 就可以把显卡驱动换成xen-pciback。这时如果运行xm pci-list-assignable,输出应该是

0000:01:00.0
0000:01:00.1

关键步骤已经完成,剩下的就和其他虚拟机创建差不多了。以win7为例,创建一个叫win7cn.cfg的配置文件。内容如下:

kernel = "hvmloader"
builder='hvm'
memory = 3584
name = "win7cn"
vcpus=4
cpus="4-7"  #cpu pinning,以后会提到
# I have 8 threads, 4 was a good number for me.
pae=1
acpi=1
apic=1
#关于网络配置以后会细述
vif = [ 'bridge=xenbr0, mac=00:aa:0a:14:11:02, ip=192.168.1.123, type=paravirtualised' ]
#虚拟磁盘,我用的是lvm分区。传说性能最好,以后会提及
disk = [ 'phy:/dev/green/hvm,hda,w' , 'file:/mnt/games/win/game.iso,hdc:cdrom,r' ]
#device_model = 'qemu-dm' 
boot="dc" 
sdl=0 
opengl=1
vnc=1
vnclisten="0.0.0.0"
vncconsole=0
vncpasswd=''
stdvga=1
#nographic=1 #!!! only uncomment this if you are using win8 or are trying to get a nvidia card to work
serial='pty' 
tsc_mode=0
#soundhw='all' 
usb=1
usbdevice='mouse' 
xen_platform_pci=1
gfx_passthru=0
# Leaving this as 0 is how it works for me with Radeon HD cards
# You can change this later for iGPUs or nVdia if needed.# Try it with 0 first
pci=['01:00.0', '01:00.1' ]
# These values are the ones you found out by doing the lspci command earlier


里面有些设置以后有空再详细写写。这时我们只要xm create win7cn.cfg就可以创建虚拟机了。但这时的默认输出仍是虚拟显卡,所以要先用vncviewer登录win7桌面,装好amd的显卡驱动,重启。大功告成。

用nvidia显卡的朋友参考下面链接
http://www.davidgis.fr/blog/index.php?2011/12/07/860-xen-42unstable-patches-for-vga-pass-through
下面链接或许有用
http://wiki.xensource.com/xenwiki/XenPCIpassthrough

 

posted @ 2012-06-15 08:56  随身笔记  阅读(3038)  评论(5编辑  收藏  举报