Xen PCI Passthrough


Xen PCI Passthrough
Xen Hypervisor에서 PCI 장치를 직접 Guest에게 할당하는 Pass Through 통과 방법에 대해서 설명드리겠습니다. 사운드 카드와 Intel IGD(Integrated Graphics)를 대상으로 Xen VGA Passthrough 함께 테스트 해보도록 하겠습니다. 하드웨어와 소프트웨어 환경등을 함께 설명드리도록 하겠습니다.

소개

PCI passthrough는 NIC, 디스크 컨트롤러, HBA, USB 컨트롤러와 사운드 카드 등의 PCI 장치를 직접적으로 Guest에게 할당하여 바로 제어하고 접근 할 수 있도록 하는 방법입니다. 다음과 같은 특징과 장점이 있습니다.

  • Virtual Network의 가장 큰 오버헤드가 트래픽이 복사되는 것입니다. PCI Pass Through 기술은 호스트가 직접 NIC에 접근하여 처리하기 때문이 어러한 오버헤드를 피할 수 있습니다.
  • 그래픽 카드를 직접 Guest 에게 할당 할 수 있으면, 3D 가속등의 하드웨어 기능을 오버헤드가 없이 Guest 에서 사용할 수 있습니다.

하드웨어

Xen Hypervisor 에서 PCI Passthrough를 통하여 PCI 장치를 Guest에게 직접 할당하기 위해서는 IOMMU 가상화기술(VT-d)이 지원되는 하드웨어가 필요합니다. 가상화 기술이 지원되는 하드웨어 목록은 아래에서 페이지에서 확인 가능합니다.

https://wiki.xen.org/wiki/VTd_HowTo

https://en.wikipedia.org/wiki/List_of_IOMMU-supporting_hardware

이글을 작성하면서 테스트 하드웨어 환경은 아래와 같습니다.

CPU Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
Motherboard ASRock Z87 Extreme6
VGA Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
Audio Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller (rev 05)

소프트웨어

Intel IGD의 VGA와 사운드카드를 전가상화(HVM) 방식으로 Guest에게 직접 할당하는 방법을 설명드릴 예정입니다. 하지만 VGA 어댑터의 경우 다른 네트워크 인터페이스카드와 디스크 컨트롤러등과 다르게 Guest에게 직접 할당하는 방법이 간단하지 않습니다.

할당된 VGA 어댑터가 Guest 에서 정상적으로 동작하기 위해서는 VGA BIOS, 텍스트 모드, IO 포트, 메모리 범위 및 VESA 비디오 모드 등 과거 legacy x86 특징들을 지원해야 합니다. 이를 위해서 VGA Passthrough는 일반적인 Xen VT-d PCI Passthrough 기술보다 더 많은 코드들이 필요합니다.

따라서 Xen Hypervisor는 Qemu이라는 프로세스 뿐만 아니라 PCI 등 주변 장치까지 에뮬레이팅 하는 가상화 소프트웨어를 xl 툴스택에 포함(a fork of qemu)시켰습니다. 이것이 ‘qemu-xen-traditional’ 입니다.

하지만, Qemu 1.0부터 Xen을 공식적으로 지원하기(part of the mainline Qemu) 시작하면서 Xen 4.2 부터 ‘qemu-xen’ 이름으로 사용되기 시작하였습니다. Xen 4.3 부터는 기본 버전으로 사용되기 시작하였고 상위 버전에서는 더이상 기존의 ‘qemu-xen-traditional’를 지원하지 않습니다.

이 글에서는 PCI Passthrough 뿐만 아니라 VGA Passthrough 를 함께 테스트하고자합니다. 하지만 아직 현재의 최신버전의 ‘qemu-xen’ 에서는 VGA Passthrough를 완벽하게 지원하지 않습니다. 따라서 기존의 ‘qemu-xen-traditional’를 사용하여 VGA Passthrough를 테스트 하기 위해서 이전 버전인 Xen 4.4 버전을 사용하도록 하겠습니다.

간단한 PCI Passthrough를 사용하기 위해서는 최신 버전의 Xen을 사용하셔도 됩니다. Xen Hypervisor 설치 방법은 아래 글을 참고해 주시기 바랍니다.

Xen Hypervisor 설치

환경 설정

Hypervisor 호스트에서 xl dmesg 명령어를 실행하신 다음, 가상화 환경이 지원되는지 확인해 주시기 바랍니다.

