virtualization / knowledge

IOMMU를 켜고 vfio 모듈로 GPU를 잡아두기

paul 2025.10.13 225words (1m)

BIOS를 맞췄으면 Proxmox 쪽에서 IOMMU를 켜고, 넘길 장치를 host가 쓰지 못하게 vfio가 먼저 잡게 해야 한다.

장치 id 확인

console
$ 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 에서 커널 파라미터를 준다.

bash
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"

IOMMU는 PCIe 장치와 메모리 사이를 매핑하고 격리하는 하드웨어 기능이다. 이게 있어야 VM에 넘긴 장치가 VM 밖의 메모리를 건드리지 못한다.

iommu=pt 는 passthrough 모드다. host 자신이 쓰는 장치들은 IOMMU 변환을 거치지 않고 바로 접근하게 한다. 넘길 장치만 변환을 태우므로 나머지 성능 손해가 없다.

console
$ update-grub

커널 모듈

/etc/modules 에 부팅 때 올릴 모듈을 적는다.

console
$ 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에 넘길지

console
$ echo "options vfio-pci ids=1002:164e,1002:1640" >> /etc/modprobe.d/vfio.conf

앞에서 확인한 id 두 개를 그대로 적는다. 이 목록에 있는 장치는 vfio-pci 가 소유한다.