PCI Passthrough – bezpośredni dostęp VM do fizycznego urządzenia
PCI Passthrough to technika wirtualizacji, która pozwala przypisać fizyczne urządzenie PCIe — np. kartę graficzną, kartę sieciową, kontroler HBA czy NVMe — bezpośrednio do maszyny wirtualnej.
Zamiast:
VM
|
v
Virtual Device
|
v
Hypervisor
|
v
Physical Device
otrzymujemy:
VM
|
v
Virtual PCI Device
|
v
Physical PCIe Device
To daje VM znacznie bardziej bezpośredni dostęp do sprzętu.
PCI Passthrough a emulacja
Klasyczna VM może korzystać z emulowanego urządzenia:
Physical NIC
|
v
Hypervisor
|
Virtual NIC
|
v
VM
W przypadku passthrough:
Physical NIC
|
|
v
VM
Hypervisor nadal kontroluje izolację, ale dane mogą omijać dużą część klasycznej warstwy emulacji.
VFIO – kluczowa technologia w Linuxie
W środowisku KVM najważniejszym elementem PCI Passthrough jest VFIO (Virtual Function I/O).
Schemat:
Physical PCIe Device
|
v
VFIO
|
v
QEMU
|
v
KVM Virtual Machine
VFIO pozwala bezpiecznie udostępnić urządzenie przestrzeni użytkownika, w szczególności procesowi QEMU obsługującemu VM.
IOMMU
Drugim kluczowym elementem jest IOMMU.
Na platformach Intel spotkasz:
Intel VT-d
a na AMD:
AMD IOMMU
IOMMU kontroluje mapowanie dostępu urządzenia do pamięci.
Schemat:
PCIe Device
|
v
IOMMU
|
v
VFIO
|
v
VM
To bardzo ważne z punktu widzenia bezpieczeństwa.
Dlaczego IOMMU jest potrzebne?
Załóżmy, że urządzenie PCIe wykonuje DMA — Direct Memory Access.
Bez odpowiedniej izolacji urządzenie mogłoby mieć dostęp do niepożądanych obszarów pamięci.
IOMMU pozwala ograniczyć:
PCI Device
|
X ---> Host Memory
i zezwolić tylko na:
PCI Device
|
v
Allowed Memory Region
|
v
VM
Najpopularniejsze zastosowanie – GPU Passthrough
Jednym z najbardziej znanych zastosowań PCI Passthrough jest przekazanie GPU do VM.
Physical GPU
|
v
IOMMU
|
v
VFIO
|
v
QEMU
|
v
Windows VM
VM może wtedy korzystać z fizycznej karty graficznej.
Przykładowo:
Linux Host
|
+---- VM 1
| |
| GPU
|
+---- inne VM
GPU jest przypisane do jednej konkretnej VM.
GPU Passthrough – po co?
Może być przydatne do:
- wymagających aplikacji graficznych,
- workstation VM,
- renderingu,
- AI/ML,
- CUDA,
- obliczeń GPU,
- testowania sterowników.
Przykład:
Linux Host
|
+-- KVM
|
Windows VM
|
NVIDIA GPU
PCI Passthrough karty sieciowej
Można również przekazać fizyczną kartę sieciową.
Physical NIC
|
v
VFIO
|
v
VM
VM otrzymuje praktycznie bezpośredni dostęp do urządzenia.
To może być interesujące dla:
- firewalli,
- routerów,
- IDS/IPS,
- NFV,
- aplikacji wymagających bardzo niskich opóźnień.
PCI Passthrough vs SR-IOV
Te technologie są podobne, ale nie są tym samym.
PCI Passthrough
Przekazujesz fizyczną funkcję urządzenia:
NIC
|
v
VM
SR-IOV
Jedno urządzenie tworzy wiele funkcji:
NIC
|
+-- VF1 → VM1
|
+-- VF2 → VM2
|
+-- VF3 → VM3
Czyli:
PCI Passthrough
→ całe urządzenie/funkcja dla jednej VM
SR-IOV
→ wiele Virtual Functions dla wielu VM
PCI Passthrough vs VirtIO
To również bardzo ważne porównanie.
VirtIO
VM
|
v
virtio-net
|
v
QEMU / Host
|
v
NIC
PCI Passthrough
VM
|
v
Physical NIC
| Cecha | VirtIO | PCI Passthrough |
|---|---|---|
| Wydajność | wysoka | bardzo wysoka |
| Elastyczność | bardzo wysoka | niższa |
| Migracja VM | łatwiejsza | trudniejsza |
| Wymaga konkretnego sprzętu | ❌ | ✅ |
| Virtual switch | ✅ | zasadniczo omijany dla tego urządzenia |
| Dostęp do urządzenia | pośredni | bezpośredni |
PCI Passthrough w KVM/QEMU
Typowa architektura wygląda tak:
Linux Host
|
+------+------+
| |
KVM VFIO
| |
| PCIe Device
| |
+------+------+
|
QEMU
|
v
VM
KVM zajmuje się wirtualizacją CPU, QEMU obsługą VM i urządzeń, a VFIO przekazuje fizyczne urządzenie.
IOMMU Groups
W Linuxie bardzo ważnym pojęciem są IOMMU groups.
Urządzenia PCIe są grupowane według możliwości ich izolacji przez IOMMU.
Można sprawdzić grupy:
for g in /sys/kernel/iommu_groups/*; do
echo "IOMMU Group ${g##*/}"
for d in "$g"/devices/*; do
echo -e "\t$(lspci -nns "${d##*/}")"
done
done
Przykładowo:
IOMMU Group 10
01:00.0 VGA compatible controller
IOMMU Group 11
02:00.0 Ethernet controller
Jeżeli GPU i inne urządzenia znajdują się w tej samej grupie, może to skomplikować bezpieczny passthrough.
lspci
Pierwszym krokiem jest znalezienie urządzenia:
lspci
Przykład:
01:00.0 VGA compatible controller
02:00.0 Ethernet controller
Szczegóły:
lspci -nnk
Możemy zobaczyć m.in.:
Kernel driver in use:
Kernel modules:
VFIO i sterownik urządzenia
Normalnie urządzenie może być obsługiwane przez sterownik hosta:
GPU
|
v
nvidia / amdgpu
lub:
NIC
|
v
ixgbe / i40e / mlx5
Przy passthrough chcemy, żeby urządzenie było obsługiwane przez:
vfio-pci
Schemat:
PCI Device
|
v
vfio-pci
|
v
QEMU
|
v
VM
Przykład konfiguracji VFIO
Po znalezieniu identyfikatora:
lspci -nn
możemy zobaczyć np.:
01:00.0 VGA compatible controller [0300]: ...
[10de:xxxx]
Identyfikator PCI:
10de:xxxx
może zostać wykorzystany do przypisania urządzenia do vfio-pci.
Dokładna konfiguracja zależy od dystrybucji, kernela, sprzętu i urządzenia.
GPU i urządzenie audio
W przypadku GPU często trzeba pamiętać, że karta może mieć więcej niż jedną funkcję PCIe.
Przykładowo:
01:00.0 VGA controller
01:00.1 Audio controller
Jeżeli przekazujesz GPU do VM, często przekazuje się obie funkcje:
GPU
|
+-- 01:00.0 → GPU
|
+-- 01:00.1 → HDMI/DP Audio
Dzięki temu system gościa widzi pełniejszy model urządzenia.
Reset urządzenia
Jednym z problemów PCI Passthrough może być reset urządzenia.
Przykładowy scenariusz:
VM starts
|
v
GPU assigned
|
v
VM stops
|
v
GPU reset?
Niektóre urządzenia prawidłowo obsługują reset, a inne mogą wymagać dodatkowych mechanizmów lub mieć ograniczenia firmware/sterownika.
Dlatego kompatybilność konkretnego urządzenia ma ogromne znaczenie.
Live Migration
To jedna z największych wad passthrough.
Standardowa VM:
Host A
|
VM
|
| Live Migration
v
Host B
jest stosunkowo łatwa do przeniesienia.
VM z fizycznym GPU:
Host A
|
GPU
|
VM
|
| Migration ?
v
Host B
|
GPU ?
Drugi host musi posiadać odpowiedni sprzęt i zgodną konfigurację.
Dlatego klasyczny PCI Passthrough często ogranicza możliwości live migration.
High Availability
Podobny problem pojawia się z HA.
Jeżeli VM wymaga konkretnego urządzenia:
VM
|
GPU
|
Host A
to automatyczne przeniesienie VM na:
Host B
ma sens tylko wtedy, gdy Host B również posiada kompatybilne urządzenie.

