虛擬機里的游戲機 -- 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM