-
Hacer pci-passthrough sin blacklistear módulos del kernel
Es posible que en algún momento quieras pasar una tarjeta PCI o PCIe a una máquina virtual de Proxmox pero no puedas agregar su correspondiente módulo del kernel a una lista de blacklist dado que, por ejemplo, este también requiera ser cargado por otro adaptador que el propio host de PVE necesite usar. En ese caso, sigue este hack:
Asegúrate primero de tener instalado el paquete driverctl. Luego determina el identificador del sistema y del subsistema ejecutando:
driverctl -v list-devices
La salida será algo como esto:
0000:00:00.0 (none) (Family 15h (Models 60h-6fh) Processor Root Complex) 0000:00:00.2 (none) (Family 15h (Models 60h-6fh) I/O Memory Management Unit) 0000:00:01.0 amdgpu (Wani [Radeon R5/R6/R7 Graphics]) 0000:00:01.1 snd_hda_intel (Kabini HDMI/DP Audio) 0000:00:02.0 (none) (Family 15h (Models 60h-6fh) Host Bridge) 0000:00:02.2 pcieport (Family 15h (Models 60h-6fh) Processor Root Port) 0000:00:02.4 pcieport (Family 15h (Models 60h-6fh) Processor Root Port) 0000:00:02.5 pcieport (Family 15h (Models 60h-6fh) Processor Root Port) 0000:00:03.0 (none) (Family 15h (Models 60h-6fh) Host Bridge) 0000:00:03.1 pcieport (Family 15h (Models 60h-6fh) Processor Root Port) 0000:00:08.0 (none) (Carrizo Platform Security Processor) 0000:00:09.0 (none) (Carrizo Audio Dummy Host Bridge) 0000:00:10.0 xhci_hcd (FCH USB XHCI Controller) 0000:00:11.0 ahci (FCH SATA Controller [AHCI mode]) 0000:00:12.0 ehci-pci (FCH USB EHCI Controller) 0000:00:14.0 piix4_smbus (FCH SMBus Controller) 0000:00:14.3 (none) (FCH LPC Bridge) 0000:00:18.0 (none) (Family 15h (Models 60h-6fh) Processor Function 0) 0000:00:18.1 (none) (Family 15h (Models 60h-6fh) Processor Function 1) 0000:00:18.2 (none) (Family 15h (Models 60h-6fh) Processor Function 2) 0000:00:18.3 k10temp (Family 15h (Models 60h-6fh) Processor Function 3) 0000:00:18.4 fam15h_power (Family 15h (Models 60h-6fh) Processor Function 4) 0000:00:18.5 (none) (Family 15h (Models 60h-6fh) Processor Function 5) 0000:01:00.0 ahci (88SE9230 PCIe SATA 6Gb/s Controller) 0000:02:00.0 pcieport (PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch) 0000:03:01.0 pcieport (PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch) 0000:03:04.0 pcieport (PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch) 0000:03:05.0 pcieport (PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch) 0000:03:07.0 pcieport (PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch) 0000:03:09.0 pcieport (PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch) 0000:06:00.0 vfio-pci (QCA9984 802.11ac Wave 2 Wireless Network Adapter) 0000:07:00.0 vfio-pci (QCA9984 802.11ac Wave 2 Wireless Network Adapter) 0000:09:00.0 tg3 (NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)) 0000:09:00.1 tg3 (NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)) 0000:0a:00.0 (none) (PES12N3A 12-lane 3-Port PCI Express Switch) 0000:0b:02.0 pcieport (PES12N3A 12-lane 3-Port PCI Express Switch) 0000:0b:04.0 pcieport (PES12N3A 12-lane 3-Port PCI Express Switch) 0000:0c:00.0 igb (82575GB Gigabit Network Connection (Gigabit VT Quad Port Server Adapter)) 0000:0c:00.1 igb (82575GB Gigabit Network Connection (Gigabit VT Quad Port Server Adapter)) 0000:0d:00.0 igb (82575GB Gigabit Network Connection (Gigabit VT Quad Port Server Adapter)) 0000:0d:00.1 igb (82575GB Gigabit Network Connection (Gigabit VT Quad Port Server Adapter))
Verás que el dispositivo (y subdispositivo, dado el caso) que quieres pasar, y que no has blacklisteado, no estará usando el módulo vfio-pci. Para hacer que lo use, primero asegúrate que el dispositivo no está siendo activamente ejecutado y luego bindéalo al módulo vfio-pci, junto con su subdispositivo (si es el caso), ejecutando:
driverctl set-override 0000:0c:00.0 vfio-pci driverctl set-override 0000:0c:00.1 vfio-pci
Este podría ser el caso de una tarjeta gráfica y su chip de audio correspondiente (o un adaptador ethernet de 2 puertos cuyo segundo puerto no tenga un id aparte.)
Para desbindear, ejecuta:
driverctl unset-override 0000:0c:00.0 driverctl unset-override 0000:0c:00.1
En estos casos, en vez de indicar que la máquina virtual se autoarranque con Proxmox, podrías hacer un script de arranque y apagado de la máquina virtual, de forma que antes de iniciarse bindee vfio-pci al pciid y luego de apagarse, lo desbindee.
Los hacks de hacks4geeks son minitutoriales rápidos pensados para geeks con conocimiento informático avanzado. Si no entiendes o no consigues ejecutar un hack de esta web considera suscribirte a Premium para solicitar asistencia sobre el mismo.