Bezpieczeństwo
PCI Passthrough zapewnia silną separację, ale jednocześnie przekazujesz VM dostęp do prawdziwego urządzenia.
Dlatego trzeba brać pod uwagę:
VM
|
v
VFIO
|
v
Physical Device
|
v
IOMMU
|
v
Host
Potencjalne problemy mogą wynikać z:
- błędów firmware,
- sterowników,
- urządzeń PCIe,
- IOMMU,
- hypervisora,
- błędów w obsłudze DMA.
PCI Passthrough w Proxmox
W Proxmox VE PCI Passthrough jest często wykorzystywany do przekazywania:
GPU
NIC
HBA
USB controller
NVMe
Schemat:
Proxmox VE
|
KVM
|
QEMU
|
VFIO
|
PCIe Device
|
v
VM
Można to konfigurować przez GUI lub CLI.
PCI Passthrough w Hyper-V
Hyper-V ma własną implementację przekazywania urządzeń PCIe, określaną jako Discrete Device Assignment (DDA).
Schemat:
Hyper-V
|
v
DDA
|
v
Physical PCIe Device
|
v
VM
Koncepcja jest podobna do PCI Passthrough w KVM, ale mechanizmy Microsoftu są inne.
DDA vs SR-IOV
W ekosystemie Hyper-V warto rozróżnić:
DDA
→ przekazanie fizycznego urządzenia do VM
oraz:
SR-IOV
→ podział urządzenia na Virtual Functions
Czyli:
DDA:
NIC/GPU
|
v
VM
SR-IOV:
NIC
|
+-- VF1 → VM1
+-- VF2 → VM2
+-- VF3 → VM3
PCI Passthrough i storage
Można również przekazać kontroler storage.
Przykład:
Physical HBA
|
v
VFIO
|
v
Storage VM
Jest to interesujące np. przy systemach storage, które chcą bezpośrednio zarządzać urządzeniami dyskowymi.
PCI Passthrough a NVMe
Możliwe jest również przekazanie kontrolera NVMe:
NVMe Controller
|
v
VFIO
|
v
VM
VM może wtedy korzystać z urządzenia bardzo bezpośrednio.
Trzeba jednak dokładnie przemyśleć:
- backup,
- migrację,
- awarie,
- dostępność urządzenia,
- IOMMU isolation.
Kiedy warto używać PCI Passthrough?
Najbardziej sensowne przypadki to:
✔ GPU workloads
✔ AI / ML
✔ bardzo szybkie NIC
✔ specjalistyczne urządzenia PCIe
✔ storage appliances
✔ NFV
✔ wymagające aplikacje
Kiedy lepiej go nie używać?
Jeżeli najważniejsze są:
✔ live migration
✔ HA
✔ elastyczne przenoszenie VM
✔ łatwy backup
✔ niezależność od konkretnego sprzętu
często lepszym wyborem będzie:
VirtIO
lub:
SR-IOV
w zależności od zastosowania.
PCI Passthrough – pełna architektura
PHYSICAL SERVER
|
PCIe Device
|
v
IOMMU
|
v
VFIO
|
v
QEMU
|
v
KVM Virtual Machine
|
+-----------+-----------+
| |
Guest OS Driver
| |
+-----------+-----------+
|
Physical Device
PCI Passthrough vs SR-IOV vs VirtIO
| Technologia | Model | Wydajność | Elastyczność | Live Migration |
|---|---|---|---|---|
| VirtIO | urządzenie parawirtualne | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| SR-IOV | Virtual Function | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| PCI Passthrough | fizyczne urządzenie | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐ |
To oczywiście uproszczenie — rzeczywiste możliwości zależą od hypervisora, sprzętu i konkretnej konfiguracji.
Najważniejsze do zapamiętania
PCI Passthrough
|
v
fizyczne urządzenie PCIe
|
v
VFIO
|
v
IOMMU
|
v
VM
PCI Passthrough daje VM bardzo bezpośredni dostęp do fizycznego urządzenia i dlatego świetnie nadaje się do GPU, szybkich kart sieciowych, kontrolerów storage czy specjalistycznego sprzętu. Ceną za wysoką wydajność jest jednak mniejsza elastyczność — szczególnie w zakresie live migration, HA i niezależności VM od konkretnego hosta.






