Ubuntu12.10 下搭建基於KVM-QEMU的虛擬機環境(十九)

        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驅動等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章