虛擬機設備直通的兩種方式(Working in Progress)


聲明:

本博客歡迎轉發。但請保留原作者信息!

博客地址:http://blog.csdn.net/halcyonbaby

內容系本人學習、研究和總結,如有雷同,實屬榮幸!

pci passthrough

  • 概念
    • 同意guest排他使用host上的某個PCI設備,就像將該設備物理連接到guest上一樣。
  • 使用場景
    • 提升性能(如直通網卡和顯卡)
    • 減少延遲(避免數據丟失或丟禎)
    • 直接利用bare-metal上設備的驅動
  • 使用方法1
    須要CPU支持VT-d。主板也支持該技術。
    • 預先配置:
      • 打開bios中的VT-d設置。
      • 激活kernel中參數配置kernel /vmlinuz-2.6.18-190.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet intel_iommu=on
    • 直通配置方法
      • libvirt
      1. 識別設備  
      # virsh nodedev-list --tree |grep pci
      2. 獲取設備xml   
      ```# virsh nodedev-dumpxml pci_8086_3a6c```
      3. detach設備  
      ```# virsh nodedev-dettach pci_8086_3a6c```
      4. 改動虛擬機xml文件(將dumpxml查詢到的bus,slot,function填入) 
      <devices>
      ......
      <hostdev mode='subsystem' type='pci' managed='yes'>
       <source>
         <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
       </source>
      </hostdev>
      ......
      </devices>
      5. 啟動虛擬機  
      
      • qemu
      1. unbind pci設備  
        modprobe pci_stub
        lspci -D -nn查詢pci設備(domain,slot,bus,function)和(vendor id, device id )
        以設備(01:00.0, vendor & device ID 8086:10b9)為例:
        echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
        echo 0000:01:00.0 > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
        echo 0000:01:00.0 > /sys/bus/pci/drivers/pci-stub/bind
      2. 啟動虛擬機
        -device pci-assign,host=01:00.0
      
  • 怎樣將直通設備相應
    host上直通設備與虛擬機中設備相應關系確定方法。
    能夠通過hostdev中添加address(不是source中的address)確定設備在虛擬機中的掛載路徑。
    虛擬機種通過lspci查看就可以相應起來。


http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM

pci passthrough(VFIO)2

VFIO在kernel3.6/qemu1.4以后支持,眼下僅僅支持PCI設備。
VFIO是一套用戶態驅動框架,提供兩種基本服務:

  • 向用戶態提供設備訪問接口
  • 向用戶態提供配置IOMMU接口

VFIO能夠用於實現高效的用戶態驅動。

在虛擬化場景能夠用於device passthrough。
通過用戶態配置IOMMU接口,能夠將DMA地址空間映射限制在進程虛擬空間中。


這對高性能驅動和虛擬化場景device passthrough尤其重要。

相對於傳統方式,VFIO對UEFI支持更好。
VFIO技術實現了用戶空間直接訪問設備。無須root特權,更安全。功能很多其它。


http://lwn.net/Articles/509153/http://lwn.net/Articles/474088/https://www.ibm.com/developerworks/community/blogs/5144904d-5d75-45ed-9d2b-cf1754ee936a/entry/vfio?lang=en

  • 操作方法
    • 安裝kernel module
      sudo modprobe vfio
      sudo modprobe vfio-pci
    • 設備unbind
      1. 查看iommu_group及其下全部設備
      cd /sys/bus/pci/devices/0000:0d:00.0/
      readlink iommu_group    #查看iommu_group名字
      ll iommu_group/devices  #查看iommu_group下設備
      2. 須要將iommu_group下全部設備unbind並加入到iommu_group中  
      echo 0000:0d:00.0 > /sys/bus/pci/devices/0000:0d:00.0/driver/unbind   
      echo 1180 e823 > /sys/bus/pci/drivers/vfio-pci/new_id   
    
    • 啟動虛擬機
      -device vfio-pci,host=0000:03:00.0
    

    參考http://blog.csdn.net/richardysteven/article/details/9008971

IOMMU

IOMMU
IOMMU:input/output memory management unit。
連接DMA io bus和主存。完畢從設備虛擬地址到物理地址的映射。

以及提供對故障設備的內存保護的功能。

  • 長處
    • 因為IOMMU的映射。能夠將多個不連續的物理地址映射為大塊連續的地址供設備使用,便於簡化驅動設計
    • 使舊設備(32bit設備)能夠使用高位地址。

      (能夠改善內存使用。提高性能)

    • 內存保護。避免設備使用不屬於它的地址
    • 提供硬件中斷remapping功能
  • 缺點
    • 地址轉換和管理開銷帶來的性能降級
    • 消耗物理內存
  • 虛擬化中的應用
    一般來說。因為內存地址不同,虛擬機中的操作系統無法直接訪問host上的設備。
    通過IOMMU,能夠將設備地址在虛擬機中和host中映射為同樣的支持。供虛擬機使用。

    這樣的做法也能夠緩解IO delay。



免責聲明!

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



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