KVM IOMMU PassThrough 설정하기

KVM 을 이용한 가상화에서 게스트에 장치를 넘기기 위한 방법으로 IOMMU Passthrough 설정을 해줘야 한다. 이 설정은 호스트 컴퓨터에서 하게 되며, 커널 모듈 설정등을 필요로 한다. 대표적으로 NVIDIA 그래픽 카드를 게스트에서 사용하도록 하는 설정이 있다.

IOMMU 바이오스 설정

제일 우선적으로 필요한 것이 BIOS 에서 IOMMU 를 설정하는 것이다. 대부분의 현대 BIOS 대부분에는 IOMMU 를 지원한다. 따라서 BIOS 설정에서 IOMMU 를 활성해 줘야 한다. 바이오스에서 IOMMU 설정을 하고 리눅스로 부팅한 후 다음과 같이 확인할 수 있다.

장치 체크

리눅스로 부팅하고 난 후 IOMMU Passthrough 를 할 장치를 살펴봐야 한다. 이는 lspci 명령어를 사용해 확인할 수 있다.

여기서 중요한 것은 맨 오른쪽에 대괄호의 내용이다. [10de:2488], [10de:228b] 이 두가지를 기록해 둔다.

Grub 설정 변경하기

앞서 살펴본 장치에 내용을 이제 Grub 설정을 해줘야 한다. 이는 /etc/default/grub 파일에서 GRUB_CMDLINE_LINUX_DEFAULT 를 다음과 같이 추가 한다.

AMD 를 사용하고 있을 경우에는 amd_iommu, Intel 을 사용하면 intel_iommu 라고 해야 한다. 그리고 vfio-pci.ids 에 내용은 앞서 장치 체크에서 봤던 내용을 적어주면 된다. 그리고 다음과 같이 grub 을 업데이트 해주고 재부팅 해준다.

IOMMU 그룹 확인

재부팅 후에 IOMMU 그룹으로 잘 묶여 있는지를 확인해야 한다. 패스쓰루가 원할하게 이루어질 수 있도록 GPU 장치가 별도의 그룹으로 되어 있어야 한다.

NVIDIA GPU 는 IOMMU Group 2 로 묶여 있기는 하지만 05:00.0, 05:00.1 로 나오고 있다. 위 내용은 다음의 내용을 참고 했다.

VFIO-PCI 드라이버 설정

VFIO 는 Virtual Function I/O 로 리눅스 커널에서 제공하는 가상화용 I/O 프레임워크다. 호스트의 PCI 장치를 안전하게 VM 에 직접 넘겨주는(직접 할당) 메커니즘이다. VFIO 는 1) 장치를 호스트에서 분리하는 것으로 GPU, NVMe, USB 컨트롤러 같은 PCI 장치를 호스트 OS가 사용하지 못하게 만든다. 2) 장치를 VM 에 직접 연결(pass-through) 로 장치를 VM이 “물리 장치처럼” 직접 제어하게 한다.

VFIO 의 위치는 다음과 같다.

이를 위해서는 VFIO-PCI 드라이버를 커널이 사용할 수 있도록 해야 한다. 커널에 포함되어 있으면 이번 작업이 필요가 없지만, 모듈을 로딩하도록 한다.

내용을 보면 vfio-pci 에 ids 로 장치를 입력해주고 있다. 이는 앞서 체크한 Nvidia GPU 의 ids 값이다. softdep 의 내용은 호스트에서 사용할 드라이버 보다 vfio-pci 를 먼저 로딩하도록 한다.

VFIO 드라이버 로딩

부팅시 VFIO 드라이버가 로딩 되도록 다음과 같이 설정한다.

또한, 호스트에서 사용할 드라이버는 로딩되지 않도록 막아야 한다.

다음과 같이 적용해서 재부팅을 한다.

확인

재부팅이 되고 난 후에 다음과 같이 확인 할 수 있다.

‘Kernel driver in use: vfio-pci’ 라고 나오면 정상이다.

KVM 에서 사용하기

이제 KVM 에서 게스트에게 GPU 를 사용해 보자. 여기서 주의해야할 것은 새로운 게스트 OS 를 설치할 때 GPU 를 미리 할당할 필요는 없다. OS 설치를 모두하고 난후에 GPU 를 할당해도 아무런 문제가 없다.

게다가 vim 편집기를 이용해서 직접 xml 을 편집하기 보다는 virt-manager 를 이용하길 권한다.

그림1. Virt-Manager 에서 Nvidia GPU 장치 추가하기

장치가 나오더라도 VFIO-PCI 설정이 되어 있지 않으면 추가가 되지 않는다.

부록: check_iommu.sh

IOMMU 를 체크하는 스크립트로 다음과 같다.

이 스크립트는 다음 사이트에서 가지고 왔다.

참고 사이트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다