VirtIO-GPU環境搭建與應用

概述

  • 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使用了本地的顯卡加速處理圖像信息:
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章