Belajar KVM & QEMU - PCI/GPU Passthrough (VFIO)
Episode 18 of 23

Belajar KVM & QEMU - PCI/GPU Passthrough (VFIO)

Meneruskan hardware fisik ke VM dengan VFIO: mengaktifkan IOMMU lewat kernel parameter, bind driver vfio-pci, device -device vfio-pci host XX:XX, passthrough GPU untuk workload berat, dan perbandingannya dengan virtio-gpu

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Semua device virtual (virtio, emulasi) melewati QEMU — ada overhead. Passthrough mengubah aturan main: hardware fisik (NIC, NVMe, GPU) diteruskan langsung ke VM. VFIO (Virtual Function I/O) adalah mekanisme kernel yang memungkinkan ini dengan aman lewat IOMMU.

Episode 18 membahas passthrough PCI/GPU dengan VFIO — topik favorit untuk gaming VM, GPU rendering, dan workload yang butuh latensi hardware asli. Ini juga topik yang paling banyak menyebabkan admin frustrasi, jadi mari kita bedah langkah demi langkah.

Kenapa Perlu IOMMU

Tanpa IOMMU, device yang di-passthrough bisa menulis DMA ke alamat memori mana pun — ancaman besar jika guest dikompromi. IOMMU memetakan dan membatasi DMA: guest hanya bisa menyentuh memori yang diberikan libvirt/QEMU. Inilah dasar keamanan passthrough.

Aktifkan IOMMU di kernel command line (GRUB):

Aktifkan IOMMU di GRUB (Intel)
# /etc/default/grub → tambahkan:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"
Aktifkan IOMMU di GRUB (AMD)
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt"

iommu=pt memberi passthrough mode (device tetap DMA tanpa translasi di jalan pintas) dan memperbaiki performa. Terapkan dengan:

Update GRUB dan reboot
sudo update-grub
sudo reboot

Verifikasi IOMMU aktif:

Cek grup IOMMU
dmesg | grep -i -e DMAR -e IOMMU
ls /sys/kernel/iommu_groups/

Jika /sys/kernel/iommu_groups/ ada isinya, IOMMU jalan.

Warning

Sebelum lanjut, pastikan device kalian (terutama GPU) berada di grup IOMMU tersendiri. GPU + audio (HDMI) sering terpisah grup — kalian butuh keduanya untuk passthrough penuh. Cek dengan script iommu_group untuk melihat device apa saja yang "menempel" pada grup yang sama.

Menemukan Device dan Binding VFIO-PCI

Identifikasi device yang akan di-passthrough (misal GPU kedua):

Daftar device PCI
lspci | grep -i -E "vga|nvidia|amd"

Misal hasilnya 01:00.0 dan 01:00.1 (audio). Bind ke vfio-pci secara persisten lewat kernel command line:

Bind vfio-pci via kernel cmdline (GRUB)
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt vfio-pci.ids=10de:1c02,10de:10f1"

vfio-pci.ids= memakai vendor:device IDs (bukan slot address, karena bisa berubah). Alternatif di runtime:

Bind vfio-pci di runtime (uji cepat)
sudo modprobe vfio-pci
echo 0000:01:00.0 | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo 10de 1c02 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id

Verifikasi driver aktif:

Cek driver vfio
lspci -k -d 10de:1c02

Baris Kernel driver in use: vfio-pci berarti siap.

Passthrough di QEMU dan libvirt

Command line QEMU:

Passthrough GPU dengan QEMU
qemu-system-x86_64 \
  -machine q35 -accel kvm -m 8192 -smp 4 \
  -drive file=vm.qcow2,format=qcow2,if=virtio \
  -device vfio-pci,host=0000:01:00.0 \
  -device vfio-pci,host=0000:01:00.1 \
  -display gtk

-device vfio-pci,host=BB:DD.F meneruskan device tersebut ke guest. Di libvirt, passthrough direpresentasikan sebagai:

Hostdev passthrough (libvirt)
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</hostdev>
  • managed='yes' — libvirt otomatis bind/unbind vfio-pci saat VM start/stop.
  • <source> — alamat device fisik.
  • <address> — alamat PCI virtual yang diekspos ke guest.

Tip

Gunakan managed='yes' — libvirt menangani binding driver secara otomatis, menghindari device "terkunci" di host saat VM mati. Untuk GPU, beri guest RAM yang cukup dan pasang driver GPU di dalam guest (misal NVIDIA driver untuk guest Linux/Windows).

GPU Passthrough vs virtio-gpu

Aspekvirtio-gpuGPU Passthrough (VFIO)
SifatVirtual, paravirtualHardware fisik langsung
PerformaTerbatas, komputasi 2D ringanNative, akselerasi penuh
Driver guestVirtio bawaanDriver vendor (NVIDIA/AMD)
Use caseDesktop ringan, server headlessGaming, rendering, ML/CUDA
Migrasi liveBisaTidak bisa (device fisik terikat)

Pilih virtio-gpu untuk kebutuhan ringan dan portabilitas; pilih passthrough hanya saat workload benar-benar butuh performa hardware native. Ingat konsekuensinya: VM dengan passthrough tidak bisa live migrate (episode 15).

Common Pitfalls

  • Grup IOMMU terbagi: device lain (misal audio) di grup yang sama ikut kena passthrough — pasang semuanya atau atur ulang.
  • GPU hanya punya satu output di grup: passthrough GPU yang juga dipakai host → konflik; gunakan GPU khusus atau second GPU.
  • Reset GPU saat reboot VM gagal: beberapa GPU butuh reset — gunakan kernel parameter modprobe vfio_pci + script reset atau pci_stub.
  • Lupa managed='yes': device tetap dibind vfio-pci setelah VM mati — host kehilangan device.
  • Passthrough ≠ live migration: jangan rancang HA yang mengandalkan migrasi untuk VM passthrough.

Penutup

Pada episode 18 ini, kalian telah memahami passthrough VFIO.

Inti yang harus dibawa pulang:

  • IOMMU (intel_iommu=on/amd_iommu=on + iommu=pt) adalah prasyarat keamanan DMA.
  • Bind device dengan vfio-pci.ids= (vendor:device) agar persisten dan tak tergantung slot.
  • -device vfio-pci,host=BB:DD.F meneruskan device; di libvirt pakai <hostdev type='pci' managed='yes'>.
  • GPU passthrough untuk workload berat; virtio-gpu untuk kebutuhan ringan.
  • Passthrough tidak bisa live migrate — rancang sesuai.

Di episode 19 selanjutnya, kita akan membahas nested virtualization & performance — mengaktifkan nested=1 untuk KVM di dalam VM, CPU pinning dengan taskset dan virsh vcpupin, hugepages, KSM dedup, serta -cpu host,invtsc untuk akurasi timing. Sampai jumpa di episode 19!

Belajar KVM & QEMU - PCI/GPU Passthrough (VFIO) | Belajar KVM & QEMU