wiki:Xen_Lab7

Version 2 (modified by rider, 15 years ago) (diff)

--

實作七:Xen PCI Passthrough 操作


【Step 1: 連線到遠端主機】

  • 以下兩種連線方式擇一使用.
    $ ssh 140.xxx.xxx.xxx
    $ vncviewer 140.xxx.xxx.xxx
    

【Step 2: 產生一台虛擬機器】

  • 設定你想要怎樣規格的虛擬機器.
    $ sudo vim /etc/xen-tools/xen-tools.conf
    
    dir = /home
    install-method = debootstrap
    size   = 8Gb      # Disk image size.
    memory = 1024Mb    # Memory size
    swap   = 128Mb    # Swap size
    fs     = ext3     # use the EXT3 filesystem for the disk image.
    dist   = hardy    # Default distribution to install. ---> For CUDA Support (Ubuntu 8.0.4)
    image  = sparse   # Specify sparse vs. full disk images.
    gateway   = 140.XXX.XXX.XXX
    netmask   = 255.255.255.0
    broadcast = 140.XXX.XXX.XXX
    kernel      = /boot/vmlinuz-`uname -r`
    initrd      = /boot/initrd.img-`uname -r`
    mirror = http://gb.archive.ubuntu.com/ubuntu/
    ext3_options   = noatime,nodiratime,errors=remount-ro
    ext2_options   = noatime,nodiratime,errors=remount-ro
    xfs_options    = defaults
    reiser_options = defaults
    
    $ sudo xen-create-image --hostname nvidia --ip xxx.xxx.xxx.xxx
    

【Step 3: 查看你的顯卡資訊】

$ lspci -vv
01:00.0 VGA compatible controller: nVidia Corporation GeForce 9800 GT (rev a2)
  Subsystem: ASUSTeK Computer Inc. Device 82a0
  Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
  Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
  Latency: 0
  Interrupt: pin A routed to IRQ 16
  Region 0: Memory at fd000000 (32-bit, non-prefetchable) [size=16M]
  Region 1: Memory at d0000000 (64-bit, prefetchable) [size=256M]
  Region 3: Memory at fa000000 (64-bit, non-prefetchable) [size=32M]
  Region 5: I/O ports at dc80 [size=128]
  [virtual] Expansion ROM at fea00000 [disabled] [size=128K]
  Capabilities: <access denied>
  Kernel driver in use: pciback
  Kernel modules: nvidia, nvidiafb

【Step 4: PCI Frontend Configuration 設定你的 DomU 】

$ sudo vim /etc/xen/nvidia.cfg [[BR]]
kernel      = '/boot/vmlinuz-2.6.22.9'
ramdisk     = '/boot/initrd.img-2.6.22.9'
 
memory      = '1024'
vcpus       = '4'

# 配置你的 PCIE 顯示卡
pci         = ['01:00.0']

root        = '/dev/sda2 ro'
disk        = [
                  'file:/home/domains/nvidia/disk.img,sda2,w',
                  'file:/home/domains/nvidia/swap.img,sda1,w',
              ]
name        = 'nvidia'
 
#
#  Networking
#
vif         = [ 'ip=140.xxx.xxx.xxx,mac=00:16:3E:AA:70:5C' ]
 
#
#  Behaviour
#
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

【Step 5: PCI Backend Configuration 設定你的 Dom0 】

$ sudo su -
  • Hide the device from dom0 so pciback can take control.
    $ echo -n "0000:01:00.0" > /sys/bus/pci/drivers/nvidia/unbind
    
  • Give the dev_ids to pciback, and give it a new slot then bind.
    $ echo -n "0000:01:00.0" > /sys/bus/pci/drivers/pciback/new_slot
    $ echo -n "0000:01:00.0" > /sys/bus/pci/drivers/pciback/bind
    
    $ cat /sys/bus/pci/drivers/pciback/slots\
    
    0000:01:00.0
    
  • Caution: Make sure that the device is not controlled by any driver: there should be no driver symlink for nvidia.
    PATH: /sys/bus/pci/devices/0000:01:00.0/
    driver -> ../../../../bus/pci/drivers/nvidia ---> This symlink shouldn't exist.
    

【Step 6: 硬體直接存取設定】

Permissive Flag

$ sudo vim /etc/xen/xend-pci-permissive.sxp
(unconstrained_dev_ids
     #('0123:4567:89AB:CDEF')
     ('0000:01:00.0')
)

User-space Quirks

$ sudo vim /etc/xen/xend-pci-quirks.sxp [[BR]]
(pci_ids
   # Entries are formated as follows:  
   #     <vendor>:<device>[:<subvendor>:<subdevice>]

   ('10de:0605'   # NVIDIA 9800GT
   )
)

【Step 7: 啟動並登入你的虛擬機器 DomU 】

  • 說明: 用 root 免密碼先登入,然後建立自己的帳號. 改用自己的帳號登入(亦可用 root 登入 , 不新建帳號 )
  • @ Dom0
    $ sudo xm create -c nvidia.cfg
    
  • @ DomU
    $ sudo adduser username
    $ sudo vim /etc/sudoers
    
    username    ALL=(ALL) ALL
    

【Step 8: 設定你的 DomU 基本環境】

  • 設定 locales (系統語系)
    $ sudo vim /etc/profile
    
    # Locale
    export LANGUAGE="en_US.UTF-8"
    export LC_ALL="en_US.UTF-8"
    export LANG="en_US.UTF-8"
    
    $ source /etc/profile
    $ sudo dpkg-reconfigure locales
    
  • 更新 PCI ID Database
    $ sudo apt-get update
    $ sudo apt-get install wget
    $ sudo update-pciids
    
  • 查看顯卡資訊有無正常顯示.
    $ lspci
    
    00:00.0 VGA compatible controller: nVidia Corporation GeForce 9800 GT (rev a2)
    
  • 查看顯卡資源有無順利分配到 DomU.
    $ dmesg | grep pci
    
    pcifront pci-0: Installing PCI frontend
    pcifront pci-0: Creating PCI Frontend Bus 0000:00
    pciback 0000:00:00.0: probing...
    pciback: pcistub_init_devices_late