Red Hat Training

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

9장. 게스트 가상 머신 장치 구성

Red Hat Enterprise Linux 6는 게스트 가상 머신을 위한 세 가지 장치 클래스를 지원합니다.
  • 에뮬레이션된 장치는 실제 하드웨어를 모방하는 순수한 가상 장치이므로 수정되지 않은 게스트 운영 체제가 표준 인 박스 드라이버를 사용하여 작업할 수 있습니다. Red Hat Enterprise Linux 6는 최대 216 virtio 장치를 지원합니다.
  • virtio 장치는 가상 머신에서 최적으로 작동하도록 설계된 순전히 가상 장치입니다. virtio 장치는 에뮬레이션된 장치와 유사하지만 Linux 이외의 가상 시스템에는 기본적으로 필요한 드라이버가 포함되어 있지 않습니다. Virtual Machine Manager(virt-manager) 및 RHV-H(Red Hat Virtualization Hypervisor)와 같은 가상화 관리 소프트웨어는 지원되는 비 Linux 게스트 운영 체제에 이러한 드라이버를 자동으로 설치합니다. Red Hat Enterprise Linux 6는 최대700개의scsi 디스크를 지원합니다.
  • 할당된 장치는 가상 머신에 노출되는 물리적 장치입니다. 이 방법은 'passthrough'라고도 합니다. 장치 할당을 통해 가상 머신은 다양한 작업을 위해 PCI 장치에 독점적으로 액세스할 수 있으며 PCI 장치는 게스트 운영 체제에 물리적으로 연결된 것처럼 표시 및 작동할 수 있습니다. Red Hat Enterprise Linux 6는 가상 머신당 최대 32개의 할당된 장치를 지원합니다.
장치 할당은 일부 그래픽 장치를 포함하여 PCIe 장치에서 지원됩니다. Red Hat Enterprise Linux 6의 장치 할당으로 NVIDIA K-series Quadro, GRID 및 Tesla 그래픽 카드 GPU 기능이 지원됩니다. 병렬 PCI 장치는 할당된 장치로 지원할 수 있지만 보안 및 시스템 구성 충돌로 인해 심각한 제한 사항이 있습니다.
참고
가상 머신에 연결할 수 있는 장치 수는 여러 요인 에 따라 다릅니다. 한 가지 요소는 QEMU 프로세스에서 여는 파일 수입니다( /etc/libvirt/qemu.conf에서 재정의할 수 있는 /etc/security/limits.conf 에서 구성됨). 다른 제한 요소에는 가상 버스에서 사용할 수 있는 슬롯 수와 sysctl이 설정한 오픈 파일에 대한 시스템 전체 제한이 포함됩니다.
특정 장치 및 제한 사항에 대한 자세한 내용은 20.16절. “장치” 을 참조하십시오.
Red Hat Enterprise Linux 6는 가상 머신에 단일 기능 슬롯으로 노출되는 장치의 PCI 핫 플러그를 지원합니다. 단일 기능 호스트 장치 및 다중 기능 호스트 장치의 개별 기능과 이를 사용하도록 구성할 수 있습니다. 가상 머신에 다중 기능 PCI 슬롯으로 장치를 노출하는 구성은 핫플러그 애플리케이션에만 권장됩니다.
참고
인터럽트 재조정을 위한 플랫폼 지원은 호스트에서 할당된 장치가 있는 게스트를 완전히 격리하는 데 필요합니다. 이러한 지원이 없으면 호스트가 악성 게스트의 삽입 공격을 방해하기 위해 취약해질 수 있습니다. 게스트가 신뢰할 수 있는 환경에서 관리자는 vfio_iommu_type1 모듈에 allow_unsafe_interrupts 옵션을 사용하여 PCI 장치 할당을 허용하도록 선택할 수 있습니다. 이 작업은 다음을 포함하는 /etc/modprobe.d 에 .conf 파일(예: local.conf)을 추가하여 영구적으로 수행할 수 있습니다.
options vfio_iommu_type1 allow_unsafe_interrupts=1
또는 sysfs 항목을 사용하여 동일한 작업을 수행합니다.
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts

9.1. PCI 장치

