概述
virtio-gpu是GPU分時複用方案,相對與透傳方案,virito-gpu可以模擬的gpu更多。能夠更充分利用GPU資源。
本文的實踐主要基於virtio-gpu官方博客 的搭建指導。
基本環境搭建
選擇centos 8圖形界面,CentOS Linux release 8.1.1911
安裝OS之後,如果不被牆,可以使用默認的yum源,如果沒有yum源配置,安裝centos-repos-8.1-1.1911.0.8.el8.x86_64.rpm
yum高級工具yumdownloader安裝yum -y install yum-utils.noarch
基本編譯開發套件安裝yum -y groupinstall Development
組件編譯
libvirt
wget http://vault.centos.org/8.0.1905/virt/Source/advanced-virtualization/libvirt-5.6.0-10.el8.src.rpm
安裝libvirt源碼包rpm -ivh libvirt-5.6.0-10.el8.src.rpm
安裝libvirt編譯環境依賴包yum-builddep libvirt
編譯libvirt源碼包cd $HOME/rpmbuild && rpmbuild -bb SPECS/libvirt.spec --define "_topdir $(pwd)"
進入RPMS目錄安裝rpm包
qemu-kvm
wget http://vault.centos.org/8.0.1905/virt/Source/advanced-virtualization/qemu-kvm-4.1.0-23.el8.1.src.rpm
安裝qemu-kvm源碼包rpm -ivh qemu-kvm-4.1.0-23.el8.1.src.rpm
安裝qemu-kvm編譯環境依賴包yum-builddep qemu-kvm
高版本qemu直接rpmbuild編譯會報缺少virglrenderer-devel
,這個依賴在centos上沒有找到,直接下載源碼編譯解決這個依賴問題,步驟在下一節介紹,假設現在qemu編譯依賴已經解決
取出qemu-kvm源碼包cd $HOME/rpmbuild/SOURCES && tar -xf qemu-4.1.0.tar.xz"
進入源碼目錄配置./configure --target-list=x86_64-softmmu --prefix=/usr --enable-kvm --enable-virglrenderer
編譯並安裝make -j$(nproc --ignore=1) && make install
virglrenderer
virglrenderer編譯依賴兩個工具分別是cmak和ninja,分別安裝yum install -y cmake ninja-build
virglrenderer還依賴一個libepoxy庫,分別下載這兩個組件的源碼
下載libepoxy git clone https://github.com/anholt/libepoxy.git
下載virglrenderer git clone git://anongit.freedesktop.org/virglrenderer
編譯libexpoxy依賴glesv2,安裝yum install mesa-libGLES-devel
編譯libexpoxy,只能用ninja方式編譯:
mkdir _build && cd _build
meson --prefix=/usr
ninja
sudo ninja install
編譯virglrender,可以用ninja方式編譯,也可以用make編譯,步驟如下:
./configure --enable-autotools --enable-debug --prefix=/usr
make -j$(nproc --ignore=1)
make install
在上述所有組件編譯安裝完成後,運行virsh version
查看虛擬化組件版本,成功的輸出應該是這樣:
應用
準備磁盤文件qemu-img create -f qcow2 /home/test_vm.qcow2 80G
創建測試虛機的xml文件test_vm.xml如下:
<domain type='kvm' id='2'>
<name>test_vm</name>
<uuid>720a0f9f-2893-4712-87e4-b7a61454dd7a</uuid>
<maxMemory slots='16' unit='KiB'>16777216</maxMemory>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<vcpu placement='static'>4</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64' machine='pc-i440fx-4.1'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<cpu>
<numa>
<cell id='0' cpus='0-1' memory='2097152' unit='KiB'/>
<cell id='1' cpus='2-3' memory='2097152' unit='KiB'/>
</numa>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/test_vm.qcow2'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</disk>
<controller type='usb' index='0' model='piix3-uhci'>
<alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'>
<alias name='pci.0'/>
</controller>
<input type='mouse' bus='ps2'>
<alias name='input0'/>
</input>
<input type='keyboard' bus='ps2'>
<alias name='input1'/>
</input>
<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1' keymap='en-us'>
<listen type='address' address='127.0.0.1'/>
</graphics>
<video>
<model type='cirrus' vram='16384' heads='1' primary='yes'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</memballoon>
</devices>
<seclabel type='dynamic' model='selinux' relabel='yes'>
<label>system_u:system_r:svirt_t:s0:c799,c857</label>
<imagelabel>system_u:object_r:svirt_image_t:s0:c799,c857</imagelabel>
</seclabel>
<seclabel type='dynamic' model='dac' relabel='yes'>
<label>+0:+0</label>
<imagelabel>+0:+0</imagelabel>
</seclabel>
</domain>
定義虛擬機virsh define test_vm.xml
關閉防火牆,設置qemu訪問權限:
cat /etc/sysconfig/selinux
SELINUX=disabled
cat /etc/libvirt/qemu.conf
user = "root"
group = "root"
啓動虛機virsh start test_vm
,這時啓動的虛機還沒有配置virtio-gpu
libvirt默認將第一個顯卡配置成vga模式保持兼容性,同時如果顯卡設置成virtio,默認使用virtio-gpu-pci設備,因此修改libvirt,讓其默認使用virtio-gpu,重新編譯libvirt。
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a5958c3..0e1a5cf 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4660,9 +4660,11 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
* model with VGA compatibility mode. For some video devices on some
* architectures there might not be such model so fallback to one
* without VGA compatibility mode. */
+#if 0
if (video->primary && qemuDomainSupportsVideoVga(video, qemuCaps))
model = qemuDeviceVideoTypeToString(video->type);
else
+#endif
model = qemuDeviceVideoSecondaryTypeToString(video->type);
if (!model || STREQ(model, "")) {
@@ -4673,11 +4675,13 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
}
if (STREQ(model, "virtio-gpu")) {
+#if 0
if (qemuBuildVirtioDevStr(&buf, "virtio-gpu", qemuCaps,
VIR_DOMAIN_DEVICE_VIDEO, video) < 0) {
goto error;
}
} else {
+#endif
virBufferAsprintf(&buf, "%s", model);
}
啓動虛機時添加如下xml,表示將圖形庫的操作交給本地的DRI設備,也就是顯卡設備,同時使用spice連接虛機:
<graphics type='spice' autoport='yes'/>
<graphics type='egl-headless'>
<gl rendernode='/dev/dri/renderD128'/>
</graphics>
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<qemu:commandline>
<qemu:arg value='-set'/>
<qemu:arg value='device.video0.xres=720'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.video0.yres=1280'/>
</qemu:commandline>
</domain>
最後啓動虛機,qemu命令行如下,表示virtio-gpu使用了本地的顯卡加速處理圖像信息: