openSUSE Leap 16

KVM : GPU パススルー2025/10/30

 

仮想マシンの GPU パススルーの設定です。

設定により、仮想マシン上で GPU が利用できるようになり、GPU の高い処理性能を活かした GPU コンピューティングによるマシーンラーニングが仮想マシン上でも実行できるようになります。

前提として、BIOS の設定で VT-d (Intel) または AMD IOMMU (AMD) を有効にしておく必要があります。

[1] KVM ホストで IOMMU 機能と [vfio-pci] カーネルモジュールの有効化を実施します。
dlp:~ #
vi /etc/default/grub
# 12行目 : 追記
# AMD CPU の場合は [amd_iommu=on] を指定
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"

# 変更を反映

dlp:~ #
grub2-mkconfig -o /boot/grub2/grub.cfg

Generating grub configuration file ...
Found theme: /boot/grub2/themes/openSUSE/theme.txt
Found linux image: /boot/vmlinuz-6.12.0-160000.5-default
Found initrd image: /boot/initrd-6.12.0-160000.5-default
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
110.788858 | DM multipath kernel driver not loaded
Found CentOS Stream 9 on /dev/mapper/cs-root
Found Debian GNU/Linux 13 (trixie) on /dev/mapper/debian--vg-root
Adding boot menu entry for UEFI Firmware Settings ...
done

# グラフィックカードの PCI 識別番号と [ベンダー ID:デバイス ID] を調べる
# PCI 識別番号 ⇒ 以下では [01:00.*]
# ベンダー ID:デバイス ID ⇒ 以下では [10de:***]

dlp:~ #
lspci -nn | grep -i nvidia

81:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA104 [GeForce RTX 3060] [10de:2487] (rev a1)
81:00.1 Audio device [0403]: NVIDIA Corporation GA104 High Definition Audio Controller [10de:228b] (rev a1)

dlp:~ #
vi /etc/modprobe.d/vfio.conf
# 新規作成 : [ids=***] に調べた [ベンダー ID:デバイス ID] を指定する
options vfio-pci ids=10de:2487,10de:228b 

dlp:~ #
echo 'vfio-pci' > /etc/modules-load.d/vfio-pci.conf

dlp:~ #
# 再起動後 [IOMMU enabled] になっていれば OK

dlp:~ #
dmesg | grep -E "DMAR|IOMMU"

[    0.009967] [      T0] ACPI: DMAR 0x000000007A5C3130 000108 (v01 ALASKA A M I    00000001 INTL 20091013)
[    0.009998] [      T0] ACPI: Reserving DMAR table memory at [mem 0x7a5c3130-0x7a5c3237]
[    0.028105] [      T0] DMAR: IOMMU enabled
[    0.105968] [      T0] DMAR: Host address width 46
[    0.105969] [      T0] DMAR: DRHD base: 0x000000fbffc000 flags: 0x0
[    0.105989] [      T0] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap d2078c106f0466 ecap f020df
[    0.105992] [      T0] DMAR: DRHD base: 0x000000c7ffc000 flags: 0x1
[    0.106003] [      T0] DMAR: dmar1: reg_base_addr c7ffc000 ver 1:0 cap d2078c106f0466 ecap f020df
[    0.106005] [      T0] DMAR: RMRR base: 0x0000007dbcf000 end: 0x0000007dbddfff
[    0.106014] [      T0] DMAR: ATSR flags: 0x0
[    0.106027] [      T0] DMAR: RHSA base: 0x000000c7ffc000 proximity domain: 0x0
[    0.106029] [      T0] DMAR: RHSA base: 0x000000fbffc000 proximity domain: 0x1
[    0.106032] [      T0] DMAR-IR: IOAPIC id 10 under DRHD base  0xfbffc000 IOMMU 0
[    0.106034] [      T0] DMAR-IR: IOAPIC id 8 under DRHD base  0xc7ffc000 IOMMU 1
[    0.106036] [      T0] DMAR-IR: IOAPIC id 9 under DRHD base  0xc7ffc000 IOMMU 1
[    0.106038] [      T0] DMAR-IR: HPET id 0 under DRHD base 0xc7ffc000
[    0.106039] [      T0] DMAR-IR: x2apic is disabled because BIOS sets x2apic opt out bit.
[    0.106041] [      T0] DMAR-IR: Use 'intremap=no_x2apic_optout' to override the BIOS setting.
[    0.106928] [      T0] DMAR-IR: Enabled IRQ remapping in xapic mode
[    0.562144] [      T1] DMAR: No SATC found
[    0.562148] [      T1] DMAR: dmar0: Using Queued invalidation
[    0.562156] [      T1] DMAR: dmar1: Using Queued invalidation
[    0.574308] [      T1] DMAR: Intel(R) Virtualization Technology for Directed I/O

# 起動時に設定が有効になっていれば OK

dlp:~ #
dmesg | grep -i vfio

[    3.826067] [   T1008] VFIO - User Level meta-driver version: 0.3
[    3.837474] [   T1008] vfio_pci: add [10de:2487[ffffffff:ffffffff]] class 0x000000/00000000
[    3.838235] [   T1008] vfio_pci: add [10de:228b[ffffffff:ffffffff]] class 0x000000/00000000
[2] 以上で準備完了です。例として openSUSE Leap 16 の仮想マシンを作成します。
[--host-device] に使用したい GPU を指定します。
dlp:~ # virt-install \
--name opensuse16 \
--ram 8192 \
--disk path=/var/kvm/images/opensuse16.img,size=100 \
--vcpus 4 \
--os-variant opensuse16.0 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0,password=password \
--video virtio \
--host-device 81:00.0 \
--features kvm_hidden=on \
--machine q35 \
--cdrom /home/Leap-16.0-offline-installer-x86_64.install.iso 
[3] GPU を割り当てていない既存の仮想マシンに GPU を割り当てる場合は、以下のように編集します。
dlp:~ #
virsh edit opensuse16
.....
.....

  # [features] セクション内に追記
  <features>
    ......
    .....
    <kvm>
      <hidden state='on'/>
    </kvm>
  </features>

.....
.....

  # [devices] セクション内に追記
  <devices>
    ......
    .....
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        # [bus='***'] にホストデバイスを指定
        <address domain='0x0000' bus='0x81' slot='0x00' function='0x0'/>
      </source>
      # [bus='***'] に他と重複しない番号を指定
      <address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/>
    </hostdev>
  </devices>
[4] 仮想マシン作成後、仮想マシン上でグラフィックカードが認識されていれば OK です。
localhost:~ #
lspci | grep -i nvidia

05:00.0 VGA compatible controller: NVIDIA Corporation GA104 [GeForce RTX 3060] (rev a1)
関連コンテンツ