PCI 장치 할당은 Intel VT-d 또는 AMD IOMMU를 지원하는 하드웨어 플랫폼에서만 사용할 수 있습니다. PCI 장치 할당이 작동하려면 BIOS에서 이러한 Intel VT-d 또는 AMD IOMMU 사양을 활성화해야 합니다.

절차 9.1. PCI 장치 할당을 위한 Intel 시스템 준비

  1. Intel VT-d 사양 활성화

    Intel VT-d 사양에서는 가상 머신에 물리적 장치를 직접 할당하는 하드웨어 지원을 제공합니다. 이러한 사양은 Red Hat Enterprise Linux에서 PCI 장치 할당을 사용하는 데 필요합니다.
    BIOS에서 Intel VT-d 사양을 활성화해야 합니다. 일부 시스템 제조업체에서는 기본적으로 이러한 사양을 사용하지 않도록 설정되어 있습니다. 이러한 사양을 참조하는 데 사용되는 조건은 제조업체마다 다를 수 있습니다. 적절한 약관에 대해서는 시스템 제조업체 설명서를 참조하십시오.
  2. 커널에서 Intel VT-d 활성화

    /etc/sysconfig/grub 파일에 있는 GRUB_CMDLINX_LINUX 행 끝에 intel_iommu=on 매개 변수를 추가하여 커널에서 Intel VT-d를 활성화합니다.
    아래 예제는 Intel VT-d가 활성화된 수정된 grub 파일입니다.
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/
    rhcrashkernel-param || :) rhgb quiet intel_iommu=on"
  3. 구성 파일 다시 생성

    다음을 실행하여 /etc/grub2.cfg를 다시 생성합니다.
    grub2-mkconfig -o /etc/grub2.cfg
    UEFI 기반 호스트를 사용하는 경우 대상 파일은 /etc/grub2-efi.cfg 여야 합니다.
  4. 사용할 준비가

    시스템을 재부팅하여 변경 사항을 활성화합니다. 이제 시스템이 PCI 장치 할당을 수행할 수 있습니다.

절차 9.2. PCI 장치 할당을 위한 AMD 시스템 준비

  1. AMD IOMMU 사양 활성화

    Red Hat Enterprise Linux에서 PCI 장치 할당을 사용하려면 AMD IOMMU 사양이 필요합니다. BIOS에서 이러한 사양을 활성화해야 합니다. 일부 시스템 제조업체에서는 기본적으로 이러한 사양을 사용하지 않도록 설정되어 있습니다.
  2. IOMMU 커널 지원 활성화

    /etc/sysconfig/grub 에 있는 GRUB_CMDLINX_LINUX 행의 끝에 amd_iommu=on 을 추가하여 부팅 시 AMD IOMMU 사양을 활성화합니다.
  3. 구성 파일 다시 생성

    다음을 실행하여 /etc/grub2.cfg를 다시 생성합니다.
    grub2-mkconfig -o /etc/grub2.cfg
    UEFI 기반 호스트를 사용하는 경우 대상 파일은 /etc/grub2-efi.cfg 여야 합니다.
  4. 사용할 준비가

    시스템을 재부팅하여 변경 사항을 활성화합니다. 이제 시스템이 PCI 장치 할당을 수행할 수 있습니다.

9.1.1. virsh를 사용하여 PCI 장치 할당

이러한 단계는 PCI 장치를 KVM 하이퍼바이저의 가상 머신에 할당하는 방법을 다룹니다.
이 예에서는 PCI 식별자 코드 pci_0000_01_00_0 과 함께 PCIe 네트워크 컨트롤러를 사용하고 guest1-rhel6-64 라는 완전히 가상화된 게스트 시스템을 사용합니다.

절차 9.3. virsh를 사용하여 게스트 가상 머신에 PCI 장치 할당

  1. 장치 확인

    먼저 가상 머신에 장치 할당을 위해 지정된 PCI 장치를 식별합니다. lspci 명령을 사용하여 사용 가능한 PCI 장치를 나열합니다. grep 을 사용하여 lspci 의 출력을 구체화할 수 있습니다.
    이 예에서는 다음 출력에서 강조 표시된 이더넷 컨트롤러를 사용합니다.
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    이 이더넷 컨트롤러는 짧은 식별자 00:19.0 과 함께 표시됩니다. 이 PCI 장치를 가상 시스템에 할당하려면 virsh 에서 사용하는 전체 식별자를 찾아야 합니다.
    이를 위해 virsh nodedev-list 명령을 사용하여 호스트 시스템에 연결된 특정 유형(pci)의 모든 장치를 나열합니다. 그런 다음 사용하려는 장치의 짧은 식별자에 매핑되는 문자열의 출력을 확인합니다.
    이 예제에서는 짧은 식별자가 00:19.0 인 이더넷 컨트롤러에 매핑되는 문자열을 강조 표시합니다. 이 예제에서는 :. 문자는 전체 식별자에서 밑줄로 교체됩니다.
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    사용하려는 장치에 매핑되는 PCI 장치 번호를 기록합니다. 이는 다른 단계에서 필요합니다.
  2. 장치 정보 검토

    domain, bus 및 function에 대한 정보는 virsh nodedev-dumpxml 명령 출력에서 확인할 수 있습니다.
    virsh nodedev-dumpxml pci_0000_00_19_0
    <device>
      <name>pci_0000_00_19_0</name>
      <parent>computer</parent>
      <driver>
        <name>e1000e</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>0</bus>
        <slot>25</slot>
        <function>0</function>
        <product id='0x1502'>82579LM Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    참고
    IOMMU 그룹은 IOMMU의 관점에서 장치의 가시성 및 분리에 따라 결정됩니다. 각 IOMMU 그룹은 하나 이상의 장치를 포함할 수 있습니다. 여러 장치가 있는 경우 IOMMU 그룹 내의 모든 엔드 포인트를 게스트에 할당하려면 그룹 내의 모든 장치에 대해 클레임해야 합니다. 이 작업은 게스트에 추가 엔드포인트를 할당하거나 virsh nodedev-detach 를 사용하여 호스트 드라이버에서 분리하여 수행할 수 있습니다. 단일 그룹 내에 포함된 장치는 여러 게스트 간에 분할하거나 호스트와 게스트 간에 분할할 수 없습니다. PCIe 루트 포트, 스위치 포트 및 브리지와 같은 비 엔드 포인트 장치는 호스트 드라이버에서 분리되지 않아야 하며 끝점 할당을 방해하지 않습니다.
    IOMMU 그룹 내의 장치는 virsh nodedev-dumpxml 출력의 iommuGroup 섹션을 사용하여 결정할 수 있습니다. 그룹의 각 멤버는 별도의 "address" 필드를 통해 제공됩니다. 이 정보는 다음을 사용하여 sysfs에서 찾을 수도 있습니다.
    $ ls /sys/bus/pci/devices/0000:01:00.0/iommu_group/devices/
    출력 예는 다음과 같습니다.
    0000:01:00.0  0000:01:00.1
    그룹에 0000.01.00.0만 할당하려면 게스트를 시작하기 전에 사용하지 않은 끝점을 호스트에서 분리해야 합니다.
    $ virsh nodedev-detach pci_0000_01_00_1
  3. 필수 구성 세부 정보 확인

    구성 파일에 필요한 값에 대해서는 virsh nodedev-dumpxml pci_0000_00_19_0 명령의 출력을 참조하십시오.
    예제 장치의 값은 bus = 0, slot = 25이고 function = 0입니다. 10진수 구성은 다음 세 가지 값을 사용합니다.
    bus='0'
    slot='25'
    function='0'
  4. 구성 세부 정보 추가

    virsh edit 를 실행하여 가상 시스템 이름을 지정하고 < source > 섹션에 장치 항목을 추가하여 PCI 장치를 게스트 가상 머신에 할당합니다.
    # virsh edit guest1-rhel6-64
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
         <address domain='0' bus='0' slot='25' function='0'/>
      </source>
    </hostdev>
    또는 virsh attach-device 를 실행하여 가상 시스템 이름과 게스트의 XML 파일을 지정합니다.
    virsh attach-device guest1-rhel6-64 file.xml
  5. 가상 머신 시작

    # virsh start guest1-rhel6-64
이제 PCI 장치를 가상 시스템에 성공적으로 할당하고 게스트 운영 체제에서 액세스할 수 있습니다.

9.1.2. virt-manager를 사용하여 PCI 장치 할당

