Bir Proxmox düğümüne ekran kartı takıp sanal makineye vermek, kağıt üzerinde "cihazı seç, ekle, bitti" gibi görünür. Gerçekte ise Proxmox GPU passthrough, ana makinenin ekran kartına dokunmasını engellemek, IOMMU gruplarının doğru ayrılmış olmasını sağlamak ve sürücü seviyesinde birkaç ince ayarı doğru yapmakla ilgilidir. Bu adımlardan biri atlanırsa ya sanal makine açılmaz, ya ana makine karanlığa düşer ya da konuk sistemde meşhur "Error 43" ile karşılaşırsınız.
Bu rehberde bir GPU'yu Proxmox üzerinde bir KVM sanal makinesine baştan sona nasıl vereceğinizi anlatacağım: BIOS'ta neyi açmanız gerektiğinden başlayıp IOMMU'yu etkinleştirmeye, kartı vfio-pci sürücüsüne bağlamaya, sanal makine tarafındaki doğru makine tipi ve BIOS seçimine kadar. Sonda da yıllardır aynı sırayla tekrarlanan hataları ve her birinin somut çözümünü toplayacağım. Konuya tümüyle yabancıysanız, mekanizmanın genel mantığı için önce PCI passthrough nedir yazısını okumanız işinizi kolaylaştırır.
Ön Koşullar: Donanım Neyi Desteklemeli#
GPU passthrough bir yazılım hilesi değildir; donanımın izin vermesi gerekir. Üç katmanın da hazır olması şart: CPU, anakart ve BIOS. Intel tarafında ihtiyacınız olan özellik VT-d, AMD tarafında ise AMD-Vi (BIOS'ta genellikle "IOMMU" olarak geçer). CPU desteklese bile anakart üreticisi bu özelliği BIOS'ta kapalı bırakmış olabilir; sunucu anakartlarında genellikle açıktır ama masaüstü sınıfı kartlarda kapalı gelir.
BIOS/UEFI ekranında açmanız gereken ayarlar tipik olarak şunlardır:
- Intel VT-d veya AMD IOMMU / SVM Mode — sanallaştırma ve cihaz yalıtımının temel anahtarı.
- Above 4G Decoding — modern GPU'ların büyük bellek pencerelerini adresleyebilmesi için gerekir; kapalıysa kart konuk sistemde başlatılamaz.
- Resizable BAR / SR-IOV — bazı anakartlarda passthrough ile çakışır; ilk kurulumda kapalı bırakıp sorun yoksa sonra deneyin.
- Primary Display / Init Display First — mümkünse ana ekranı entegre grafiğe (iGPU) ya da ikinci karta alın; ayırmak istediğiniz kart ana ekran olmasın.
Ayrıca ekran kartının ayrı bir IOMMU grubunda olması gerekir. IOMMU grubu, donanımın birlikte yalıtılabilen en küçük cihaz kümesidir; kartınız ağ kartıyla ya da bir USB denetleyicisiyle aynı grupta ise ikisini birden vermek zorunda kalırsınız. Sunucu sınıfı anakartlarda gruplar genellikle temiz ayrılmıştır, tüketici anakartlarında ise sık sık iç içe geçer.
IOMMU'yu Etkinleştirme ve Doğrulama#
BIOS ayarını yaptıktan sonra sıra çekirdeğe geldi. Proxmox'un önyükleme yöneticisi kuruluma göre değişir: eski BIOS kurulumlarında GRUB, ZFS üzerine kurulmuş UEFI sistemlerde systemd-boot kullanılır. Hangisinde olduğunuzu şu şekilde anlarsınız:
# systemd-boot mu GRUB mu kullanılıyor?
efibootmgr -v 2>/dev/null | head -5
ls /etc/kernel/proxmox-boot-uuid.conf 2>/dev/null && echo "systemd-boot (proxmox-boot-tool)" || echo "GRUB"
GRUB kullanıyorsanız /etc/default/grub dosyasındaki komut satırına parametreleri ekleyin:
# /etc/default/grub içinde ilgili satırı düzenleyin
# Intel işlemci için:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
# AMD işlemci için:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
# Değişikliği uygulayın
update-grub
reboot
systemd-boot kullanıyorsanız aynı parametreler /etc/kernel/cmdline dosyasına tek satır olarak yazılır ve proxmox-boot-tool refresh ile uygulanır. Buradaki iommu=pt parametresi "passthrough modu" anlamına gelir ve ana makinede kullanılan cihazlar için adres çevirisini atlayarak gereksiz performans kaybını önler.
Yeniden başlattıktan sonra IOMMU'nun gerçekten çalıştığını doğrulayın — bu adımı atlayıp devam etmek en çok zaman kaybettiren şeydir:
# Çekirdek IOMMU'yu tanıdı mı?
dmesg | grep -e DMAR -e IOMMU | head
# Beklenen satırlardan biri:
# DMAR: IOMMU enabled
# IOMMU grupları oluştu mu ve kartınız hangi grupta?
for g in /sys/kernel/iommu_groups/*/devices/*; do
echo "Grup ${g%%/devices/*}: $(lspci -nns ${g##*/})"
done | sed 's|/sys/kernel/iommu_groups/||' | sort -V | grep -i vga
Çıktıda hiçbir grup listelenmiyorsa IOMMU açılmamıştır: BIOS ayarına ve çekirdek parametresine geri dönün. Kartınız listelendiğinde grup numarasını ve PCI adresini (örneğin 01:00.0 ve ses fonksiyonu için 01:00.1) not edin — sonraki adımlarda ikisine de ihtiyacınız olacak.
Ekran Kartını Ana Makineden Ayırma#
Passthrough'un kalbi burasıdır: ana makine kartı kullanmaya devam ederse sanal makineye veremezsiniz. Amaç, kart açılışta nouveau, nvidia, amdgpu veya radeon sürücüsü yerine vfio-pci sürücüsüne bağlanmaktır. Önce hangi sürücünün kullanıldığına bakın:
# Kartın PCI kimliğini ve mevcut sürücüsünü gör
lspci -nnk | grep -A3 -i vga
# Örnek çıktı:
# 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation ... [10de:1c03]
# Kernel driver in use: nouveau
# Kernel modules: nvidiafb, nouveau
Buradaki [10de:1c03] biçimindeki değer satıcı ve cihaz kimliğidir; vfio-pci'ye bunu bağlayacağız. Kartın ses fonksiyonunun kimliğini de (lspci -nn | grep 01:00. ile) alın ve ikisini birlikte yazın:
# vfio modüllerinin açılışta yüklenmesini sağla
cat >> /etc/modules << 'EOF'
vfio
vfio_iommu_type1
vfio_pci
EOF
# Kartı kimliğine göre vfio-pci'ye bağla (kendi kimliklerinizi yazın)
echo "options vfio-pci ids=10de:1c03,10de:10f1 disable_vga=1" > /etc/modprobe.d/vfio.conf
# Ana makinenin GPU sürücülerini kara listeye al
cat > /etc/modprobe.d/blacklist-gpu.conf << 'EOF'
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
blacklist radeon
blacklist amdgpu
EOF
# initramfs'i yeniden üret ve yeniden başlat
update-initramfs -u -k all
reboot
Yeniden başlattıktan sonra tek bir doğrulama komutu her şeyi söyler:
lspci -nnk -s 01:00.0
# Kernel driver in use: vfio-pci <-- görmek istediğiniz satır budur
vfio-pci yerine hâlâ nouveau ya da amdgpu yazıyorsa, kart ana makine tarafından tutuluyor demektir; kara liste dosyasını ve update-initramfs adımını tekrar kontrol edin. Aynı modelden iki kart varsa ids= yöntemi ikisini birden yakalar; yalnızca birini vermek istiyorsanız PCI adresine göre bağlama (driverctl ya da bir udev kuralı) gerekir.
Sanal Makine Tarafındaki Yapılandırma#
Kart artık boşta; sıra onu bir KVM makinesine vermeye geldi. Burada yapılan seçimlerin çoğu geri dönüşü zahmetli olduğu için makineyi baştan doğru kurmak en iyisidir.
| Ayar | Doğru değer | Neden |
|---|---|---|
| BIOS | OVMF (UEFI) | Modern GPU'lar UEFI ile çok daha sorunsuz başlar |
| Machine | q35 | PCIe topolojisi gerektirir, i440fx yalnızca PCI sunar |
| CPU type | host | Konuk, gerçek CPU özelliklerini görür |
| Display | none (kurulum sonrası) | Sanal ekran, gerçek GPU ile çakışabilir |
| SCSI Controller | VirtIO SCSI single | Disk performansı için |
| PCI Device | All Functions + PCI-Express | Ses fonksiyonu da birlikte gitsin |
Kartı komut satırından eklemek en denetlenebilir yoldur:
# 200 numaralı makineye kartı tüm fonksiyonlarıyla ve PCIe olarak ver
qm set 200 -hostpci0 01:00,pcie=1,x-vga=1
# Makine tipini ve BIOS'u doğrula
qm config 200 | grep -E "bios|machine|cpu|hostpci"
# bios: ovmf
# cpu: host
# hostpci0: 01:00,pcie=1,x-vga=1
# machine: q35
x-vga=1 yalnızca kartı birincil ekran olarak kullanacaksanız gereklidir; hesaplama (CUDA, transcoding) amaçlı bir kart veriyorsanız bu parametreyi eklemeyin. OVMF kullanıyorsanız makineye bir EFI diski eklemeyi unutmayın, yoksa UEFI ayarları her kapanışta kaybolur. Konuk sistem açıldıktan sonra düzgün kapatma, tutarlı yedekleme ve doğru IP raporlaması için mutlaka QEMU Guest Agent kurun; passthrough'lu makinelerde konsol erişimi kısıtlı olduğu için bu ajan daha da kritiktir.
Konuk Sistemde Sürücü Kurulumu ve Doğrulama#
Makine ilk açıldığında ekran kartı konukta "bilinmeyen aygıt" olarak görünür; sürücüyü konuk işletim sisteminde kurmanız gerekir. Windows tarafında üreticinin standart sürücü paketi yeterlidir. Linux konuklarda ise ana makinede yaptığınızın tersini yaparsınız: nouveau'yu kara listeye alıp üretici sürücüsünü kurarsınız.
# Ubuntu/Debian konukta NVIDIA sürücüsü sonrası doğrulama
nvidia-smi
# Kart, sürücü sürümü ve bellek kullanımı listeleniyorsa passthrough çalışıyor demektir
# Kartın konuk çekirdeğinde nasıl göründüğünü kontrol et
lspci -nnk | grep -A3 -i vga
# Kernel driver in use: nvidia
Konuğa SSH ile bağlanabiliyor ama nvidia-smi "no devices were found" diyorsa, kart makineye ulaşmamış demektir; qm config çıktısındaki hostpci0 satırını ve ana makinede kartın hâlâ vfio-pci'ye bağlı olduğunu kontrol edin. GPU'lu makineleri hazır bir temel imajdan üretmeyi planlıyorsanız, sürücü kurulumunu bir kez yapıp makineyi şablona dönüştürmek büyük zaman kazandırır; bu akış için Proxmox'ta VM şablonu ve klonlama yazısına bakın.
Sık Yapılan Hatalar ve Çözümleri#
Bu bölümü rehberin en değerli kısmı olarak görün; aşağıdaki tablodaki belirtilerin hemen hepsiyle er ya da geç karşılaşırsınız.
| Belirti | Muhtemel sebep | Çözüm |
|---|---|---|
dmesg içinde IOMMU satırı yok | BIOS'ta VT-d/AMD-Vi kapalı ya da çekirdek parametresi uygulanmadı | BIOS ayarını açın, update-grub veya proxmox-boot-tool refresh çalıştırın |
Kartta hâlâ nouveau yazıyor | Kara liste initramfs'e yazılmadı | update-initramfs -u -k all sonrası yeniden başlatın |
| Makine açılıyor, ana makine karanlığa düşüyor | Ayrılan kart ana ekran olarak kullanılıyor | BIOS'ta birincil ekranı iGPU'ya alın |
| Windows'ta Aygıt Yöneticisi Error 43 | Konuk, sanallaştırıldığını tespit ediyor | args: -cpu host,hidden=on,kvm=off ekleyin, machine: q35 ve OVMF kullanın |
| VM açılırken "vfio: error, group is not viable" | Kart ayrı IOMMU grubunda değil | Kartı başka bir PCIe yuvasına takın ya da gruptaki tüm cihazları birlikte verin |
| İkinci açılışta kart çalışmıyor | GPU sıfırlama (reset) sorunu | Makineyi kapatıp açmak yerine ana makineyi yeniden başlatın; bazı kartlar reset desteklemez |
| Ses fonksiyonu görünmüyor | Yalnızca 01:00.0 verilmiş | 01:00 biçiminde tüm fonksiyonları verin |
Bunların içinde en çok kafa karıştıranı GPU reset sorunudur. Bazı tüketici kartları, sanal makine kapandıktan sonra kendini temiz biçimde sıfırlayamaz; ikinci açılışta kart yanıt vermez ve tek çare ana makineyi yeniden başlatmaktır. Bu, yapılandırma hatası değil donanım sınırıdır — üretim ortamı planlıyorsanız kart seçerken bunu araştırın. Bir diğeri, BAR alanı yetersizliğidir: "Above 4G Decoding" kapalıyken büyük belleğe sahip kartlar BAR 1: can't reserve hatası verir; BIOS'ta bu ayarı açmak tek başına sorunu çözer.
Son bir uyarı: passthrough yapılmış bir makine artık canlı taşınamaz. Kart fiziksel olarak o düğüme bağlıdır, dolayısıyla live migration devre dışı kalır ve --vmstate içeren anlık görüntüler alınamaz. Yedekleme planınızı buna göre kurun; makineyi kapatıp vzdump almak ya da konuk içinden dosya seviyesinde yedeklemek gerekir.
Sıkça Sorulan Sorular#
GPU passthrough için hangi ekran kartı gerekir#
Kesin bir liste yok ama pratikte iki şeye bakın: kartın ayrı bir IOMMU grubuna düşmesi ve sanal makine kapandıktan sonra kendini sıfırlayabilmesi. Profesyonel hesaplama kartları bu konuda genellikle sorunsuzdur, tüketici kartlarında ise reset sorunu sık görülür. Kart modelini satın almadan önce "reset bug" başlığıyla araştırmak, sonradan yaşayacağınız çok sayıda yeniden başlatmayı önler.
Aynı ekran kartını iki sanal makineye verebilir miyim#
Standart passthrough ile hayır; kart bir anda yalnızca tek bir makineye bağlanabilir. Kartı bölmenin yolu SR-IOV ya da üreticinin sanal GPU teknolojileridir ve bunlar genellikle kurumsal sınıf kartlarla, çoğu zaman ayrı bir lisansla gelir. Sıradan bir masaüstü kartıyla iki makineye aynı anda GPU vermek mümkün değildir; makineleri sırayla çalıştırmanız gerekir.
Error 43 hatası nasıl çözülür#
Bu hata, konuk sistemdeki sürücünün sanal bir ortamda çalıştığını tespit etmesinden kaynaklanır. Çözüm, sanallaştırma izlerini gizlemektir: makine yapılandırmasına args: -cpu host,hidden=on,kvm=off satırını ekleyin, makine tipini q35 ve BIOS'u OVMF yapın. Ayrıca kartın ses fonksiyonunu da makineye verdiğinizden emin olun; eksik fonksiyon da aynı hataya yol açabilir.
LXC konteynerine GPU verebilir miyim#
Passthrough anlamında hayır, ama LXC'de farklı bir yöntem vardır: ana makinede sürücüyü kurup cihaz dosyalarını konteynere bind-mount edersiniz. Bu yöntem transcoding gibi işler için çalışır ancak izolasyon sağlamaz — konteynerler kartı ana makineyle paylaşır ve sürücü sürümü ana makineye bağlıdır. Gerçek yalıtım ve tam sürücü kontrolü istiyorsanız KVM ile passthrough kullanmanız gerekir.
Passthrough performans kaybı yaratır mı#
Hayır, denebilecek kadar azdır. Kart doğrudan sanal makineye bağlandığı için hesaplama ve grafik performansı çıplak donanıma çok yakın çıkar; ölçülebilir kayıp genellikle yüzde birkaçtır ve çoğunlukla CPU tarafındaki kesme (interrupt) yönetiminden gelir. Asıl performans kaybı passthrough'dan değil, yanlış yapılandırılmış disk denetleyicisi ya da CPU tipinden kaynaklanır.
IOMMU grubu paylaşılıyorsa ne yapmalıyım#
En temiz çözüm kartı farklı bir PCIe yuvasına takmaktır; yuvalar farklı gruplara düşebilir. İkinci seçenek, gruptaki tüm cihazları birlikte sanal makineye vermektir — ama grupta ana makinenin ihtiyaç duyduğu bir denetleyici varsa bu mümkün olmaz. Grupları yazılımla bölen yamalar mevcuttur ancak yalıtımı zayıflattıkları için üretim ortamında önerilmez; sunucu sınıfı bir anakart bu sorunu kökten çözer.
Passthrough yapılmış makineyi başka düğüme taşıyabilir miyim#
Canlı taşıma mümkün değildir, çünkü ekran kartı fiziksel olarak tek bir düğüme bağlıdır. Makineyi kapatıp diğer düğüme taşıyabilirsiniz, ancak hedef düğümde de aynı yapılandırmanın (IOMMU açık, kart vfio-pci'ye bağlı) hazır olması ve hostpci0 satırındaki PCI adresinin oradaki adresle eşleşmesi gerekir. Adresler düğümden düğüme değişebileceği için taşımadan sonra yapılandırmayı kontrol edin.
Kapanış#
Proxmox GPU passthrough, sırası doğru izlendiğinde tekrarlanabilir bir işlemdir: BIOS'ta IOMMU'yu aç, çekirdek parametresini ekle ve dmesg ile doğrula, kartı vfio-pci'ye bağlayıp ana makine sürücülerini kara listeye al, sanal makineyi q35 + OVMF + cpu: host ile kur ve kartı tüm fonksiyonlarıyla ver. Aklınızda kalması gereken üç alışkanlık şunlar: her adımdan sonra doğrulama komutunu çalıştırın, kartı ana ekran olarak kullanmayın ve passthrough'lu makinelerin canlı taşınamayacağını yedekleme planınıza baştan yazın.
GPU gerektiren iş yüklerini kendi donanımınızda kurmak yerine hazır bir altyapıda çalıştırmak isterseniz GPU VDS paketlerimizde kart doğrudan makinenize bağlı gelir ve yukarıdaki adımların hiçbiriyle uğraşmazsınız. Kendi hipervizörünüzü kurmak istiyorsanız tam donanım kontrolü veren dedicated sunucu ya da iç içe sanallaştırmaya izin veren nested sunucu seçeneklerine bakabilir, kurulum ve bakım tarafını devretmek isterseniz sunucu yönetimi hizmetimizden yararlanabilirsiniz.