天天看點

VGA GPU passthrough qemu虛拟桌面pci穿透

轉載請注明:http://blog.csdn.net/hubbybob1/article/details/77101913

上一篇文章已經介紹過顯示卡穿透的linux核心準備過程了,下面就要講述穿透的額過程。上篇文章:http://blog.csdn.net/hubbybob1/article/details/73920296

首先,檢視cpu是否支援虛拟化:

egrep -o '(vmx|svm)' /proc/cpuinfo 
//如果支援就會顯示如下
vmx
或者
svm
           

其次就是要檢視cpu是否支援 GPU 的PIC穿透,其實這個操作對cpu的要求挺高的,要進入BIOS去檢視VT-d。确定好這些就可以操作了。

一、linux下的穿透(主要側重Ubuntu)

1.修改linux的啟動項

//通過指令,修改引導檔案
vim /etc/default/grub 
//如下内容
#GRUB_HIDDEN_TIMEOUT=0
GRUB_CMDLINE_LINUX_DEFAULT="text"
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt default_hugepagesz=1G hugepagesz=1G hugepages=16 kvm.ignore_msrs=1 intremap=no_x2apic_optout video=efifb:off,vesafb:off"

//使修改的引導檔案生效,這個Ubuntu和Centos7下的有所不一樣
//ubuntu兩個指令
update-grub
update-grub2
//centos7下,很多介紹是/boot/grub2/grub.conf,但是這個并不生效,真正生效的是下面的這個
grep2-mkconfig -o /boot/efi/EFI/centos/grub.conf
           

添加黑名單

編輯vim /etc/modprobe.d/blacklist.conf 

blacklist i915
blacklist efifb
blacklist radeon

           

執行完上面的操作時,重新開機,reboot

2.重新開機後檢視啟動項是否修改成功,

cat /proc/cmdline//檢視修改的grub
dmesg | grep -e DMAR -e IOMMU//檢視DMAR 的映射
           

兩個指令截圖如下:這樣就是修改成功了

VGA GPU passthrough qemu虛拟桌面pci穿透

3.安裝依賴庫

//ubuntu下的安裝
apt-get install libtool liblog4cpp5-dev libavcodec-dev libssl-dev xlibmesa-glu-dev libasound-dev libpng12-dev libfreetype6-dev libfontconfig1-dev libogg-dev libxrandr-dev kvm libgcrypt-dev libsdl-dev libnss3-dev libpixman-1-dev libxfixes-dev libjpeg8-dev libsasl2-dev python-pyparsing gtk+-3.0
apt-get install liblzo2-dev libsnappy-dev libgtk-3-dev librdmacm-dev libibverbs-dev xfslibs-dev libssh2-1-dev libaio-dev glusterfs-server libiscsi-dev libusb-1.0-0-dev libcap-dev libsdl2-dev
//centos7下的安裝
yum install lzo-devel snappy-devel gtk2-devel gtk3-devel librdmacm-devel xfsprogs-devel libssh2-devel libaio-devel glusterfs-api-devel libiscsi-devel spice-server-devel libusb1-devel usbredir-devel libcap-devel libattr-devel SDL-devel

           

反正就是缺少什麼就安裝什麼

4.安裝相關的環境

a。celt-0.5.1.3.tar.gz

下載下傳:http://www.celt-codec.org/downloads/ (最新的沒用過,可以嘗試一下)

tar zxvf celt-0.5.1.3.tar.gz
cd celt-0.5.1.3/
./configure
make
make install
           

b。安裝libcacard-2.5.2.tar

下載下傳:https://www.spice-space.org/page/Libcacard (這些下載下傳都能通過spice官網下載下傳)

tar xvf libcacard-2.5.2.tar 
cd libcacard-2.5.2/
./configure
make
make install
           

出現錯誤:

vscclient.o: undefined reference to symbol ‘[email protected]@GLIBC_2.2.5’

error adding symbols: DSO missing from command line

修改Makefile 163行

LIBS= -lz -lrt -lm -lpthread

c。安裝 spice-protocol-0.12.12.tar.bz2

下載下傳:https://www.spice-space.org/download.html

tar jxvf spice-protocol-0.12.12.tar.bz2
cd spice-protocol-0.12.12/
./configure
make && make install
           

d。安裝spice server spice-0.12.8.tar.bz2

下載下傳:https://www.spice-space.org/download.html

tar jxvf spice-0.12.8.tar.bz2
cd spice-0.12.8/
./configure  --enable-smartcard --disable-xinerama --enable-opengl --enable-usbdir=yes --enable-usbredir=yes
make
make install
           

e。安裝usb重定向sbredir-0.7.tar.bz2

下載下傳:https://www.spice-space.org/download.html

tar jxvf usbredir-0.7.tar.bz2
cd usbredir-0.7/
./configure
make && make install
           

f。安裝spice-gtk

下載下傳:https://www.spice-space.org/download.html

可以手動安裝也可以自動安裝

//自動安裝
apt-get install libspice-client-gtk-3.0-dev
//下載下傳後解壓安裝,configure參數與spice server一樣
           

g。最關鍵的安裝就是QEMU的安裝

下載下傳:https://www.qemu.org/download/ (下載下傳最新版本)

tar Jxvf qemu-2.10.1.tar.xz
cd qemu-2.10.1/