그래픽 virt-manager 도구를 사용하여 PCI 장치를 게스트 가상 머신에 추가할 수 있습니다. 다음 절차에서는 게스트 가상 머신에 기가비트 이더넷 컨트롤러를 추가합니다.

절차 9.4. virt-manager를 사용하여 게스트 가상 머신에 PCI 장치 할당

  1. 하드웨어 설정 열기

    게스트 가상 머신을 열고 하드웨어 추가 버튼 을 클릭하여 가상 머신에 새 장치를 추가합니다.

    그림 9.1. 가상 머신 하드웨어 정보 창

    왼쪽 메뉴 창에서 상단 작업 표시줄에 선택된 정보 버튼이 있는 가상 머신 하드웨어 창입니다.
  2. PCI 장치 선택

    왼쪽의 하드웨어 목록에서 PCI Host Device 를 선택합니다.
    사용되지 않는 PCI 장치를 선택합니다. 다른 게스트에서 사용 중인 PCI 장치를 선택하면 오류가 발생할 수 있습니다. 이 예에서는 스페어 82576 네트워크 장치가 사용됩니다. 완료 를 클릭하여 설정을 완료합니다.

    그림 9.2. 가상 하드웨어 추가 마법사

    왼쪽 메뉴 창에서 PCI Host Device가 선택된 새로운 가상 하드웨어 추가 마법사는 오른쪽 메뉴 창에서 선택할 호스트 장치 목록을 표시합니다.
  3. 새 장치 추가

    설정이 완료되었으며 게스트 가상 머신이 이제 PCI 장치에 직접 액세스할 수 있습니다.

    그림 9.3. 가상 머신 하드웨어 정보 창

    왼쪽 메뉴 창의 상단 작업 표시줄에 선택된 정보 버튼이 있는 가상 머신 하드웨어 창은 왼쪽 메뉴 창의 가상 머신 장치 목록에 새로 추가된 PCI 장치를 표시합니다.
참고
장치 할당이 실패하면 동일한 IOMMU 그룹에 여전히 호스트에 연결된 다른 엔드포인트가 있을 수 있습니다. virt-manager를 사용하여 그룹 정보를 검색할 수는 없지만 virsh 명령을 사용하여 IOMMU 그룹의 경계와 필요한 sequester 장치를 분석할 수 있습니다.
IOMMU 그룹 및 virsh를 사용하여 엔드포인트 장치를 분리하는 방법에 대한 자세한 내용은 참고9.1.1절. “virsh를 사용하여 PCI 장치 할당” 를 참조하십시오.

9.1.3. virt-install을 사용한 PCI 장치 할당

virt-install 을 사용하여 PCI 장치를 할당하려면 --host-device 매개 변수를 사용합니다.

절차 9.5. virt-install을 사용하여 가상 머신에 PCI 장치 할당

  1. 장치 확인

    게스트 가상 머신에 장치 할당을 위해 지정된 PCI 장치를 식별합니다.
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    virsh nodedev-list 명령은 시스템에 연결된 모든 장치를 나열하고 각 PCI 장치를 문자열로 식별합니다. 출력을 PCI 장치로만 제한하려면 다음 명령을 실행합니다.
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    PCI 장치 번호를 기록합니다. 다른 단계에는 숫자가 필요합니다.
    도메인, 버스 및 기능에 대한 정보는 virsh nodedev-dumpxml 명령 출력에서 확인할 수 있습니다.
    # virsh nodedev-dumpxml pci_0000_01_00_0
    <device>
      <name>pci_0000_01_00_0</name>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igb</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>1</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10c9'>82576 Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    참고
    IOMMU 그룹에 여러 끝점이 있고 모든 엔드포인트가 게스트에 할당되지 않은 경우 게스트를 시작하기 전에 다음 명령을 실행하여 호스트에서 다른 끝점을 수동으로 분리해야 합니다.
    $ virsh nodedev-detach pci_0000_00_19_1
    IOMMU 그룹에 대한 자세한 내용은 참고9.1.1절. “virsh를 사용하여 PCI 장치 할당” 를 참조하십시오.
  2. 장치 추가

    virsh nodedev 명령의 PCI 식별자 출력을 --host-device 매개 변수의 값으로 사용합니다.
    virt-install \
    --name=guest1-rhel6-64 \
    --disk path=/var/lib/libvirt/images/guest1-rhel6-64.img,size=8 \
    --nonsparse --graphics spice \
    --vcpus=2 --ram=2048 \
    --location=http://example1.com/installation_tree/RHEL6.0-Server-x86_64/os \
    --nonetworks \
    --os-type=linux \
    --os-variant=rhel6
    --host-device=pci_0000_01_00_0
  3. 설치 완료

    게스트 설치를 완료합니다. PCI 장치를 게스트에 연결해야 합니다.

