最近正准備升級電腦,恰好看到關於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