2015年6月28日 星期日

QEMU VFIO實作

實作VFIO首先要先確定你的硬體是否有支援
  • Intel的CPU要有支援VT-D
  • AMD的CPU要有支援AMD-VI
  • 主機板也是要選用有支援VT-D/AMD-VI功能,才可以使用VFIO功能
我的電腦是Intel的E3-1230V2,以下用Intel的CPU為例
直接去Intel官網查CPU型號,找到以下技術且為YES就表示你的CPU有支援VT-D


 
接下來就要看主機板有沒有支援VT-D/AMD-VI,以國內4家華碩、微星、技嘉、華擎來說
依我使用的是Z77/H77晶片為例
  • 華碩:BIOS完全沒有支援VT-D功能,要X79、X99等級以上才有
  • 微星:BIOS大部份都有支援VT-D
  • 華擎:BIOS大部份都有支援VT-D
  • 技嘉:BIOS少部份支援,如UD5H、D3H等,剩下也是要X79、X99等級以上才有
以上主機板是我從網路找出來稍微整理的,所以除非你要買到伺服器級的主機板
不然BIOS想要有VT-D功能建議買微星或華擎的

#確定你硬體都有支援後在開始實作VFIO功能

########################################################

1. 把核心有關VFIO的都編譯起來之後重開機

2. 在/etc/modules加入以下模組

pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel

3. 在/etc/default/grub加入以下參數
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1"

4. 執行以下指令
# update-grub

5. 重新開機
# shutdown -r now

接下來要設定給QEMU使用的顯卡

1. 使用 lspci -nn 觀察你所安裝的顯卡
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation G98 [GeForce 8400 GS Rev. 2] [10de:06e4] (rev a1) <-- HOSTGPU: 8400GS
02:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:13c2] (rev a1) <-- GUESTGPU: GTX 970
02:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:0fbb] (rev a1) <-- GTX 970 aduio

2. 在/etc/initramfs-tools/modules加入QEMU要用的GPU,如下指令
pci_stub ids=10de:13c2,10de:0fbb

3. 再執行以下指令
# update-initramfs -u

4. 重新開機
# shutdown -r now

5. 輸入 dmesg | grep pci-stub 指令後,會看到底下訊息
[    1.834707] pci-stub: add 10DE:13C2 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    1.834715] pci-stub 0000:02:00.0: claimed by stub
[    1.834720] pci-stub: add 10DE:0FBB sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    1.834724] pci-stub 0000:02:00.1: claimed by stub

6. /etc/vfio-pci.cfg 建立這檔案,並加入在上面使用 lspci -nn 查到的顯卡
0000:02:00.0
0000:02:00.1

7. 接下來建立啟動虛擬機的script檔,我的script檔叫vm1
#!/bin/bash

configfile=/etc/vfio-pci.cfg
MEMORY=4096
HDA=win8.img
MAC="DE:AD:BE:CF:EC:B9"
BRIDGE=br10
VGA=02:00.0


vfiobind() {
    dev="$1"
        vendor=$(cat /sys/bus/pci/devices/$dev/vendor)
        device=$(cat /sys/bus/pci/devices/$dev/device)
        if [ -e /sys/bus/pci/devices/$dev/driver ]; then
                echo $dev > /sys/bus/pci/devices/$dev/driver/unbind
        fi
        echo $vendor $device > /sys/bus/pci/drivers/vfio-pci/new_id


 }

modprobe vfio-pci

cat $configfile | while read line;do
    echo $line | grep ^# >/dev/null 2>&1 && continue
        vfiobind $line
done

qemu-system-x86_64 -enable-kvm -m $MEMORY -cpu host,kvm=off \
-smp 4,sockets=1,cores=4,threads=1 \
-vga none  \
-boot c \
-device vfio-pci,host=$VGA,x-vga=on \
-device vfio-pci,host=02:00.1
-drive file=win8.img,format=raw \
-net nic,macaddr=$MAC -net nic,model=e1000 -net bridge,br=$BRIDGE

8. 把vm1權限改成755
# chmod 755 vm1

9. 這樣就可以直接執行vm1
# ./vm1

沒有留言:

張貼留言