9.1.4. 할당된 PCI 장치 분리

호스트 PCI 장치가 게스트 시스템에 할당된 경우 호스트는 더 이상 장치를 사용할 수 없습니다. 이 섹션에서는 호스트 사용을 위해 사용할 수 있도록 virsh 또는 virt-manager 를 사용하여 게스트에서 장치를 분리하는 방법을 알아봅니다.

절차 9.6. virsh를 사용하여 게스트에서 PCI 장치 분리

  1. 장치 분리

    다음 명령을 사용하여 게스트의 XML 파일에서 PCI 장치를 제거하여 게스트에서 PCI 장치를 분리합니다.
    # virsh detach-device name_of_guest file.xml
  2. 장치를 호스트에 다시 연결합니다(선택 사항)

    장치가 관리 모드에 있는 경우 이 단계를 건너뜁니다. 장치가 자동으로 호스트로 반환됩니다.
    장치가 관리 모드를 사용하지 않는 경우 다음 명령을 사용하여 PCI 장치를 호스트 머신에 다시 연결합니다.
    # virsh nodedev-reattach device
    예를 들어 pci_0000_01_00_0 장치를 호스트에 다시 연결하려면 다음을 수행합니다.
    virsh nodedev-reattach pci_0000_01_00_0
    이제 호스트용으로 장치를 사용할 수 있습니다.

절차 9.7. virt-manager를 사용하여 게스트에서 PCI 장치 분리

  1. 가상 하드웨어 세부 정보 화면을 엽니다.

    virt-manager 에서 장치가 포함된 가상 머신을 두 번 클릭합니다. 가상 하드웨어 세부 정보 표시 버튼을 선택하여 가상 하드웨어 목록을 표시합니다.

    그림 9.4. 가상 하드웨어 세부 정보 버튼

    가상 하드웨어 세부 정보 표시 버튼.
  2. 장치 선택 및 제거

    왼쪽 패널의 가상 장치 목록에서 분리할 PCI 장치를 선택합니다.

    그림 9.5. 분리할 PCI 장치 선택

    PCI 장치 세부 정보 및 제거 버튼.
    Remove (제거) 버튼을 클릭하여 확인합니다. 이제 호스트용으로 장치를 사용할 수 있습니다.

9.1.5. PCI 브리지 생성

PCI(Deviceer Component Interconnects) 브리지는 네트워크 카드, 모뎀 및 사운드 카드와 같은 장치에 연결하는 데 사용됩니다. 물리적 대응과 마찬가지로 가상 장치를 PCI 브리지에도 연결할 수 있습니다. 이전에는 31개의 PCI 장치만 게스트 가상 머신에 추가할 수 있었습니다. 이제 31st PCI 장치를 추가하면 추가 PCI 장치를 PCI 브리지로 이동하는 31번째 슬롯에 PCI 브리지가 자동으로 배치됩니다. 각 PCI 브릿지에는 31 개의 추가 장치를 위한 31개의 슬롯이 있으며, 모두 브리지일 수 있습니다. 이러한 방식으로 게스트 가상 머신에 900개 이상의 장치를 사용할 수 있습니다.
참고
게스트 가상 머신이 실행 중인 경우에는 이 작업을 수행할 수 없습니다. 종료 중인 게스트 가상 머신에 PCI 장치를 추가해야 합니다.

9.1.6. PCI 패스스루

