轉載請注明: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 的映射
兩個指令截圖如下:這樣就是修改成功了
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在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 #這個指令更詳細一點
解綁前
解綁後,就不能使用本地的終端檢視了,因為本地的usb已經不存在,是以隻用通過遠端ssh連接配接來檢視。
通過對比可以看到,本地解綁後的驅動都變成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