virtualization / knowledge
IOMMU를 켜고 vfio 모듈로 GPU를 잡아두기
BIOS를 맞췄으면 Proxmox 쪽에서 IOMMU를 켜고, 넘길 장치를 host가 쓰지 못하게 vfio가 먼저 잡게 해야 한다.
장치 id 확인
$ lspci -nn | grep -e 'AMD/ATI'
75:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Raphael [1002:164e] (rev c5)
75:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Rembrandt Radeon High Definition Audio Controller [1002:1640]
GPU 하나를 넘기는데 장치가 두 개 나온다. VGA와 오디오가 같은 function group에 묶여 있다. HDMI로 소리도 나가야 하므로 둘 다 넘겨야 한다.
- iGPU:
1002:164e(75:00.0) - Audio:
1002:1640(75:00.1)
grub
/etc/default/grub 에서 커널 파라미터를 준다.
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
IOMMU는 PCIe 장치와 메모리 사이를 매핑하고 격리하는 하드웨어 기능이다. 이게 있어야 VM에 넘긴 장치가 VM 밖의 메모리를 건드리지 못한다.
iommu=pt 는 passthrough 모드다. host 자신이 쓰는 장치들은 IOMMU 변환을 거치지 않고 바로 접근하게 한다. 넘길 장치만 변환을 태우므로 나머지 성능 손해가 없다.
$ update-grub
커널 모듈
/etc/modules 에 부팅 때 올릴 모듈을 적는다.
$ echo "vfio" >> /etc/modules
$ echo "vfio_iommu_type1" >> /etc/modules
$ echo "vfio_pci" >> /etc/modules
$ echo "vfio_virqfd" >> /etc/modules
| 모듈 | 역할 |
|---|---|
vfio |
userspace에서 장치에 접근할 수 있게 하는 framework |
vfio_iommu_type1 |
IOMMU 매핑 방식 구현 |
vfio_pci |
PCI 장치용 VFIO 드라이버. 원래 드라이버 대신 이 모듈이 해당 function을 소유한다 |
vfio_virqfd |
eventfd로 하드웨어 인터럽트를 주고받게 하는 보조 모듈 |
어떤 장치를 vfio에 넘길지
$ echo "options vfio-pci ids=1002:164e,1002:1640" >> /etc/modprobe.d/vfio.conf
앞에서 확인한 id 두 개를 그대로 적는다. 이 목록에 있는 장치는 vfio-pci 가 소유한다.