PCI 네트워크 장치( <소스> 요소에 의해 지정됨)는 먼저 장치의 MAC 주소를 구성된 값으로 설정하고 선택적으로 지정된 <가상 포트 요소를 사용하여 장치를 802.1Qbhable 스위치와 연결한 후 type='direct' 네트워크 장치에 대해 지정한 가상> 포트의 예를 참조하십시오. 표준 단일 포트 PCI 이더넷 카드 드라이버 설계의 제한으로 인해 - SR-IOV(Single Root I/O Virtualization) 가상 기능(VF) 장치만 이러한 방식으로 할당할 수 있습니다. 표준 단일 포트 PCI 또는 PCIe 이더넷 카드를 게스트에 할당하려면 기존 <hostdev> 장치 정의를 사용합니다.
traditional/legacy KVM 장치 할당(VFIO)이 아닌 VFIO 장치 할당(VFIO)은 UEFI Secure Boot와 호환되는 새로운 장치 할당 방법입니다. <type='hostdev'> 인터페이스에는 name 속성이 "vfio"로 설정된 선택적 드라이버 하위 요소가 있을 수 있습니다. 레거시 KVM 장치 할당을 사용하려면 name을 "kvm"으로 설정할 수 있습니다(또는 < <driver> ='kvm이 현재 기본값이므로 드라이버> 요소를 생략하기만 하면 됩니다.
참고
네트워크 장치의 지능형 패스스루는 표준 <hostdev> 장치의 기능과 매우 유사합니다. 이 방법은 통과된 장치에 대한 MAC 주소와 <가상 포트를> 지정할 수 있다는 점입니다. 이러한 기능이 필요하지 않은 경우, SR-IOV를 지원하지 않는 표준 단일 포트 PCI, PCIe 또는 USB 네트워크 카드가 있는 경우(따라서 게스트 도메인에 할당된 후 재설정 중에 구성된 MAC 주소가 손실됨) 또는 0.9.11 이전 버전의 libvirt를 사용하는 경우 표준 <hostdev> 를 사용하여 장치를 <인터페이스 유형/dev 유형> 대신 게스트에 할당해야 합니다.

그림 9.6. PCI 장치 할당의 경우 XML


     <devices>
    <interface type='hostdev'>
      <driver name='vfio'/>
      <source>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
      </source>
      <mac address='52:54:00:6d:90:02'>
      <virtualport type='802.1Qbh'>
        <parameters profileid='finance'/>
      </virtualport>
    </interface>
  </devices>

9.1.7. SR-IOV 장치를 사용하여 PCI 할당(Passthrough) 구성

이 섹션은 SR-IOV 장치 전용입니다. SR-IOV 네트워크 카드는 각각 PCI 장치 할당을 사용하여 게스트 가상 머신에 개별적으로 할당할 수 있는 여러 VF(가상 기능 )를 제공합니다. 할당된 후에는 각각 전체 물리적 네트워크 장치로 작동합니다. 이를 통해 많은 게스트 가상 머신에서 직접 PCI 장치 할당의 성능 이점을 얻을 수 있으며 호스트 물리적 시스템에서 단일 슬롯만 사용할 수 있습니다.
이러한 VF는 <hostdev> 요소를 사용하여 기존 방식으로 게스트 가상 머신에 할당할 수 있지만 SR-IOV VF 네트워크 장치에는 영구적인 MAC 주소가 없으므로 호스트 물리적 머신이 재부팅될 때마다 게스트 가상 머신의 네트워크 설정을 다시 구성해야 하는 문제가 발생합니다. 이 문제를 해결하려면 VF를 호스트 물리적 머신에 할당하기 전에 MAC 주소를 설정해야 하며 게스트 가상 머신이 부팅될 때마다 이 주소를 설정해야 합니다. 이 MAC 주소와 다른 옵션을 할당하려면 절차 9.8. “SR-IOV에서 PCI 장치를 할당하기 위해 MAC 주소, vLAN 및 가상 포트 구성” 에 설명된 절차를 참조하십시오.

절차 9.8. SR-IOV에서 PCI 장치를 할당하기 위해 MAC 주소, vLAN 및 가상 포트 구성

<mac>,<vlan>, <virtualport> 요소가 <hostdev> 용으로 유효하지 않으므로 MAC 주소 할당, vLAN 태그 ID 할당 또는 가상 포트 할당과 같은 기능별 항목에는 <hostdev> 요소를 사용할 수 없습니다. <인터페이스 용으로 유효하므로 새 인터페이스> 유형에 대한 지원이 추가되었습니다(<인터페이스 type='hostdev'>). 이 새 인터페이스 장치 유형은 <인터페이스><hostdev> 의 하이브리드 역할을 합니다. 따라서 PCI 장치를 게스트 가상 머신에 할당하기 전에 libvirt 는 표시된 네트워크별 하드웨어/슬래버스(예: MAC 주소 설정, vLAN 태그 설정, 802.1Qbh 스위치)를 게스트 가상 머신의 XML 구성 파일에서 초기화합니다. vLAN 태그 설정에 대한 자세한 내용은 18.14절. “vLAN 태그 설정” 을 참조하십시오.
  1. 게스트 가상 머신 종료

    virsh shutdown 명령( 14.9.1절. “게스트 가상 머신 종료”참조)을 사용하여 guestVM 이라는 게스트 가상 머신을 종료합니다.
    # virsh shutdown guestVM
  2. 정보 수집

    <인터페이스 type='hostdev'> 를 사용하려면 SR-IOV 가능 네트워크 카드, Intel VT-d 또는 AMD IOMMU 확장 기능을 지원하는 물리적 머신 하드웨어를 호스트해야 하며, 할당할 VF의 PCI 주소를 알아야 합니다.
  3. 편집을 위해 XML 파일을 엽니다.

    # virsh save-image-edit 명령을 실행하여 편집할 XML 파일을 엽니다(자세한 내용은 14.8.10절. “도메인 XML 구성 파일 편집” 참조). 게스트 가상 머신을 이전 실행 상태로 복원하려는 경우 --running 이 사용됩니다. 이 예제의 구성 파일의 이름은 게스트 가상 머신의 이름이 guestVM 이므로 guestVM.xml 입니다.
     # virsh save-image-edit guestVM.xml --running 
    guestVM.xml 이 기본 편집기에서 열립니다.
  4. XML 파일 편집

    구성 파일(guestVM.xml)을 다음과 유사한 <장치> 항목을 갖도록 업데이트합니다.

    그림 9.7. hostdev 인터페이스 유형의 샘플 도메인 XML

    
     <devices>
       ...
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0x0' bus='0x00' slot='0x07' function='0x0'/> <!--these values can be decimal as well-->
         </source>
         <mac address='52:54:00:6d:90:02'/>                                         <!--sets the mac address-->
         <virtualport type='802.1Qbh'>                                              <!--sets the virtual port for the 802.1Qbh switch-->
           <parameters profileid='finance'/>
         </virtualport>
         <vlan>                                                                     <!--sets the vlan tag-->
          <tag id='42'/>
         </vlan>
       </interface>
       ...
     </devices>
    
    
    MAC 주소를 제공하지 않으면 다른 유형의 인터페이스 장치와 마찬가지로 MAC 주소가 자동으로 생성됩니다. 또한 <virtualport> 요소는 802.11Qgh 하드웨어 스위치 (802.11Qbg (a.k.a))에 연결하는 경우에만 사용됩니다. "VEPA") 스위치는 현재 지원되지 않습니다.
  5. 게스트 가상 머신 다시 시작

    virsh start 명령을 실행하여 첫 번째 단계에서 종료한 게스트 가상 머신을 재시작합니다(예: guestVM을 게스트 가상 시스템의 도메인 이름으로 사용). 자세한 내용은 14.8.1절. “정의된 도메인 시작” 를 참조하십시오.
     # virsh start guestVM 
    게스트 가상 머신이 시작되면 실제 호스트 시스템의 어댑터에 의해 제공된 네트워크 장치가 구성된 MAC 주소와 함께 표시됩니다. 이 MAC 주소는 게스트 가상 시스템 및 호스트 물리적 시스템 재부팅 시 변경되지 않은 상태로 유지됩니다.

