16장. 게스트 가상 머신 장치 구성
- 에뮬레이션된 장치는 실제 하드웨어를 모방하는 순수하게 가상 장치이므로 수정되지 않은 게스트 운영 체제가 표준 인 박스 드라이버를 사용하여 작업할 수 있습니다.
- virtio 장치 (또는 반가상화라고도 함)는 가상 머신에서 최적으로 작동하도록 설계된 가상 장치입니다. virtio 장치는 에뮬레이션된 장치와 유사하지만 Linux 이외의 가상 시스템에는 기본적으로 필요한 드라이버가 포함되어 있지 않습니다. Virtual Machine Manager(virt-manager)와 같은 가상화 관리 소프트웨어 및 Red Hat Virtualization Hypervisor는 지원되는 비 Linux 게스트 운영 체제에 대해 이러한 드라이버를 자동으로 설치합니다. Red Hat Enterprise Linux 7은 최대 216개의 virtio 장치를 지원합니다. 자세한 내용은 5장. KVM Paravirtualized (virtio) 드라이버 의 내용을 참조하십시오.
- 할당된 장치는 가상 머신에 노출되는 물리적 장치입니다. 이 방법을 passthrough 라고도 합니다. 장치 할당을 통해 가상 머신은 다양한 작업에 대해 PCI 장치에 독점적으로 액세스할 수 있으며 PCI 장치가 게스트 운영 체제에 물리적으로 연결된 것처럼 표시되고 동작할 수 있습니다. Red Hat Enterprise Linux 7은 가상 머신당 최대 32개의 할당된 장치를 지원합니다.장치 할당은 일부 그래픽 장치를 포함하여 PCIe 장치에서 지원됩니다. 병렬 PCI 장치는 할당된 장치로 지원될 수 있지만 보안 및 시스템 구성 충돌로 인해 심각한 제한 사항이 있습니다.
allow_unsafe_interrupts
옵션을 vfio_iommu_type1
모듈에 사용하여 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
16.1. PCI 장치
절차 16.1. PCI 장치 할당을 위한 Intel 시스템 준비
Intel VT-d 사양 활성화
Intel VT-d 사양은 가상 머신에 물리적 장치를 직접 할당하는 하드웨어 지원을 제공합니다. Red Hat Enterprise Linux에서 PCI 장치 할당을 사용하려면 이러한 사양이 필요합니다.BIOS에서 Intel VT-d 사양을 활성화해야 합니다. 일부 시스템 제조업체에서는 기본적으로 이러한 사양을 비활성화합니다. 이러한 사양을 확인하는 데 사용되는 용어는 제조업체마다 다를 수 있습니다. 시스템 제조업체의 설명서를 참조하십시오.커널에서 Intel VT-d 활성화
/etc/sysconfig/grub
파일에 있는 따옴표 내에서intel_iommu=on
및iommu=pt
매개 변수를 추가하여 커널에서 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 iommu=pt"
구성 파일 재생성
다음을 실행하여 /etc/grub2.cfg를 다시 생성합니다.grub2-mkconfig -o /etc/grub2.cfg
UEFI 기반 호스트를 사용하는 경우 대상 파일은/etc/grub2-efi.cfg
여야 합니다.사용 준비
시스템을 재부팅하여 변경 사항을 활성화합니다. 이제 PCI 장치 할당이 가능합니다.
절차 16.2. PCI 장치 할당을 위한 AMD 시스템 준비
AMD IOMMU 사양 활성화
Red Hat Enterprise Linux에서 PCI 장치 할당을 사용하려면 AMD IOMMU 사양이 필요합니다. 이 사양은 BIOS에서 활성화해야합니다. 일부 시스템 제조업체에서는 기본적으로 이러한 사양을 비활성화합니다.IOMMU 커널 지원 활성화
/etc/sysconfig/grub
의 따옴표 내에 GRUB_CMDLINX_LINUX 행의 끝에iommu=pt
를 추가하여 AMD IOMMU 사양이 부팅 시 활성화되도록 합니다.구성 파일 재생성
다음을 실행하여 /etc/grub2.cfg를 다시 생성합니다.grub2-mkconfig -o /etc/grub2.cfg
UEFI 기반 호스트를 사용하는 경우 대상 파일은/etc/grub2-efi.cfg
여야 합니다.사용 준비
시스템을 재부팅하여 변경 사항을 활성화합니다. 이제 PCI 장치 할당이 가능합니다.
16.1.1. virsh를 사용하여 PCI 장치 할당
pci_0000 644300_0
및 guest1-rhel7-64 라는 완전히 가상화된 게스트 시스템과 함께 PCIe 네트워크 컨트롤러를 사용합니다.
절차 16.3. virsh를 사용하여 게스트 가상 머신에 PCI 장치 할당
장치 식별
먼저 가상 머신에 대한 장치 할당용으로 지정된 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 장치 번호를 기록합니다. 다른 단계에서 필요합니다.장치 정보 검토
domain, bus 및 function에 대한 정보는 virsh nodedev-dumpxml 명령의 출력에서 확인할 수 있습니다.그림 16.1. 덤프 내용
# 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
필요한 구성 세부 정보 확인
구성 파일에 필요한 값은 virsh nodedev-dumpxml pci_0000_00_19_0 명령의 출력을 참조하십시오.예제 장치에는 bus = 0, 슬롯 = 25 및 function = 0의 값이 있습니다. 10진수 구성은 다음 세 가지 값을 사용합니다.bus='0' slot='25' function='0'
설정 세부 정보 추가
virsh edit 를 실행하여 가상 머신 이름을 지정하고<devices>
섹션에 장치 항목을 추가하여 PCI 장치를 게스트 가상 머신에 할당합니다. 예를 들면 다음과 같습니다.# virsh edit guest1-rhel7-64
그림 16.2. PCI 장치 추가
<devices> [...] <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0' bus='0' slot='25' function='0'/> </source> </hostdev> [...] </devices>
또는 virsh attach-device 를 실행하여 가상 머신 이름과 게스트의 XML 파일을 지정합니다.virsh attach-device guest1-rhel7-64
file.xml
참고PCI 장치는 장치에 대한 장치 펌웨어 또는 사전 부팅 드라이버 (예: PXE)를 제공하기 위한 옵션 2.0.0 또는 확장 Makefile(예: PXE)이라고도 하는 선택적 읽기 전용 메모리(ROM) 모듈을 포함할 수 있습니다. 일반적으로 이러한 옵션은 PCI 장치 할당을 사용하여 물리적 PCI 장치를 VM에 연결할 때 가상화된 환경에서도 작동합니다.그러나 경우에 따라 옵션 RAM이 불필요하여 VM을 더 느리게 부팅하거나 장치에서 제공하는 사전 부팅 드라이버가 가상화와 호환되지 않을 수 있으므로 게스트 OS 부팅이 실패할 수 있습니다. 이러한 경우 Red Hat은 VM에서 옵션 Rom을 마스킹하는 것을 권장합니다. 이렇게 하려면 다음을 수행합니다.- 호스트에서 할당할 장치에 확장 Makefile 베이스 주소 레지스터(BAR)가 있는지 확인합니다. 이렇게 하려면 장치에 lspci -v 명령을 사용하고 다음이 포함된 행의 출력을 확인합니다.
Expansion ROM at
- <rom bar='off'/> 요소를 게스트의 XML 구성에서 <hostdev> 요소의 자식으로 추가합니다.
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0' bus='0' slot='25' function='0'/> </source> <rom bar='off'/> </hostdev>
가상 머신 시작
# virsh start guest1-rhel7-64
16.1.2. virt-manager로 PCI 장치 할당
절차 16.4. virt-manager를 사용하여 게스트 가상 머신에 PCI 장치 할당
하드웨어 설정 열기
게스트 가상 머신을 열고을 클릭하여 가상 시스템에 새 장치를 추가합니다.그림 16.3. 가상 머신 하드웨어 정보 창
PCI 장치 선택
왼쪽의 하드웨어 목록에서 PCI 호스트 장치를 선택합니다.사용되지 않는 PCI 장치를 선택합니다. 현재 다른 게스트에서 사용 중인 PCI 장치를 선택하면 오류가 발생합니다. 이 예제에서는 예비 오디오 컨트롤러가 사용됩니다. 완료 를 클릭하여 설정을 완료합니다.그림 16.4. 새 가상 하드웨어 추가 마법사
새 장치 추가
설정이 완료되고 게스트 가상 머신에서 PCI 장치에 직접 액세스할 수 있습니다.그림 16.5. 가상 머신 하드웨어 정보 창
16.1.3. virt-install을 사용한 PCI 장치 할당
--host-device
매개 변수를 사용합니다.
절차 16.5. virt-install을 사용하여 가상 머신에 PCI 장치 할당
장치 식별
게스트 가상 머신에 대한 장치 할당용으로 지정된 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
그림 16.6. PCI 장치 파일 콘텐츠
<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 그룹에 대한 자세한 내용은 16.1.1절. “virsh를 사용하여 PCI 장치 할당” 의 참고 를 참조하십시오.장치 추가
virsh nodedev 명령의 PCI 식별자 출력을--host-device
매개 변수의 값으로 사용합니다.virt-install \ --name=guest1-rhel7-64 \ --disk path=/var/lib/libvirt/images/guest1-rhel7-64.img,size=8 \ --vcpus=2 --ram=2048 \ --location=http://example1.com/installation_tree/RHEL7.0-Server-x86_64/os \ --nonetworks \ --os-type=linux \ --os-variant=rhel7 --host-device=pci_0000_01_00_0
설치 완료
게스트 설치를 완료합니다. PCI 장치를 게스트에 연결해야 합니다.
16.1.4. 할당된 PCI 장치 분리
managed
='yes'
매개 변수를 사용하여 구성된 경우 게스트 시스템에 연결하고 게스트 시스템에서 분리한 후 필요에 따라 호스트 시스템에 다시 연결합니다. PCI 장치가 관리
모드가 아닌 경우 게스트 시스템에서 PCI 장치를 분리하고 virsh 또는 virt-manager 를 사용하여 다시 연결할 수 있습니다.
절차 16.6. virsh를 사용하여 게스트에서 PCI 장치 분리
장치 분리
다음 명령을 사용하여 게스트의 XML 파일에서 해당 장치를 제거하여 게스트에서 PCI 장치를 분리합니다.# virsh detach-device name_of_guest file.xml
장치를 호스트에 다시 연결(선택 사항)
장치가관리
모드에 있는 경우 이 단계를 건너뜁니다. 장치가 호스트에 자동으로 반환됩니다.장치가관리
모드를 사용하지 않는 경우 다음 명령을 사용하여 PCI 장치를 호스트 머신에 다시 연결합니다.# virsh nodedev-reattach device
예를 들어pci_0000 644300_0
장치를 호스트에 다시 연결하려면 다음을 수행합니다.# virsh nodedev-reattach pci_0000_01_00_0
이제 호스트를 사용할 수 있는 장치를 사용할 수 있습니다.
절차 16.7. virt-manager를 사용하여 게스트에서 PCI 장치 분리
가상 하드웨어 세부 정보 화면 열기
virt-manager 에서 장치가 포함된 가상 머신을 두 번 클릭합니다. 가상 하드웨어 세부 정보 표시 버튼을 선택하여 가상 하드웨어 목록을 표시합니다.그림 16.7. 가상 하드웨어 세부 정보 버튼
장치 선택 및 제거
왼쪽 패널에 있는 가상 장치 목록에서 분리할 PCI 장치를 선택합니다.그림 16.8. 분리할 PCI 장치 선택
16.1.5. PCI 브리지
16.1.6. PCI 장치 할당 제한
allow_unsafe_interrupts
옵션을 vfio_iommu_type1
모듈에 사용하여 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