16.2.2. SR-IOV 사용
이 섹션에서는 PCI 패스스루를 사용하여 SR-IOV 가능 멀티포트 네트워크 카드의 가상 기능을 네트워크 장치로 할당하는 방법을 설명합니다.
SR-IOV VF(가상 기능)는 virsh edit 또는 virsh attach-device 명령을 사용하여
<hostdev>
에 장치 항목을 추가하여 가상 머신에 할당할 수 있습니다. 그러나 일반 네트워크 장치와 달리 SR-IOV VF 네트워크 장치에는 고유한 영구 MAC 주소가 없으므로 호스트가 재부팅될 때마다 새 MAC 주소가 할당되기 때문에 문제가 발생할 수 있습니다. 이로 인해 호스트를 재부팅한 후 게스트에 동일한 VF가 할당되더라도 게스트가 새 MAC 주소를 갖는 네트워크 어댑터를 결정합니다. 결과적으로 게스트는 매번 새로운 하드웨어가 연결되었다고 생각하며 일반적으로 게스트의 네트워크 설정을 재구성해야 합니다.
libvirt 에는
<interface type='hostdev'>
인터페이스 장치가 포함되어 있습니다. 이 인터페이스 장치를 사용하여 libvirt 는 먼저 표시된 네트워크별 하드웨어/switch 초기화를 수행합니다(예: MAC 주소, VLAN 태그 또는 802.1Qbh 가상 포트 매개 변수 설정 등) 게스트에 PCI 장치 할당을 수행합니다.
<interface type='hostdev'>
인터페이스 장치를 사용하려면 다음을 수행해야 합니다.
- SR-IOV 가능 네트워크 카드
- Intel VT-d 또는 AMD IOMMU 확장 기능을 지원하는 호스트 하드웨어
- 할당할 VF의 PCI 주소입니다.
중요
SR-IOV 장치를 가상 머신에 할당하려면 호스트 하드웨어에서 Intel VT-d 또는 AMD IOMMU 사양을 지원해야 합니다.
Intel 또는 AMD 시스템에 SR-IOV 네트워크 장치를 연결하려면 다음 절차를 따르십시오.
절차 16.8. Intel 또는 AMD 시스템에 SR-IOV 네트워크 장치 연결
BIOS 및 커널에서 Intel VT-d 또는 AMD IOMMU 사양 활성화
Intel 시스템에서 BIOS에서 아직 활성화되지 않은 경우 Intel VT-d를 활성화합니다. BIOS 및 커널에서 Intel VT-d를 활성화하는 방법에 대한 도움말은 절차 16.1. “PCI 장치 할당을 위한 Intel 시스템 준비” 을 참조하십시오.Intel VT-d가 이미 활성화되어 있고 작동하는 경우 이 단계를 건너뜁니다.AMD 시스템에서 BIOS에서 AMD IOMMU 사양이 아직 활성화되지 않은 경우 이를 활성화합니다. BIOS에서 IOMMU 활성화에 대한 도움말은 절차 16.2. “PCI 장치 할당을 위한 AMD 시스템 준비” 을 참조하십시오.지원 확인
SR-IOV 기능이 있는 PCI 장치가 탐지되었는지 확인합니다. 이 예에서는 SR-IOV를 지원하는 Intel 82576 네트워크 인터페이스 카드를 나열합니다. lspci 명령을 사용하여 장치가 감지되었는지 확인합니다.# lspci 03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
다른 모든 장치를 제거하도록 출력이 수정되었습니다.가상 함수 활성화
다음 명령을 실행합니다.# echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfs
가상 함수를 영구적으로 설정
재부팅할 때 Virtual Functions를 영구적으로 유지하려면 선택한 편집기를 사용하여 다음과 유사한 udev 규칙을 만듭니다. 여기서 원하는 VF 수(이 예에서는2
), 네트워크 인터페이스 카드에서 지원되는 한도까지 지정합니다. 다음 예에서 enp14s0f0 을 PF 네트워크 장치 이름으로 바꾸고 사용 중인 드라이버와 일치하도록ENV{ID_NET_DRIVER}
값을 조정합니다.# vim /etc/udev/rules.d/enp14s0f0.rules
ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ATTR{device/sriov_numvfs}="2"
이렇게 하면 부팅 시 기능이 활성화됩니다.새 가상 함수 검사
lspci 명령을 사용하여 Intel 82576 네트워크 장치에 연결된 새로 추가된 가상 기능을 나열합니다. (참고로 grep 을 사용하여Virtual Functions를 지원하는 장치를 검색하려면 grep을 사용하여 가상 함수
를 검색합니다.)# lspci | grep 82576 0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01) 0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
PCI 장치의 식별자는 lspci 명령의-n
매개 변수를 사용하여 확인할 수 있습니다. 물리 함수는0b:00.0
및0b:00.1
에 해당합니다. 모든 가상 함수에는 설명에가상 기능이
있습니다.virsh를 사용하여 장치 확인
libvirt
서비스는 가상 머신에 장치를 추가하기 전에 장치를 인식해야 합니다.libvirt
는 lspci 출력과 유사한 표기법을 사용합니다. 모든 구두점 문자 : 및 .. lspci 출력에서는 밑줄(_)으로 변경됩니다.virsh nodedev-list 명령과 grep 명령을 사용하여 사용 가능한 호스트 장치 목록에서 Intel 82576 네트워크 장치를 필터링합니다.0B
는 이 예제에서 Intel 82576 네트워크 장치의 필터입니다. 시스템에 따라 다를 수 있으며 추가 장치가 발생할 수 있습니다.# virsh nodedev-list | grep
0b
pci_0000_0b_00_0 pci_0000_0b_00_1 pci_0000_0b_10_0 pci_0000_0b_10_1 pci_0000_0b_10_2 pci_0000_0b_10_3 pci_0000_0b_10_4 pci_0000_0b_10_5 pci_0000_0b_10_6 pci_0000_0b_11_7 pci_0000_0b_11_1 pci_0000_0b_11_2 pci_0000_0b_11_3 pci_0000_0b_11_4 pci_0000_0b_11_5가상 기능 및 물리 함수의 PCI 주소는 목록에 있어야 합니다.virsh를 사용하여 장치 세부 정보 가져오기
pci_0000_0b_00_0
은 물리 함수 중 하나이며,pci_0000_0b_10_0
은 해당 물리 함수의 첫 번째 해당 가상 기능입니다. virsh nodedev-dumpxml 명령을 사용하여 두 장치에 대한 장치 세부 정보를 가져옵니다.# virsh nodedev-dumpxml pci_0000_03_00_0 <device> <name>pci_0000_03_00_0</name> <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:00.0</path> <parent>pci_0000_00_01_0</parent> <driver> <name>igb</name> </driver> <capability type='pci'> <domain>0</domain> <bus>3</bus> <slot>0</slot> <function>0</function> <product id='0x10c9'>82576 Gigabit Network Connection</product> <vendor id='0x8086'>Intel Corporation</vendor> <capability type='virt_functions'> <address domain='0x0000' bus='0x03' slot='0x10' function='0x0'/> <address domain='0x0000' bus='0x03' slot='0x10' function='0x2'/> <address domain='0x0000' bus='0x03' slot='0x10' function='0x4'/> <address domain='0x0000' bus='0x03' slot='0x10' function='0x6'/> <address domain='0x0000' bus='0x03' slot='0x11' function='0x0'/> <address domain='0x0000' bus='0x03' slot='0x11' function='0x2'/> <address domain='0x0000' bus='0x03' slot='0x11' function='0x4'/> </capability> <iommuGroup number='14'> <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/> </iommuGroup> </capability> </device>
# virsh nodedev-dumpxml pci_0000_03_11_5 <device> <name>pci_0000_03_11_5</name> <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:11.5</path> <parent>pci_0000_00_01_0</parent> <driver> <name>igbvf</name> </driver> <capability type='pci'> <domain>0</domain> <bus>3</bus> <slot>17</slot> <function>5</function> <product id='0x10ca'>82576 Virtual Function</product> <vendor id='0x8086'>Intel Corporation</vendor> <capability type='phys_function'> <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/> </capability> <iommuGroup number='35'> <address domain='0x0000' bus='0x03' slot='0x11' function='0x5'/> </iommuGroup> </capability> </device>
이 예에서는 8단계의 가상 머신에 Virtual Functionpci_0000_03_10_2
를 추가합니다. 가상함수의
매개 변수는 장치를 추가하는 데 필요합니다.버스
,슬롯
및 함수예를 들어 이러한 매개변수를 임시 XML 파일(예:/tmp/new-interface.xml
)에 복사합니다.<interface type='hostdev' managed='yes'> <source> <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/> </source> </interface>
참고가상 머신이 시작되면 MAC 주소가 구성된 물리적 어댑터에서 제공하는 유형의 네트워크 장치가 표시됩니다. 이 MAC 주소는 호스트 및 게스트 재부팅 시 변경되지 않습니다.다음<interface>
예제에서는 선택적<mac address>
,<virtualport>
,<vlan>
요소의 구문을 보여줍니다. 실제로 예제와 같이 둘 다 동시에 사용할 수 없는<vlan>
또는<virtualport>
요소를 사용합니다.... <devices> ... <interface type='hostdev' managed='yes'> <source> <address type='pci' domain='0' bus='11' slot='16' function='0'/> </source> <mac address='52:54:00:6d:90:02'> <vlan> <tag id='42'/> </vlan> <virtualport type='802.1Qbh'> <parameters profileid='finance'/> </virtualport> </interface> ... </devices>
MAC 주소를 지정하지 않으면 자동으로 생성됩니다.<virtualport>
요소는 pxeQbh 하드웨어 스위치에 연결할 때만 사용됩니다.<vlan>
요소는 게스트의 장치를 VLAN 태그42
에 투명하게 배치합니다.가상 머신에 가상 기능 추가
이전 단계에서 만든 임시 파일과 함께 다음 명령을 사용하여 가상 머신에 가상 기능을 추가합니다. 이는 새 장치를 즉시 연결하고 후속 게스트를 다시 시작하기 위해 저장합니다.virsh attach-device MyGuest
/tmp/new-interface.xml
--live --configvirsh attach-device 로--live
옵션을 지정하면 새 장치가 실행 중인 게스트에 연결됩니다.--config
옵션을 사용하면 향후 게스트가 다시 시작된 후 새 장치를 사용할 수 있습니다.참고--live
옵션은 게스트가 실행 중인 경우에만 허용됩니다. virsh 는 실행 중인 게스트에서--live
옵션이 사용되는 경우 오류를 반환합니다.
가상 머신이 새 네트워크 인터페이스 카드를 감지합니다. 이 새 카드는 SR-IOV 장치의 가상 기능입니다.