9.1.8. SR-IOV 가상 함수 풀에서 PCI 장치 할당 설정

특정 가상 기능 (VF)의 PCI 주소를 게스트 구성에 하드 코딩하면 다음과 같은 두 가지 심각한 제한 사항이 있습니다.
  • 지정된 VF는 게스트 가상 머신이 시작될 때마다 사용할 수 있어야 합니다. 즉, 관리자가 각 VF를 단일 게스트 가상 머신에 영구적으로 할당해야 합니다(또는 게스트 가상 머신이 시작될 때마다 사용되지 않는 VF의 PCI 주소를 지정하도록 모든 게스트 가상 머신의 구성 파일 수정).
  • 게스트 가상 시스템이 다른 호스트 물리적 시스템으로 이동하는 경우 호스트 물리적 시스템은 PCI 버스의 동일한 위치에 동일한 하드웨어가 있어야 합니다(또는 다시 시작 전에 게스트 가상 머신 구성을 수정해야 함).
SR-IOV 장치의 모든 VF가 포함된 장치 풀로 libvirt 네트워크를 생성하여 이러한 문제를 모두 방지할 수 있습니다. 이 작업이 완료되면 이 네트워크를 참조하도록 게스트 가상 머신을 구성합니다. 게스트를 시작할 때마다 단일 VF가 풀에서 할당되어 게스트 가상 머신에 할당됩니다. 게스트 가상 머신이 중지되면 VF가 다른 게스트 가상 머신에서 사용할 풀로 반환됩니다.

