Version 8 (modified by rider, 15 years ago) (diff) |
---|
實作七:Xen PCI Passthrough 操作
【前言】
- 小叮嚀
- 為了使 Xen patched Kerenl 能支援 PCI Passthrough, 請務必確認以下Xen 相關的核心配置.
CONFIG_XEN_PCIDEV_FRONTEND=y CONFIG_XEN_PCIDEV_BACKEND=y CONFIG_XEN_PCIDEV_BACKEND_PASS is not set CONFIG_XEN_PCIDEV_BACKEND_VPCI=y CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
- 為了使 Xen patched Kerenl 能支援 PCI Passthrough, 請務必確認以下Xen 相關的核心配置.
- 小技巧
- Binding at Boot-Time.
- 直接將顯示卡所佔的 PCI_Address 在開機時就隱藏起來,使得一開始便能直接 bind 到該 PCI_Address.
- 透過 lspci 指令來查詢顯示卡所佔的實體 PCI Address.
/boot/vmlinuz-2.6.22.9 root=UUID=d3fa560e-7071-46d8-a168-036f40960c7b ro console=tty0 pciback.hide=(0000:01:00.0)
- 如果透過 lspci 指令查出顯示卡為 unknown 或是其他不明資訊, 請先更新 PCI ID database 試看看.
$ update-pciids
【Step 0: 流程】
- 本範例將說明如何使用及設定 Xen PCI Passthrough
【Step 1: 首先查看主機上的顯卡資訊】
$ lspci -vv | more
01:00.0 VGA compatible controller: nVidia Corporation G92 [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: nvidia Kernel modules: nvidia, nvidiafb
【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 node1 --ip xxx.xxx.xxx.xxx
【Step 3: PCI Frontend Configuration 設定你的 DomU 】
$ sudo vim /etc/xen/node1.cfg
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 = 'node1' # # Networking # vif = [ 'ip=xxx.xxx.xxx.xxx,mac=00:16:3E:AA:70:5C' ] # # Behaviour # on_poweroff = 'destroy' on_reboot = 'restart' on_crash = 'restart'
【Step 4: PCI Backend Configuration 設定你的 Dom0 】
- 切換身份為 Super user.
$ sudo su -
- 隱藏 dom0 的PCI 匯流排的位址, 並交由 pciback 模組來控制該匯流排存取權.
$ echo -n "0000:01:00.0" > /sys/bus/pci/drivers/nvidia/unbind
- 將 dev_ids 轉到 pciback 成為新的 binding slot.
$ 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
- 警告: 請確認您的顯示卡資源沒有被其 Kernel module 所佔有及控制: 您顯示卡的 symlink 不應該存在著.
PATH: /sys/bus/pci/devices/0000:01:00.0/ driver -> ../../../../bus/pci/drivers/nvidia ---> This symlink shouldn't exist.
【Step 5: 硬體直接存取設定】
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
(pci_ids # Entries are formated as follows: # <vendor>:<device>[:<subvendor>:<subdevice>] ('10de:0605' # NVIDIA 9800GT ) )
【Step 6: 啟動並登入你的虛擬機器 DomU 】
- 說明: 用 root 免密碼先登入,然後建立自己的帳號. 改用自己的帳號登入(亦可用 root 登入 , 不新建帳號 )
- @ Dom0
$ sudo xm create -c node1.cfg
- @ DomU
$ sudo adduser username $ sudo vim /etc/sudoers
username ALL=(ALL) ALL
【Step 7: 設定你的 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