./configure  --target-list=x86_64-softmmu --enable-kvm --enable-gtk --with-gtkabi=3.0 --enable-virtfs --enable-tcg-interpreter --enable-xfsctl --enable-libiscsi --enable-glusterfs --enable-snappy --enable-lzo --enable-rdma --enable-linux-aio --enable-vhost-net --enable-spice --enable-smartcard  --enable-libusb --enable-usb-redir --enable-guest-agent  --enable-libssh2 --enable-sdl --audio-drv-list='oss alsa sdl' 

make && make install
           

到此相關的依賴庫和環境就搭建完畢了。

5。編寫穿透腳本

編寫腳本vfio-bind檔案如下

#!/bin/bash

modprobe vfio-pci

for dev in "[email protected]"; do
        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
done
           

将腳本命名為vfio-bind 并cp到/usr/bin/

cp vfio-bind /usr/bin/
           

然後你可以終端輸入vfio然後tab鍵看是否能将此指令補全為vfio-bind

6。在虛拟機啟動腳本内即指令qemu-system-x86_64指令下添加如下參數

//先加載子產品
modprobe vfio
modprob vfio_pci
//解綁GPU PCI的ID
vfio-bind 0000:00:02.0 //這個指令相當于下面的指令
echo 0000:00:02.0 > /sys/bus/pci/devices/0000:00:02.0/driver/ubind
echo "vfio-pci" > /sys/bus/pci/devices/0000:00:02.0/driver_override
echo 8086 1912 > /sys/bus/pci/drivers/vfio-pci/new_id
//再解綁回來,就是解綁的反過程xhci_hcd,可以通過lspci指令檢視,下面會講到
echo 0000:00:14.0 > /sys/bus/pci/drivers/vfio-pci/unbind
echo0000:00:14.0 > /sys/bus/pci/drivers/xhci_hcd/bind
//qemu參數
-device vfio-pci,host=00:02.0,bus=pci.0,addr=ox2
           

如何檢視VGA的ID呢( 0000:00:02.0)可以檢視/sys/bus/pci/devices/下的

ls /sys/bus/pci/devices/ #檢視有多少驅動
lspci          #檢視每個ID對應的驅動
           

完成上面的指令就可以檢視得知VGA對應的ID為0000:00:02.0,usb控制器對應的是0000:00:14.0,在确定穿透之前,先确定每個裝置所在的分組,同一分組的裝置必須同時穿透,不然穿透不成功的,如下方法測試,編寫腳本group.sh如下:

#!/bin/bash
shopt -s nullglob
for d in /sys/kernel/iommu_groups/*/devices/*; do
	n=${d#*/iommu_groups/*}; n=${n%%/*}
	printf 'IOMMU Group:%s  ' "$n"
	lspci -nns "${d##*/}"
done;
           

檢視後的結果如下:

VGA GPU passthrough qemu虛拟桌面pci穿透

可以檢視到VGA在group1内,而且在組内隻有一個,但是可以看到在,group 3内有兩個裝置 usb controller和signal processing controller兩個,如果要穿透USB的話必須要同時加上signal processing controller (0000:00:14.2),同樣可以看到group 7也是一樣的。

是以VGA和USB同時穿透如下:

vfio-bind 0000:00:02.0 0000:00:14.2 0000:00:14.0 #解綁
//qemu-system-x86_64指令參數
-device vfio-pci,host=00:02.0,bus=pci.0,addr=0x2 \
-device vfio-pci,host=00:14.2 \
-device vfio-pci,host=00:14.0 \
           

解綁前後的對比,使用指令

lspci -nnk 
lspci -vvk #這個指令更詳細一點
           

解綁前

VGA GPU passthrough qemu虛拟桌面pci穿透

解綁後,就不能使用本地的終端檢視了,因為本地的usb已經不存在,是以隻用通過遠端ssh連接配接來檢視。

VGA GPU passthrough qemu虛拟桌面pci穿透

通過對比可以看到,本地解綁後的驅動都變成vfio-pci.到此基本上VGA和USB的穿透也就基本結束了,看着過程很複雜其實很簡單。

需要注意的是:

1,在穿透VAG時 的qemu啟動指令的執行環境,不能是桌面環境,應為桌面環境VGA正在被占用,是沒辦法穿透的,必須在字元終端界面或者遠端ssh連接配接終端的情況下才會穿透成功。

2.在穿透USB的情況是,一旦USB解綁了,在本地是無法使用的,而在虛拟機啟動的過程中也是無法使用的,因為虛拟機windows下并沒有USB的驅動,需要安裝,那這就有問題了,一旦解綁了,在ubuntu下無法使用,在windows下也無法使用,這該怎麼辦,其實可以這樣解決,下載下傳安裝帶有USB3.0驅動的ISO鏡像,不用在自己安裝或者先穿透USB,不穿透VGA,通過spice遠端連接配接,安裝驅動精靈,安裝usb驅動,安裝好後,再重新啟動VGA穿透,兩種方法都能成功。

3.在上面的圖中我們可以看到聲霸卡的穿透也是可以的,但是要同時穿透4個裝置,有的cpu的聲霸卡和網卡是在一個組内,這樣就不好穿透聲霸卡了,影響網卡的使用,網卡盡量橋接,本地ubuntu能使用,虛拟機也能使用,如果兩個裝置在一起,就隻能模拟聲霸卡來解決了。(如何模拟聲霸卡我會在另一篇文章中描述)

4.在使用顯示卡穿透時,一定要注意幾個參數的使用,什麼意思自己去查qemu文檔

-full-screen \
-vga none \
-nodefaults \
-nographic
           

參考:

https://bbs.archlinux.org/viewtopic.php?id=162768

https://wiki.debian.org/VGAPassthrough

繼續閱讀