GPU passthrough, sanallaştırma dünyasının en heyecan verici ama bir o kadar da sinir bozucu konularından biri. Hypervisor üzerinde çalışan bir VM’e fiziksel ekran kartını doğrudan aktarıp neredeyse bare-metal performans elde etmek kulağa çok güzel geliyor. Ama bu işi doğru yapmak için BIOS ayarlarından kernel parametrelerine, Proxmox yapılandırmasından VM ayarlarına kadar onlarca şeyin birbiriyle uyumlu çalışması gerekiyor. Bu yazıda adım adım, gerçekçi bir yaklaşımla GPU passthrough’u nasıl yapacağını anlatacağım.
GPU Passthrough Nedir ve Neden Kullanılır?
Normal bir VM, ekran kartı kaynaklarına emülasyon katmanı üzerinden erişir. VirtIO ya da vmvga gibi sanal GPU’lar temel grafik işleri için yeterli, ama GPU hesaplama, oyun oynama, video rendering veya makine öğrenmesi iş yükleri için kesinlikle yetersiz kalır.
VFIO (Virtual Function I/O) teknolojisi sayesinde fiziksel bir PCI cihazını doğrudan VM’e bağlayabiliyoruz. Bu noktada host işletim sistemi o cihaza erişimini tamamen bırakıyor, VM ise sanki bare-metal üzerinde çalışıyormuş gibi kartı kullanıyor.
Gerçek dünya kullanım senaryoları şöyle sıralayabilirim:
- Oyun VM’leri: Windows gaming VM’i kurup Linux host üzerinde çalıştırmak, hem Linux’un esnekliğini hem Windows oyun kütüphanesini kullanmak
- Machine learning iş yükleri: CUDA gerektiren modelleri VM içinde izole bir ortamda çalıştırmak
- Video prodüksiyon: Adobe Premiere, DaVinci Resolve gibi uygulamaları GPU hızlandırmalı olarak VM’de kullanmak
- CAD/CAM: SOLIDWORKS, AutoCAD gibi uygulamaların GPU gerektiren özelliklerini VM’de kullanmak
Donanım Gereksinimleri
Her sistem GPU passthrough için uygun değil. Başlamadan önce şunların mevcut olduğundan emin olman gerekiyor:
CPU gereksinimleri:
- Intel: VT-d (Virtualization Technology for Directed I/O) desteği
- AMD: AMD-Vi (AMD I/O Virtualization Technology) desteği
Anakart gereksinimleri:
- IOMMU desteği olan anakart (genellikle Z serisi Intel veya X serisi AMD anakartlar)
- BIOS’ta IOMMU/VT-d aktif edilebilmeli
GPU gereksinimleri:
- İki ekran kartı olması en temiz çözüm: Biri host için (entegre GPU veya ikinci kart), biri VM’e aktarmak için
- Nvidia Quadro veya AMD Radeon Pro kartlar kurumsal VM lisanslama kısıtları nedeniyle daha çok tercih edilir
- Tüketici Nvidia kartlarda “Error 43” sorunu var, bunu aşmanın yollarını da göstereceğim
BIOS/UEFI Ayarları
İlk adım olarak sistemi yeniden başlatıp BIOS’a girmek gerekiyor. Her anakart üreticisinin arayüzü farklı ama araman gereken ayarlar şunlar:
Intel sistemler için:
- Advanced > CPU Configuration > Intel Virtualization Technology: Enabled
- Advanced > System Agent Configuration > VT-d: Enabled
- Bazı anakartlarda: Advanced > Chipset Configuration > VT-d: Enabled
AMD sistemler için:
- Advanced > CPU Configuration > SVM Mode: Enabled
- Advanced > NB Configuration > IOMMU: Enabled
BIOS ayarlarını kaydedip çıktıktan sonra Proxmox’a geçebiliriz.
Proxmox’ta IOMMU Aktifleştirme
Proxmox host’una SSH ile bağlanıp ilk önce IOMMU’nun düzgün çalışıp çalışmadığını kontrol edelim.
# IOMMU durumunu kontrol et
dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
# Çıktıda şuna benzer bir şey görmen lazım:
# [ 0.000000] DMAR: IOMMU enabled
# veya
# [ 0.475438] AMD-Vi: AMD IOMMUv2 loaded and initialized
Eğer çıktı boşsa BIOS ayarlarını tekrar kontrol etmen gerekiyor. IOMMU aktif görünüyorsa kernel parametrelerini ekleyelim.
# GRUB yapılandırmasını düzenle
nano /etc/default/grub
Dosyada GRUB_CMDLINE_LINUX_DEFAULT satırını bulup şöyle düzenle:
Intel için:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
AMD için:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
iommu=pt parametresi (passthrough mode) IOMMU’yu sadece passthrough cihazlar için kullanmasını sağlar, genel performansı korur. Sonra:
# GRUB'u güncelle
update-grub
# Sistemi yeniden başlat
reboot
Yeniden başlattıktan sonra IOMMU’nun aktif olduğunu doğrulayalım:
dmesg | grep -i iommu | head -20
VFIO Kernel Modüllerini Yükleme
IOMMU aktif olduğuna göre şimdi VFIO modüllerini yükleyip kalıcı hale getireceğiz.
# VFIO modüllerini /etc/modules dosyasına ekle
echo "vfio" >> /etc/modules
echo "vfio_iommu_type1" >> /etc/modules
echo "vfio_pci" >> /etc/modules
echo "vfio_virqfd" >> /etc/modules
# Modülleri hemen yükle
modprobe vfio vfio_iommu_type1 vfio_pci vfio_virqfd
# Modüllerin yüklendiğini doğrula
lsmod | grep vfio
GPU’nun PCI ID’sini Bulma
Passthrough yapacağımız GPU’nun PCI ID’sini bulmamız gerekiyor.
# Tüm PCI cihazlarını listele
lspci -nn | grep -i vga
# Daha detaylı GPU bilgisi için
lspci -nnk | grep -i -A 3 "vga|3d|display"
Örnek çıktı şöyle görünebilir:
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3080] [10de:2206] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)
Buradaki kritik bilgiler:
- PCI adresi:
01:00.0ve01:00.1(GPU ve GPU sesi genellikle birlikte gelir) - Vendor:Device ID:
10de:2206ve10de:1aef
GPU ile birlikte ses cihazını da passthrough yapmak gerekiyor, aksi takdirde HDMI/DisplayPort ses çalışmaz.
IOMMU Gruplarını Kontrol Etme
Bu adım çok önemli ve çoğu zaman atlanan bir nokta. VFIO passthrough için GPU’nun kendi IOMMU grubunda ya da aynı gruptaki tüm cihazların birlikte aktarılması gerekiyor.
# IOMMU gruplarını gösteren script
for d in /sys/kernel/iommu_groups/*/devices/*; do
n=${d#*/iommu_groups/*}; n=${n%%/*}
printf 'IOMMU Group %s ' "$n"
lspci -nns "${d##*/}"
done
Çıktıda GPU’nun bulunduğu grubu bul. İdeal senaryo şuna benzer:
IOMMU Group 14 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [10de:2206]
IOMMU Group 14 01:00.1 Audio device [0403]: NVIDIA Corporation GA102 HD Audio [10de:1aef]
Eğer GPU başka cihazlarla (özellikle PCIe köprüleriyle) aynı gruptaysa bu daha karmaşık bir durum. ACS (Access Control Services) override patch gerekebilir, ama bu ayrı bir yazı konusu.
VFIO’ya GPU’yu Bağlama
GPU’yu host driver’larından koparıp VFIO’ya bağlamamız gerekiyor. Bunu iki yöntemle yapabilirsiniz.
Yöntem 1: Modprobe Konfigürasyonu (Önerilen)
# VFIO PCI yapılandırma dosyası oluştur
echo "options vfio-pci ids=10de:2206,10de:1aef" > /etc/modprobe.d/vfio.conf
# Blacklist'e Nvidia/AMD driver'larını ekle (GPU host'ta kullanılmayacaksa)
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_uvm" >> /etc/modprobe.d/blacklist.conf
# initramfs güncelle
update-initramfs -u -k all
# Yeniden başlat
reboot
Yeniden başlattıktan sonra GPU’nun VFIO’ya bağlandığını doğrulayalım:
lspci -nnk -d 10de:2206
# Çıktıda "Kernel driver in use: vfio-pci" görmen lazım
Proxmox’ta VM Oluşturma ve GPU Ekleme
Artık Proxmox web arayüzüne geçip VM’i oluşturabiliriz. Web UI üzerinden de yapılabilir ama komut satırından daha hassas kontrol sağlayabilirsiniz.
Önce web UI üzerinden standart bir VM oluşturun:
- OS: Windows 10/11 ISO’su
- System: Machine type olarak q35 seçin (PCIe passthrough için zorunlu)
- BIOS: OVMF (UEFI) seçin
- CPU: Host CPU type seçin, Proxmox CPU emülasyonu yerine fiziksel CPU’yu göstermek için
VM oluşturduktan sonra GPU’yu ekleyelim:
# VM ID'nizi öğrenin (örnek: 100)
qm list
# GPU'yu VM'e PCI device olarak ekle
# x-vga=on: GPU'yu primary VGA olarak işaretle
# pcie=1: PCIe modu kullan
# rombar=1: ROM BAR'ı aktif et
qm set 100 -hostpci0 01:00.0,pcie=1,x-vga=1,rombar=1
# GPU ses cihazını da ekle
qm set 100 -hostpci1 01:00.1,pcie=1
Aynı şeyi Proxmox web arayüzünden de yapabilirsiniz: VM > Hardware > Add > PCI Device.
VM CPU ve RAM ayarlarını da düzenleyelim:
# CPU topology ayarla (önemli)
qm set 100 -cpu host,hidden=1,flags=+pcid
# NUMA topolojisini aktif et (opsiyonel ama performans için iyi)
qm set 100 -numa 1
hidden=1 parametresi özellikle Nvidia tüketici kartları için önemli. VM içindeki Nvidia driver’ının “bu bir hypervisor” diye fark etmesini ve Error 43 vermesini engelliyor.
Hugepages ile Bellek Performansını Artırma
VM belleği için hugepages kullanmak ciddi performans artışı sağlar. Özellikle gaming ve ML iş yükleri için tavsiye ederim.
# Mevcut hugepages durumunu kontrol et
cat /proc/meminfo | grep -i huge
# 2MB hugepages için hesaplama: VM RAM (GB) * 512
# Örneğin 16GB VM için: 16 * 512 = 8192 adet 2MB hugepage
# /etc/default/grub'a hugepages parametresi ekle
# GRUB_CMDLINE_LINUX_DEFAULT satırına ekle: hugepages=8192
# VM'e hugepages kullanmasını söyle
qm set 100 -hugepages 2
CPU Pinning: Gerçek Performans Buradan Geliyor
Gaming veya düşük gecikme gerektiren iş yükleri için CPU pinning kritik. VM’in kullandığı CPU çekirdeklerini sabit belirliyoruz.
# Sisteminizin CPU topolojisini anlayın
lscpu | grep -E "Socket|Core|Thread"
# CPU pinning örneği: 16 çekirdekli sistemde VM'e 6 fiziksel çekirdek ver
# Önce çekirdek numaralarını öğren
cat /proc/cpuinfo | grep "core id" | sort | uniq
# CPU pinning uygula (örnek: çekirdek 2-7 ve karşılık gelen HT thread'leri)
qm set 100 -vcpus 12
qm set 100 -affinity 2-7,18-23
Nvidia Error 43 Sorunu
Tüketici Nvidia kartlarında karşılaşılan en yaygın sorun bu. Windows’ta Device Manager’da sarı ünlem ve “Code 43” hatası alıyorsunuz. Bunun nedeni Nvidia driver’ının hypervisor tespiti yapması.
Zaten yukarıda cpu parametresine hidden=1 ekledik. Ama yeterli olmadığı durumlar için VM konfigürasyonuna şunu ekleyebilirsiniz:
# VM config dosyasını direkt düzenle
nano /etc/pve/qemu-server/100.conf
# Dosyaya şu satırı ekle:
# args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=NvidiaFTW,kvm=off'
Bazı durumlarda GPU ROM dosyasını da eklemeniz gerekebilir:
# GPU vBIOS ROM'unu dökümle (isteğe bağlı, sorun yaşarsanız)
# Önce GPU sürücüsünü kısa süreliğine yükle, ROM'u al, sonra tekrar kaldır
echo 1 > /sys/bus/pci/devices/0000:01:00.0/rom
cat /sys/bus/pci/devices/0000:01:00.0/rom > /tmp/gpu.rom
echo 0 > /sys/bus/pci/devices/0000:01:00.0/rom
# ROM dosyasını Proxmox ROM dizinine kopyala
cp /tmp/gpu.rom /usr/share/kvm/gpu.rom
# VM config'e ROM'u ekle
qm set 100 -hostpci0 01:00.0,pcie=1,x-vga=1,rombar=1,romfile=gpu.rom
AMD Kartlarda Reset Bug
AMD kartlarda, özellikle Polaris ve Vega serilerinde, VM kapatıldıktan sonra kart kendini düzgün resetleyemez ve bir sonraki VM başlatımında kart çalışmaz hale gelir.
# vendor-reset modülünü kur
apt install dkms git build-essential -y
git clone https://github.com/gnif/vendor-reset
cd vendor-reset
dkms install .
# Modülü yükle
modprobe vendor-reset
# Kalıcı hale getir
echo "vendor-reset" >> /etc/modules
VM’i Test Etme
Her şeyi ayarladıktan sonra VM’i başlatma zamanı. İlk başlatmada Proxmox console’u yerine Looking Glass veya başka bir yöntem kullanabilirsiniz, çünkü VM artık fiziksel ekrana çıktı veriyor.
# VM'i başlat
qm start 100
# VM durumunu kontrol et
qm status 100
# VM log'larını takip et
tail -f /var/log/syslog | grep -i kvm
Windows kurulumu tamamlandıktan sonra VM içinde:
- Device Manager’da GPU’nun görünüp görünmediğini kontrol edin
- Nvidia/AMD driver’larını kurun
- GPU-Z ile kartın tam hızda çalışıp çalışmadığını kontrol edin
Looking Glass ile Ekransız Çalışma
Eğer dedicated bir monitörünüz yoksa, Looking Glass projesi VM’deki GPU çıktısını host ekranına minimal gecikmeyle aktarmanızı sağlıyor.
# Host'ta Looking Glass istemcisini kur
apt install cmake pkg-config libfontconfig-dev libgmp-dev
libspice-protocol-dev libx11-dev libxfixes-dev libxi-dev
libxinerama-dev libxss-dev libwayland-dev -y
# Looking Glass için paylaşımlı bellek ekle (VM config'e)
# nano /etc/pve/qemu-server/100.conf
# ivshmem: size=128,name=looking-glass (128MB, 4K için yeterli)
qm set 100 -ivshmem size=128,name=looking-glass
VM içinde Looking Glass host uygulamasını (B-frames.exe) çalıştırıp host’ta client’ı başlatınca GPU çıktısını neredeyse sıfır gecikmeyle host ekranında görebilirsiniz.
Sorun Giderme: Sık Karşılaşılan Durumlar
VM başlamıyor, QEMU hatası alıyorum
# QEMU log'larına bak
journalctl -u qemu-server@100 --no-pager -n 50
# ya da
cat /var/log/syslog | grep -i "qemu|kvm" | tail -30
En sık sebep: GPU hala VFIO’ya değil başka driver’a bağlı.
IOMMU grupları iç içe geçmiş
Bu durumda ACS override patch gerekiyor. Proxmox kernel’i bu patchi desteklemiyor ama community kernel ile çözülebilir.
# GRUB'a ACS override ekle (dikkatli kullan, güvenlik riski var)
# GRUB_CMDLINE_LINUX_DEFAULT satırına ekle:
# pcie_acs_override=downstream,multifunction
GPU reset sonrası çalışmıyor
VM kapatıp host’ta GPU’yu resetlemeyi dene:
echo 1 > /sys/bus/pci/devices/0000:01:00.0/reset
Proxmox Cluster’da GPU Passthrough
Birden fazla Proxmox node’unuz varsa ve GPU passthrough yapılmış VM’leri migrate etmek istiyorsanız: bu mümkün değil. GPU passthrough yapılmış VM’ler canlı migrate edilemez, sadece durdurulup başka node’da başlatılabilir. Bu kısıtlamayı cluster planlamasında göz önünde bulundurmanız gerekiyor.
# VM'i durdur, başka node'a taşı, orada başlat
qm stop 100
qm migrate 100 pve-node2 --online 0
# pve-node2'de:
qm start 100
Performans Doğrulama
Her şey ayarlandıktan ve VM çalışır hale geldikten sonra gerçekten ne kadar performans elde ettiğinizi ölçmek önemli.
# Host'ta GPU'nun VFIO'ya bağlı olduğunu doğrula
lspci -nnk | grep -A 3 "NVIDIA|AMD/ATI"
# "Kernel driver in use: vfio-pci" görmelisin
# VM içinde (Windows) GPU benchmark için
# 3DMark, Unigine Heaven, FurMark kullanabilirsin
# VM içinde (Linux) basit GPU test
glxgears
glxinfo | grep "OpenGL renderer"
Bare-metal performansın %95-98’ini GPU passthrough ile yakalamak mümkün. Küçük kayıp genellikle PCIe bus overhead’inden geliyor.
Sonuç
GPU passthrough karmaşık görünüyor ama adımları sırayla takip edince oldukça sistematik bir süreç. En kritik noktaları özetleyeyim:
- BIOS’ta IOMMU mutlaka aktif olmalı
- IOMMU grupları temiz olmalı, GPU tek başına veya sadece kendi ses cihazıyla aynı grupta olmalı
- VM machine type’ı q35, BIOS’u UEFI olmalı
- Nvidia tüketici kartları için
hidden=1vekvm=offparametreleri şart - CPU pinning ve hugepages ile performansı bare-metal seviyesine yaklaştırabilirsiniz
Bu kurulum bir kez düzgün yapıldığında son derece stabil çalışıyor. Üç yıldır gaming VM olarak kullandığım bir sistemde yüzlerce saatlik çalışma süresi boyunca ciddi bir sorun yaşamadım. Proxmox’un güçlü VM yönetimi ile fiziksel bir bilgisayarın GPU performansını bir arada elde etmek gerçekten değiyor.
Sorularınız veya farklı senaryolarınız varsa yorum bırakın, elimden geldiğince yardımcı olmaya çalışırım.