(XEN) Intel VT-d iommu 0 supported page sizes: 4kB.
(XEN) Intel VT-d iommu 1 supported page sizes: 4kB.
(XEN) Intel VT-d Snoop Control not enabled.
(XEN) Intel VT-d Dom0 DMA Passthrough not enabled.
(XEN) Intel VT-d Queued Invalidation enabled.
(XEN) Intel VT-d Interrupt Remapping enabled.
(XEN) Intel VT-d Shared EPT tables not enabled.
(XEN) I/O virtualisation enabled

그리고, lspci 명령어를 이용하여 Guest에게 할당할 VGA 등 PCI 장치와 아이디 정보를 확인합니다. 여러가지 장치가 나오는데, 저는 다음 장치를 Guest에게 할당하도록 하겠습니다.

아이디 유형 모델
00:02.0 VGA compatible controller Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
00:1b.0 Audio device Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller (rev 05)

커널 모듈 로드

PCI Passthrough 에 사용되는 커널 모듈이 추가적으로 로드되어져야 합니다. modprobe xen-pciback 명령어를 사용하여 커널 모듈을 로드할 수도 있지만, 부팅시 자동으로 로드될 수 있도록 설정하도록 하겠습니다.

/etc/initramfs-tools/modules 파일을 열고 아래의 내용을 추가합니다.

xen-pciback

또는 위의 커널 모듈 뿐만아니라 다음과 같은 문법으로 hide 장치를 지정할 수 도 있습니다.

# Syntax:  module_name [args ...]
xen-pciback hide=(00:1b.0)

보다 자세한 xen-pciback 커널 파라미터는 아래의 명령을 통해 확인 할 수 있으며, 설정된 값등은 /sys/module/xen_pciback/parameters/ 위치에서 확인 하실 수 있습니다.

$ sudo modinfo xen-pciback
filename:       /lib/modules/4.4.0-128-generic/kernel/drivers/xen/xen-pciback/xen-pciback.ko
alias:          xen-backend:pci
license:        Dual BSD/GPL
srcversion:     9E677026D6BD2570600CDAE
depends:        
retpoline:      Y
intree:         Y
vermagic:       4.4.0-128-generic SMP mod_unload modversions retpoline 
parm:           permissive:bool
parm:           passthrough:Option to specify how to export PCI topology to guest:
 0 - (default) Hide the true PCI topology and makes the frontend
   there is a single PCI bus with only the exported devices on it.
   For example, a device at 03:05.0 will be re-assigned to 00:00.0
   while second device at 02:1a.1 will be re-assigned to 00:01.1.
 1 - Passthrough provides a real view of the PCI topology to the
   frontend (for example, a device at 06:01.b will still appear at
   06:01.b to the frontend). This is similar to how Xen 2.0.x
   exposed PCI devices to its driver domains. This may be required
   for drivers which depend on finding their hardward in certain
   bus/slot locations. (bool)
parm:           verbose_request:int
parm:           hide:charp

그리고 다음 명령어를 실행 후 재부팅 합니다.

$ sudo update-initramfs -u

할당 가능한 PCI 장치 확인

커널 모듈이 로드되었을 경우 xl pci-assignable-* 와 같은 Guest에 할당 가능한 PCI 장치 목록을 확인 할 수 있습니다.
아래의 명령어를 이용하여 할당 가능한 PCI 장치를 확인하고 추가해 보도록하겠습니다.

$ sudo xl pci-assignable-list
$ sudo xl pci-assignable-add 00:02.0
$ sudo xl pci-assignable-add 00:1b.0
$ sudo xl pci-assignable-list
0000:00:02.0
0000:00:1b.0

Guest 설정 파일 작성

HVM 방식의 Guest 설정 파일에 PCI 를 할당하는 내용을 추가합니다.

device_model_version = 'qemu-xen-traditional'

acpi = '1'
apic = '1'

viridian = '1'
xen_platform_pci = '1'
gfx_passthru = '0'
pci = ['00:02.0', '00:1b.0']

gfx_passthru 값은 할당되는 VGA가 Guest에서 주 VGA으로 사용될지 여부에 따른 논리값입니다. 위의 내용과 같이 수정 후 Guest 를 실행하면 할당된 PCI가 Guest에서 내에서 직접 사용 할 수 있으실 겁니다.

자세한 Guest 생성과 실행 방법은 다음글을 참고해 주시기 바랍니다.

Xen 사용법 Guest 생성 방법 예제

( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)