15.4. 명령줄을 사용하여 가상 머신에 PCI 장치 연결
VM(가상 머신)을 사용하는 경우 호스트 시스템에 연결된 스토리지 또는 네트워크 컨트롤러와 같은 PCI 장치에 액세스하고 제어할 수 있습니다. 이 시나리오에서 호스트 시스템은 장치 제어를 VM에 전달합니다. 이를 PCI 장치 할당 또는 PCI 패스스루라고도 합니다.
VM(가상 머신)에서 호스트에 연결된 PCI 하드웨어 장치를 사용하려면 호스트에서 장치를 분리하고 VM에 할당할 수 있습니다.
이 절차에서는 일반적인 PCI 장치 할당을 설명합니다. 특정 유형의 PCI 장치를 할당하는 방법은 관련 절차를 참조하십시오.
사전 요구 사항
호스트가 IBM Z 아키텍처를 사용하는 경우 호스트에
vfio커널 모듈을 로드해야 합니다. 확인하려면 다음 명령을 사용합니다.# lsmod | grep vfio출력에는 다음 모듈이 포함되어야 합니다.
-
vfio_pci -
vfio_pci_core -
vfio_iommu_type1
-
프로세스
사용하려는 장치의 PCI 주소 식별자를 가져옵니다. 예를 들어 호스트에 연결된 NVME 디스크를 사용하려는 경우 다음 출력에서는 장치
0000:65:00.0으로 표시됩니다.# lspci -nkD 0000:00:00.0 0600: 8086:a708 (rev 01) Subsystem: 17aa:230e Kernel driver in use: igen6_edac Kernel modules: igen6_edac 0000:00:02.0 0300: 8086:a7a1 (rev 04) Subsystem: 17aa:230e Kernel driver in use: i915 Kernel modules: i915, xe 0000:00:04.0 1180: 8086:a71d (rev 01) Subsystem: 17aa:230e Kernel driver in use: thermal_pci Kernel modules: processor_thermal_device_pci 0000:00:05.0 0604: 8086:a74d (rev 01) Subsystem: 17aa:230e Kernel driver in use: pcieport 0000:00:07.0 0604: 8086:a76e (rev 01) Subsystem: 17aa:230e Kernel driver in use: pcieport 0000:65:00.0 0108: 144d:a822 (rev 01) DeviceName: PCIe SSD in Slot 0 Bay 2 Subsystem: 1028:1fd9 Kernel driver in use: nvme Kernel modules: nvme 0000:6a:00.0 0108: 1179:0110 (rev 01) DeviceName: PCIe SSD in Slot 11 Bay 2 Subsystem: 1028:1ffb Kernel driver in use: nvme Kernel modules: nvmePCI 장치를 연결할 VM의 XML 구성을 엽니다.
# virsh edit vm-nameXML 파일의
<devices>섹션에 다음<hostdev>구성을 추가합니다.address행의 값을 장치의 PCI 주소로 바꿉니다. 선택적으로 장치가 VM에서 사용할 PCI 주소를 변경하려면 <addresstype="pci"> 행에 다른 주소를구성할 수 있습니다.예를 들어 호스트의 장치 주소가
0000:65:00.0이고 게스트에서0000:02:00.0을 사용하려면 다음 구성을 사용합니다.<hostdev mode="subsystem" type="pci" managed="yes"> <driver name="vfio"/> <source> <address domain="0x0000" bus="0x65" slot="0x00" function="0x0"/> </source> <address type="pci" domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> </hostdev>선택 사항: IBM Z 호스트에서 게스트 운영 체제가 PCI 장치를 감지하는 방법을 수정할 수 있습니다. 이렇게 하려면 <
zpci> 하위요소를 <address> 요소에추가합니다. <zpci> 줄에서는uid및fid값을 조정하여 게스트 운영 체제에서 장치의 PCI 주소 및 기능 ID를 수정할 수 있습니다.<hostdev mode="subsystem" type="pci" managed="yes"> <driver name="vfio"/> <source> <address domain="0x0000" bus="0x65" slot="0x00" function="0x0"/> </source> <address type="pci" domain='0x0000' bus='0x02' slot='0x00' function='0x0'> <zpci uid="0x0008" fid="0x001807"/> </address> </hostdev>이 예제에서는 다음을 수행합니다.
-
UID="0x0008"은 VM에 있는 장치의 도메인 PCI 주소를0008:00:00.0로 설정합니다. FID="0x001807"은 장치의 슬롯 값을0x001807로 설정합니다. 결과적으로 VM의 파일 시스템의 장치 구성이/sys/bus/pci/slots/00001087/address에 저장됩니다.이러한 값을 지정하지 않으면
libvirt에서 자동으로 구성합니다.
-
- XML 구성을 저장합니다.
VM이 실행 중이면 종료합니다.
# virsh shutdown vm-name
검증
- VM을 시작하고 게스트 운영 체제에 로그인합니다.
게스트 운영 체제에서 PCI 장치가 나열되는지 확인합니다.
예를 들어 게스트 장치 주소를
0000:02:00.0으로 구성한 경우 다음 명령을 사용합니다.# lspci -nkD | grep 0000:02:00.0 0000:02:00.0 8086:9a09 (rev 01)