절차 9.9. 장치 풀 생성

  1. 게스트 가상 머신 종료

    virsh shutdown 명령( 14.9절. “게스트 가상 시스템의 종료, 재부팅 및 종료”참조)을 사용하여 guestVM 이라는 게스트 가상 머신을 종료합니다.
    # virsh shutdown guestVM
  2. 구성 파일 생성

    선택한 편집기를 사용하면 /tmp 디렉터리에 XML 파일(예: passthrough.xml )이 생성됩니다. pf dev='eth3' 을 자체 SR-IOV 장치의 netdev 이름으로 교체해야 합니다.
    다음은 호스트 물리적 머신의 "eth3'에 있는 PF(물리 기능) 를 사용하여 SR-IOV 어댑터에 대한 모든 VF 풀을 사용할 수 있도록 하는 네트워크 정의 예제입니다.

    그림 9.8. 네트워크 정의 도메인 XML 샘플

          
    <network>
       <name>passthrough</name>                                                <!--This is the name of the file you created-->
       <forward mode='hostdev' managed='yes'>
         <pf dev='myNetDevName'/>                                              <!--Use the netdev name of your SR-IOV devices PF here-->
       </forward>
    </network>
          
    
    
  3. 새 XML 파일 로드

    다음 명령을 실행하여 /tmp/passthrough.xml 을 이전 단계에서 생성한 XML 파일의 이름 및 위치로 바꿉니다.
    # virsh net-define /tmp/passthrough.xml
  4. 게스트 다시 시작

    passthrough.xml 을 이전 단계에서 생성한 XML 파일의 이름으로 교체하여 다음을 실행합니다.
     # virsh net-autostart passthrough # virsh net-start passthrough 
  5. 게스트 가상 머신 다시 시작

    virsh start 명령을 실행하여 첫 번째 단계에서 종료한 게스트 가상 머신을 재시작합니다(예: guestVM을 게스트 가상 시스템의 도메인 이름으로 사용). 자세한 내용은 14.8.1절. “정의된 도메인 시작” 를 참조하십시오.
     # virsh start guestVM 
  6. 장치에 대한 패스스루 시작

    단일 장치만 표시되지만 libvirt는 해당 PF와 연결된 모든 VF 목록을 자동으로 파생시킵니다. 그러면 다음과 같이 게스트 가상 머신이 도메인 XML의 인터페이스 정의로 처음 시작될 때 libvirt가 자동으로 파생됩니다.

    그림 9.9. 인터페이스 네트워크 정의를 위한 샘플 도메인 XML

             
    <interface type='network'>
       <source network='passthrough'>
    </interface>
          
    
    
  7. 검증

    네트워크를 사용하는 첫 번째 게스트를 시작한 후 virsh net-dumpxml passthrough 명령을 실행하여 확인할 수 있습니다. 다음과 유사한 출력을 얻을 수 있습니다.

    그림 9.10. XML 덤프 파일 패스스루 콘텐츠

          
    <network connections='1'>
       <name>passthrough</name>
       <uuid>a6b49429-d353-d7ad-3185-4451cc786437</uuid>
       <forward mode='hostdev' managed='yes'>
         <pf dev='eth3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x5'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x7'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x5'/>
       </forward>
    </network>