虚拟机里的游戏机 -- 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