• 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.

     


    Deja una respuesta