]> git.proxmox.com Git - pve-docs.git/blame_incremental - qm-pci-passthrough.adoc
bump version to 5.3-1
[pve-docs.git] / qm-pci-passthrough.adoc
... / ...
CommitLineData
1[[qm_pci_passthrough]]
2PCI(e) Passthrough
3------------------
4
5PCI(e) passthrough is a mechanism to give a virtual machine control over
6a PCI device from the host. This can have some advantages over using
7virtualized hardware, for example lower latency, higher performance, or more
8features (e.g., offloading).
9
10But, if you pass through a device to a virtual machine, you cannot use that
11device anymore on the host or in any other VM.
12
13General Requirements
14~~~~~~~~~~~~~~~~~~~~
15
16Since passthrough is a feature which also needs hardware support, there are
17some requirements to check and preparations to be done to make it work.
18
19
20Hardware
21^^^^^^^^
22Your hardware needs to support `IOMMU` (*I*/*O* **M**emory **M**anagement
23**U**nit) interrupt remapping, this includes the CPU and the mainboard.
24
25Generally, Intel systems with VT-d, and AMD systems with AMD-Vi support this.
26But it is not guaranteed that everything will work out of the box, due
27to bad hardware implementation and missing or low quality drivers.
28
29Further, server grade hardware has often better support than consumer grade
30hardware, but even then, many modern system can support this.
31
32Please refer to your hardware vendor to check if they support this feature
33under Linux for your specific setup
34
35
36Configuration
37^^^^^^^^^^^^^
38
39Once you ensured that your hardware supports passthrough, you will need to do
40some configuration to enable PCI(e) passthrough.
41
42
43.IOMMU
44
45The IOMMU has to be activated on the kernel commandline. The easiest way is to
46enable trough grub. Edit `'/etc/default/grub'' and add the following to the
47'GRUB_CMDLINE_LINUX_DEFAULT' variable:
48
49* for Intel CPUs:
50+
51----
52 intel_iommu=on
53----
54* for AMD CPUs:
55+
56----
57 amd_iommu=on
58----
59
60[[qm_pci_passthrough_update_grub]]
61To bring this change in effect, make sure you run:
62
63----
64# update-grub
65----
66
67.Kernel Modules
68
69You have to make sure the following modules are loaded. This can be achieved by
70adding them to `'/etc/modules''
71
72----
73 vfio
74 vfio_iommu_type1
75 vfio_pci
76 vfio_virqfd
77----
78
79[[qm_pci_passthrough_update_initramfs]]
80After changing anything modules related, you need to refresh your
81`initramfs`. On {pve} this can be done by executing:
82
83----
84# update-initramfs -u -k all
85----
86
87.Finish Configuration
88
89Finally reboot to bring the changes into effect and check that it is indeed
90enabled.
91
92----
93# dmesg -e DMAR -e IOMMU -e AMD-Vi
94----
95
96should display that `IOMMU`, `Directed I/O` or `Interrupt Remapping` is
97enabled, depending on hardware and kernel the exact message can vary.
98
99It is also important that the device(s) you want to pass through
100are in a *separate* `IOMMU` group. This can be checked with:
101
102----
103# find /sys/kernel/iommu_groups/ -type l
104----
105
106It is okay if the device is in an `IOMMU` group together with its functions
107(e.g. a GPU with the HDMI Audio device) or with its root port or PCI(e) bridge.
108
109.PCI(e) slots
110[NOTE]
111====
112Some platforms handle their physical PCI(e) slots differently. So, sometimes
113it can help to put the card in a another PCI(e) slot, if you do not get the
114desired `IOMMU` group separation.
115====
116
117.Unsafe interrupts
118[NOTE]
119====
120For some platforms, it may be necessary to allow unsafe interrupts.
121For this add the following line in a file ending with `.conf' file in
122*/etc/modprobe.d/*:
123
124----
125 options vfio_iommu_type1 allow_unsafe_interrupts=1
126----
127
128Please be aware that this option can make your system unstable.
129====
130
131GPU Passthrough Notes
132^^^^^^^^^^^^^^^^^^^^^
133
134It is not possible to display the frame buffer of the GPU via NoVNC or SPICE on
135the {pve} web interface.
136
137When passing through a whole GPU or a vGPU and graphic output is wanted, one
138has to either physically connect a monitor to the card, or configure a remote
139desktop software (for example, VNC or RDP) inside the guest.
140
141If you want to use the GPU as a hardware accelerator, for example, for
142programs using OpenCL or CUDA, this is not required.
143
144Host Device Passthrough
145~~~~~~~~~~~~~~~~~~~~~~~
146
147The most used variant of PCI(e) passthrough is to pass through a whole
148PCI(e) card, for example a GPU or a network card.
149
150
151Host Configuration
152^^^^^^^^^^^^^^^^^^
153
154In this case, the host cannot use the card. There are two methods to achieve
155this:
156
157* pass the device IDs to the options of the 'vfio-pci' modules by adding
158+
159----
160 options vfio-pci ids=1234:5678,4321:8765
161----
162+
163to a .conf file in */etc/modprobe.d/* where `1234:5678` and `4321:8765` are
164the vendor and device IDs obtained by:
165+
166----
167# lcpci -nn
168----
169
170* blacklist the driver completely on the host, ensuring that it is free to bind
171for passthrough, with
172+
173----
174 blacklist DRIVERNAME
175----
176+
177in a .conf file in */etc/modprobe.d/*.
178
179For both methods you need to
180xref:qm_pci_passthrough_update_initramfs[update the `initramfs`] again and
181reboot after that.
182
183[[qm_pci_passthrough_vm_config]]
184VM Configuration
185^^^^^^^^^^^^^^^^
186To pass through the device you need to set the *hostpciX* option in the VM
187configuration, for example by executing:
188
189----
190# qm set VMID -hostpci0 00:02.0
191----
192
193If your device has multiple functions (e.g., ``00:02.0`' and ``00:02.1`'),
194you can pass them through all together with the shortened syntax ``00:02`'
195
196There are some options to which may be necessary, depending on the device
197and guest OS:
198
199* *x-vga=on|off* marks the PCI(e) device as the primary GPU of the VM.
200With this enabled the *vga* configuration option will be ignored.
201
202* *pcie=on|off* tells {pve} to use a PCIe or PCI port. Some guests/device
203combination require PCIe rather than PCI. PCIe is only available for 'q35'
204machine types.
205
206* *rombar=on|off* makes the firmware ROM visible for the guest. Default is on.
207Some PCI(e) devices need this disabled.
208
209* *romfile=<path>*, is an optional path to a ROM file for the device to use.
210This is a relative path under */usr/share/kvm/*.
211
212.Example
213
214An example of PCIe passthrough with a GPU set to primary:
215
216----
217# qm set VMID -hostpci0 02:00,pcie=on,x-vga=on
218----
219
220
221Other considerations
222^^^^^^^^^^^^^^^^^^^^
223
224When passing through a GPU, the best compatibility is reached when using
225'q35' as machine type, 'OVMF' ('EFI' for VMs) instead of SeaBIOS and PCIe
226instead of PCI. Note that if you want to use 'OVMF' for GPU passthrough, the
227GPU needs to have an EFI capable ROM, otherwise use SeaBIOS instead.
228
229SR-IOV
230~~~~~~
231
232Another variant for passing through PCI(e) devices, is to use the hardware
233virtualization features of your devices, if available.
234
235'SR-IOV' (**S**ingle-**R**oot **I**nput/**O**utput **V**irtualization) enables
236a single device to provide multiple 'VF' (**V**irtual **F**unctions) to the
237system. Each of those 'VF' can be used in a different VM, with full hardware
238features and also better performance and lower latency than software
239virtualized devices.
240
241Currently, the most common use case for this are NICs (**N**etwork
242**I**nterface **C**ard) with SR-IOV support, which can provide multiple VFs per
243physical port. This allows using features such as checksum offloading, etc. to
244be used inside a VM, reducing the (host) CPU overhead.
245
246
247Host Configuration
248^^^^^^^^^^^^^^^^^^
249
250Generally, there are two methods for enabling virtual functions on a device.
251
252* sometimes there is an option for the driver module e.g. for some
253Intel drivers
254+
255----
256 max_vfs=4
257----
258+
259which could be put file with '.conf' ending under */etc/modprobe.d/*.
260(Do not forget to update your initramfs after that)
261+
262Please refer to your driver module documentation for the exact
263parameters and options.
264
265* The second, more generic, approach is using the `sysfs`.
266If a device and driver supports this you can change the number of VFs on
267the fly. For example, to setup 4 VFs on device 0000:01:00.0 execute:
268+
269----
270# echo 4 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
271----
272+
273To make this change persistent you can use the `sysfsutils` Debian package.
274After installation configure it via */etc/sysfs.conf* or a `FILE.conf' in
275*/etc/sysfs.d/*.
276
277VM Configuration
278^^^^^^^^^^^^^^^^
279
280After creating VFs, you should see them as separate PCI(e) devices when
281outputting them with `lspci`. Get their ID and pass them through like a
282xref:qm_pci_passthrough_vm_config[normal PCI(e) device].
283
284Other considerations
285^^^^^^^^^^^^^^^^^^^^
286
287For this feature, platform support is especially important. It may be necessary
288to enable this feature in the BIOS/EFI first, or to use a specific PCI(e) port
289for it to work. In doubt, consult the manual of the platform or contact its
290vendor.
291
292Mediated Devices (vGPU, GVT-g)
293~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
294
295Mediated devices are another method to use reuse features and performance from
296physical hardware for virtualized hardware. These are found most common in
297virtualized GPU setups such as Intels GVT-g and Nvidias vGPUs used in their
298GRID technology.
299
300With this, a physical Card is able to create virtual cards, similar to SR-IOV.
301The difference is that mediated devices do not appear as PCI(e) devices in the
302host, and are such only suited for using in virtual machines.
303
304
305Host Configuration
306^^^^^^^^^^^^^^^^^^
307
308In general your card's driver must support that feature, otherwise it will
309not work. So please refer to your vendor for compatbile drivers and how to
310configure them.
311
312Intels drivers for GVT-g are integraded in the Kernel and should work
313with the 5th, 6th and 7th generation Intel Core Processors, further E3 v4, E3
314v5 and E3 v6 Xeon Processors are supported.
315
316To enable it for Intel Graphcs, you have to make sure to load the module
317'kvmgt' (for example via `/etc/modules`) and to enable it on the Kernel
318commandline. For this you can edit `'/etc/default/grub'' and add the following
319to the 'GRUB_CMDLINE_LINUX_DEFAULT' variable:
320
321----
322 i915.enable_gvt=1
323----
324
325After that remember to
326xref:qm_pci_passthrough_update_initramfs[update the `initramfs`],
327xref:qm_pci_passthrough_update_grub[update grub] and
328reboot your host.
329
330VM Configuration
331^^^^^^^^^^^^^^^^
332
333To use a mediated device, simply specify the `mdev` property on a `hostpciX`
334VM configuration option.
335
336You can get the supported devices via the 'sysfs'. For example, to list the
337supported types for the device '0000:00:02.0' you would simply execute:
338
339----
340# ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types
341----
342
343Each entry is a directory which contains the following important files:
344
345* 'available_instances' contains the amount of still available instances of
346this type, each 'mdev' use in a VM reduces this.
347* 'description' contains a short description about the capabilities of the type
348* 'create' is the endpoint to create such a device, {pve} does this
349automatically for you, if a 'hostpciX' option with `mdev` is configured.
350
351Example configuration with an `Intel GVT-g vGPU` (`Intel Skylake 6700k`):
352
353----
354# qm set VMID -hostpci0 00:02.0,mdev=i915-GVTg_V5_4
355----
356
357With this set, {pve} automatically creates such a device on VM start, and
358cleans it up again when the VM stops.