Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

E.3. IOMMU 그룹 식별 및 할당 방법

이 예에서는 대상 시스템에 있는 PCI 장치를 식별하고 할당하는 방법을 보여줍니다. 예제 및 자세한 내용은 16.7절. “GPU 장치 할당” 을 참조하십시오.

절차 E.1. IOMMU 그룹

  1. 장치 나열

    virsh nodev-list device-type명령을 실행하여 시스템의 장치를 식별합니다. 이 예제에서는 PCI 장치를 찾는 방법을 보여줍니다. 출력은 간결성을 위해 잘립니다.
    # virsh nodedev-list pci
    
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    [...]
    pci_0000_00_1c_0
    pci_0000_00_1c_4
    [...]
    pci_0000_01_00_0
    pci_0000_01_00_1
    [...]
    pci_0000_03_00_0
    pci_0000_03_00_1
    pci_0000_04_00_0
    pci_0000_05_00_0
    pci_0000_06_0d_0
    
  2. 장치의 IOMMU 그룹화 찾기

    나열된 각 장치에 대해 IOMMU 그룹화를 포함한 장치에 대한 자세한 정보는 virsh nodedev-dumpxml name-of-device 명령을 사용하여 확인할 수 있습니다. 예를 들어 pci_0000_04_00_0(PCI 주소 0000:04:00.0)이라는 PCI 장치의 IOMMU 그룹화를 찾으려면 다음 명령을 사용합니다.
    # virsh nodedev-dumpxml pci_0000_04_00_0
    이 명령은 표시된 것과 유사한 XML 덤프를 생성합니다.

    그림 E.1. IOMMU 그룹 XML

    
    <device>
      <name>pci_0000_04_00_0</name>
      <path>/sys/devices/pci0000:00/0000:00:1c.0/0000:04:00.0</path>
      <parent>pci_0000_00_1c_0</parent>
      <capability type='pci'>
        <domain>0</domain>
        <bus>4</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10d3'>82574L Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='8'>   <!--This is the element block you will need to use-->
          <address domain='0x0000' bus='0x00' slot='0x1c' function='0x0'/>
          <address domain='0x0000' bus='0x00' slot='0x1c' function='0x4'/>
          <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
          <address domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
        </iommuGroup>
        <pci-express>
          <link validity='cap' port='0' speed='2.5' width='1'/>
          <link validity='sta' speed='2.5' width='1'/>
        </pci-express>
      </capability>
    </device>
  3. PCI 데이터 보기

    위에서 수집된 출력에는 4개의 장치가 있는 IOMMU 그룹이 있습니다. 이는 ACS를 지원하지 않는 다중 기능 PCIe 루트 포트의 예입니다. 슬롯 0x1c의 두 가지 기능은 lspci 명령을 실행하여 식별할 수 있는 PCIe 루트 포트입니다( pciutils 패키지의 경우).
    # lspci -s 1c
    
    00:1c.0 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 1
    00:1c.4 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 5
    
    
    버스 0x04 및 0x05에서 엔드포인트 장치인 2개의 PCIe 장치에 대해 이 단계를 반복합니다.
    # lspci -s 4
    04:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection This is used in the next step and is called 04:00.0
    # lspci -s 5 This is used in the next step and is called 05:00.0
    05:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5755 Gigabit Ethernet PCI Express (rev 02)
    
  4. 게스트 가상 머신에 끝점 할당

    끝점 중 하나를 가상 머신에 할당하려면 현재 할당하지 않는 끝점을 VFIO 호환 드라이버에 바인딩해야 하므로 IOMMU 그룹이 사용자와 호스트 드라이버 간에 분할되지 않도록 해야 합니다. 예를 들어, 위에서 수신한 출력을 사용하는 경우 04:00.0만 사용하여 가상 시스템을 구성하는 것입니다. 가상 시스템은 호스트 드라이버에서 05:00.0을 분리하지 않는 한 가상 머신을 시작할 수 없습니다. 05:00.0을 분리하려면 virsh nodedev-detach 명령을 root로 실행합니다.
    # virsh nodedev-detach pci_0000_05_00_0
    Device pci_0000_05_00_0 detached
    
    이 문제를 해결하기 위한 또 다른 옵션은 가상 머신에 두 끝점을 모두 할당하는 것입니다. libvirt<hostdev> 요소 내의 managed 속성의 yes 값을 사용할 때 연결된 장치에 대해 이 작업을 자동으로 수행합니다. 예: <hostdev mode='subsystem' type='pci' managed='yes'>. 자세한 내용은 참고를 참조하십시오.
참고
libvirt 에는 PCI 장치를 처리하는 두 가지 방법이 있습니다. 관리하거나 관리되지 않을 수 있습니다. 이는 <hostdev> 요소 내의 관리 특성에 지정된 값에 의해 결정됩니다. 장치를 관리하면 libvirt 는 기존 드라이버에서 장치를 자동으로 분리한 다음 부팅 시 vfio-pci(가상 머신의 경우)에 바인딩하여 가상 머신에 할당합니다. 가상 머신이 종료되거나 삭제되거나 PCI 장치가 가상 머신에서 분리되면 libvirt는 vfio-pci에서 장치를 바인딩 해제하고 원래 드라이버로 다시 바인딩합니다. 장치가 관리되지 않는 경우 libvirt 는 프로세스를 자동화하지 않으며, 가상 머신에 장치를 할당하기 전에 설명된 관리 측면을 모두 수행해야 하며, 가상 머신에서 장치를 더 이상 사용하지 않으면 장치를 다시 할당해야 합니다. 관리되지 않는 장치에서 이러한 작업을 수행하지 않으면 가상 머신이 실패합니다. 따라서 libvirt 에서 장치를 관리하는 것이 더 쉬워질 수 있습니다.