KVM 환경에서 Pass-Through 기능을 사용하여, 가상머신에 GPU를 할당시 발생하는 이슈가 있다.

vfio: error, group 21 is not viable, please ensure all devices within the iommu_group are bound to their vfio bus driver.

이는 아래와 같은 방식으로 해결 볼 수 있다.


1. PCI 정보를 확인한다.

[root@gpu-host ~]# lspci -nnv | grep NVIDIA
01:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 3GB] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GP106 High Definition Audio Controller (rev a1)


2. KVM PCI 목록 조회
가상머신에서 사용 할 디바이스를 1번의 lspci를 통해 확인 된 번호와 일치하는 디바이스를 확인 한다.

[root@gpu-host ~]# virsh nodedev-list | egrep 'pci_0000_01_00_''
pci_0000_01_00_0
pci_0000_01_00_1


3. Audio 디바이스 비활성화
가상머신에 GPU만 할당하여 사용 할 것이라 Audio 디바이스는 분리(detach) 시킨다.

[root@gpu-host ~]# virsh nodedev-detach pci_0000_01_00_1


4. IOMMU Group 조회
GPU로 사용 될 PCI 디바이스의 실제 주소를 얻는다.

[root@gpu-host ~]# virsh nodedev-dumpxml pci_0000_01_00_0
<device>
  <name>pci_0000_01_00_0</name>
  <path>/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0</path>
  <parent>pci_0000_00_01_0</parent>
  <driver>
    <name>pci-stub</name>
  </driver>
  <capability type='pci'>
    <domain>0</domain>
    <bus>1</bus>
    <slot>0</slot>
    <function>0</function>
    <product id='0x1c02'>GP106 [GeForce GTX 1060 3GB]</product>
    <vendor id='0x10de'>NVIDIA Corporation</vendor>
    <iommuGroup number='21'>
      <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
      <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
    </iommuGroup>
    <pci-express>
      <link validity='cap' port='0' speed='8' width='16'/>
      <link validity='sta' speed='8' width='8'/>
    </pci-express>
  </capability>
</device>


5. 가상머신 GPU 추가
virt-manager를 통해 PCI 디바이스를 추가 하거나, virsh 명령어를 통해 디바이스를 추가 한다.

[root@gpu-host ~]# virsh edit --domain=gpu-worker1
....
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
        <source>
          <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
        </source>
    </hostdev>
....


6. GPU 확인
가상머신에서 lspci 명령어를 통해 GPU가 추가 됨을 확인 한다.

[root@gpu-vm ~]# lspci -nnv | grep NVIDIA
00:04.0 VGA compatible controller [0300]: NVIDIA Corporation GP106 [GeForce GTX 1060 3GB] [10de:1c02] (rev a1) (prog-if 00 [VGA controller])