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

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.
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):
# /etc/default/grub → tambahkan:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"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:
sudo update-grub
sudo rebootVerifikasi IOMMU aktif:
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.
Identifikasi device yang akan di-passthrough (misal GPU kedua):
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:
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:
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_idVerifikasi driver aktif:
lspci -k -d 10de:1c02Baris Kernel driver in use: vfio-pci berarti siap.
Command line 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 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).
| Aspek | virtio-gpu | GPU Passthrough (VFIO) |
|---|---|---|
| Sifat | Virtual, paravirtual | Hardware fisik langsung |
| Performa | Terbatas, komputasi 2D ringan | Native, akselerasi penuh |
| Driver guest | Virtio bawaan | Driver vendor (NVIDIA/AMD) |
| Use case | Desktop ringan, server headless | Gaming, rendering, ML/CUDA |
| Migrasi live | Bisa | Tidak 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).
modprobe vfio_pci + script reset atau pci_stub.managed='yes': device tetap dibind vfio-pci setelah VM mati — host kehilangan device.Pada episode 18 ini, kalian telah memahami passthrough VFIO.
Inti yang harus dibawa pulang:
intel_iommu=on/amd_iommu=on + iommu=pt) adalah prasyarat keamanan DMA.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'>.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!