Spice 客戶端和spice 服務端通常運行在不同的機器上,運行spice服務端的主機通常有着多顆多核的CPU以及幾十G以上的內存,通過底層支持虛擬化的KVM+qemu環境虛擬出幾臺到幾十臺虛擬機,供運行Spice客戶端的終端連接使用,這些終端通常配置較低,僅僅充當虛擬桌面的顯示之用,當然還有鍵盤、鼠標的輸入和聲音的輸出等基本功能,這些在我們之前介紹的spice連接中都已經具備。
稍稍有些麻煩的是外設,如最常用的是USB類外設,如U盤。這些外設的物理接口在客戶端機器上,但是它的數據又要像普通PC一樣傳遞到虛擬機裏去處理。在平常的PC機器上,USB總線像其他的PCI總線等都在同一塊物理主板上,操作系統能夠通過底層的設備驅動很容易的訪問和檢測。但是在虛擬機環境下,虛擬操作系統運行在服務器上,這些USB外設在另外一臺物理終端上,工作機理已經大大的不同了。連接外設和操作系統的媒介只有網絡,因此毫無疑問,使用這些外設除了通過網絡傳輸之外別無它法。
好在spice 社區推出了USB外設重定向的架構,那就是使用在本系列文章(三)和(四)中提到的LisbUSB和USBRedir等技術,將USB數據做所謂的重定向,當然spice客戶端和服務器端也做了一些改變,增加了專門用來傳遞USB數據的通道,大致架構如下:
注意到上圖中 spice-gtk是spice社區一個新的採用glib庫開發的spice 客戶端,也只有在這個新的客戶端裏增加了關於USB重定向的channel,因此我們需要重新編譯一個這樣的客戶端出來。
Spice-gtk的下載地址是:https://launchpad.net/ubuntu/+source/spice-gtk ,本着一切自己動手的原則,分別下載:spice-gtk_0.19-0nocelt3.debian.tar.gz,spice-gtk_0.19-0nocelt3.dsc和spice-gtk_0.19.orig.tar.bz2,然後按照以前文章的方法編譯。
稍微需要指出的是需要先安裝依賴包:
sudo apt-get install libgtk2.0-dev libgtk-3-dev libgudev-1.0-dev libcairo2-dev valac libvala-0.16-dev python-gtk2-dev gobject-introspection libgirepository1.0-dev gir1.2-gtk-2.0 libtext-csv-perl libacl1-dev libpolkit-agent-1-dev libpolkit-gobject-1-dev |
而其中valac包ubuntu源上的版本不匹配,需要自己下載源碼編譯:https://launchpad.net/ubuntu/+source/vala-0.20
編譯完後安裝生成的的deb包即可編譯spice-gtk,然後再安裝spice-gtk相關的deb包。
安裝完spice-gtk以後,改成用spice-gtk來連接虛擬機,spice-gtk的程序名叫spicy
dev@devhost:/opt/vm$spicy –h 127.0.0.1 –p 4000 |
同樣,spicy連接成功後也會出來虛擬機的桌面,但是插入U盤後並沒有在虛擬機裏看到U盤出現。那是因爲還需要做兩件事情:
1. 修改libvirt XML定義,增加有關USB重定向的配置(在<devices>…</devices>裏面):
<controller type='usb' index='0' model='ich9-ehci1'> <alias name='usb0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x7'/> </controller> <controller type='usb' index='0' model='ich9-uhci1'> <alias name='usb0'/> <master startport='0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0' multifunction='on'/> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <alias name='usb0'/> <master startport='2'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x1'/> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <alias name='usb0'/> <master startport='4'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x2'/> </controller> <redirdev bus='usb' type='spicevmc'> <alias name='redir0'/> <address type='usb' bus='0' port='4'/> </redirdev> <redirdev bus='usb' type='spicevmc'> <alias name='redir1'/> <address type='usb' bus='0' port='5'/> </redirdev> <redirdev bus='usb' type='spicevmc'> <alias name='redir2'/> <address type='usb' bus='0' port='6'/> </redirdev> <redirdev bus='usb' type='spicevmc'> <alias name='redir3'/> <address type='usb' bus='0' port='3'/> </redirdev> |
上述配置的具體介紹請參考libvirt文檔:http://www.libvirt.org/formatdomain.html#elementsHostDevSubsys
注意,修改配置以後虛擬機需要undefine, define,然後重啓。
2. 在spicy連接參數中加入USB重定向的參數
注:--spice-usbredir-auto-redirect-filter=”-1,-1,-1,-1,1”表示自動重定向目前插在客戶端設備上的USB外設;--spice-usbredir-redirect-on-connect=”-1,-1,-1,-1,1”表示對動態插入的USB外設做自動重定向,具體filter的含義需要連接的話請看spice-gtk源碼。
帶了這些參數重新連接成功後,在連到虛擬機一看:
插在客戶端機器上的U盤(上圖中的Ubuntu12.1 E:)已經成功重定向到虛擬機裏面了,當然如果你連的快的話,這個外設有一段時間才能出來,因爲第一次需要自動安裝一些USB驅動等。