• Usar una tarjeta PCI en una máquina virtual de ProxmoxVE

    Es posible asignar a una máquina virtual una tarjeta PCI o PCIe insertada en una ranura del host Proxmox. En el mundillo se conoce como PCI passthrough. En este artículo sólo cubriré la asignación de tarjetas PCI o PCIe (PCI Express) que no sean gráficas. Si queréis pasar tarjetas gráficas tenéis información sobre como hacerlo aquí.

    Para poder pasar tarjetas PCI o PCIe a una máquina virtual en un host ProxmoxVE debes cumplir los siguientes requisitos:

    REQUISITO 1: PROCESADOR CON EXTENSIONES DE VIRTUALIZACIÓN

    Debes saber si tu procesador cuenta con las extensiones de virtualización. Para ello ejecuta:

    Lógicamente, si te sale el mensaje:

    …después de ejecutar el comando anterior, tu procesador cuenta con ellas. Si no te sale nada, olvídate de PCI Passthrough hasta comprarte un procesador decente.

    Llegado el caso, si quieres saber más acerca de cuáles tecnologías soporta tu procesador (además de las de virtualización) puedes ejecutar:

    Si tienes un procesador AMD:

    Si tienes un procesador Intel:

    De esa forma te aparecerán resaltadas en color las tecnologías de virtualización y además se mostrarán todas las otras tecnologías (flags) soportadas.

    NOTA: Algunos procesadores tienen soporte para IOMMU pero si el chipset no cuenta con el soporte, o no está activado en la BIOS, da igual que el procesador lo tenga porque el host no será capaz de usarlo.

    Si cumples el requisito 1 pasa al

    REQUISITO 2: SOPORTE PARA IOMMU

    Debes saber si tienes soporte IOMMU en el sistema. Para ello, lógicamente, tienes que activarlo en la BIOS. Allí lo puedes encontrar con el nombre de:

    • IOMMU
    • AMD-V
    • AMD-Vi
    • Intel-VTd
    • etc

    Una vez activado, y para asegurarte 100% ejecuta:

    Si tienes un procesador Intel y la salida es algo como esto:

    Es decir, si no sale nada de IOMMUv1 y de IOMMUv2, después de mostrarte la línea de Joerg Roedel te sale otra línea que pone que la funcionalidad no está disponible, no tienes soporte ni para IOMMUv1 ni para IOMMUv2. Ello teniendo en cuenta que no te hayas olvidado de activarlo en la BIOS, claro.

    Si por el contrario la salida es algo como esto:

    Es decir, que se hace referencia a DMAR, aunque haya una línea que diga que la funcionalidad de IOMMUv2 no está disponible, significa que tienes soporte, aunque no tengas IOMMUv2.

    NOTA: IOMMUv2 fue diseñado principalmente para las APUs con gráficos integrados como parte del HSA de AMD. A menos que estés tratando de pasar una tarjeta gráfica de una APU AMD (GPGPU) no necesitas IOMMUv2.

    Si tienes un procesador AMD y la salida es algo como esto:

    Es decir, si no sale nada de “Found IOMMU at …” y después de mostrarte la línea de IOMMUv2 de Joerg Roedel te sale otra línea que pone que la funcionalidad no está disponible, no tienes soporte ni para IOMMUv1 ni para IOMMUv2. Ello teniendo en cuenta que no te has olvidado de activarlo en la BIOS, claro.

    Si por el contrario la salida es algo como esto:

    Es decir, que se hace referencia a “Found IOMMU at…” y no hay una línea que diga que la funcionalidad de IOMMUv2 no está disponible, significa que tienes IOMMUv1 e IOMMUv2 soportado.

    VUELVO A PONER LA NOTA: IOMMUv2 fue diseñado principalmente para las APUs con gráficos integrados como parte del HSA de AMD. A menos que estés tratando de pasar una tarjeta gráfica de una APU AMD (GPGPU) no necesitas IOMMUv2.

    Si cumples con el requisito 2 pasa al

    REQUISITO 3: SOPORTE PARA INTERRUPT REMAPPING

    El hardware del host tiene que soportar interrupt remapping. No es posible utilizar PCI passthrough sin interrupt remapping.

    Sistemas que NO soportan interrupt remapping

    • Todos los sistemas con chipset y procesador AMD que tengan soporte para la tecnología de virtualización AMD I/O Virtualization (AMD-Vi) support. Si bien ese hardware tiene soporte para interrupt remapping, no hay software preparado para controlarla, al menos por ahora.
    • Todos los sistemas con chipset y procesador Intel que tengan soporte para la tecnología Intel Virtualization Technology for Directed I/O (VT-d) pero que no tengan soporte para interrupt remapping.

    Como saber si mi host ProxmoxVE tiene soporte para Interrupt remapping

    Normalmente, si el hardware del host (chipset y procesador) donde tienes instalado ProxmoxVE es decentemente nuevo, seguramente contará con el soporte para esa tecnología y lo pondrá de forma clara. Si aún así no estás seguro hay una forma de saberlo. Para ello crea el script ejecutando como root:

    Luego de lo anterior ya puedes correr el script ejecutando como root:

    Si el resultado es que tienes soporte para Interrupt Remaping puedes pasar al requisito 5. Si por el contrario el resultado es que no lo tienes, todavía tienes la opción de usar esa tecnología permitiendo las “interrupciones inseguras”. Para ello ejecuta como root:

    Una vez ejecutado ya puedes pasar al

    REQUISITO 5: AGRUPAMIENTO ÚNICO DE IOMMU

    Para que PCI passthrough funcione correctamente es necesario que la tarjeta PCI o PCIe a pasar a la máquina virtual esté dentro de su propio grupo IOMMU de manera que no comparta grupo con ningún otro dispositivo. Para comprobar que agrupamiento IOMMU tiene tu sistema, primero ejecuta lo siguiente como root:

    Para procesadores Intel:

    Para procesadores AMD:

    Una vez ejecutados los comandos anteriores se habrá agregado al archivo /etc/default/grub la opción para activar IOMMU y se habrá actualizado Grub con los cambios realizados. Entonces reinicia el ordenador con:

    …y una vez reiniciado ya puedes crear el script para ver el agrupamiento IOMMU ejecutando como root:

    … para luego correrlo ejecutando también como root:

    Si después de agregar iommu=on al archivo /etc/default/grub, de actualizar el grub, de reiniciar el sistema, de crear el script anterior y de ejecutarlo, el resultado de su ejecución es una salida nula, es decir, no se muestran grupos IOMMU entonces probablemente tu procesador no cuente con la característica ACS (Access Control Services). Todos los procesadores Xeon E3 y E5 tienen soporte para esa característica (excepto la familia E3-12xx). Con respecto a los Core de Intel, los que cuentan con ella, de los más usados, son:

    Sandy Bridge-E (LGA2011)
    i7-3960X (6-core, 3.3/3.9GHz)
    i7-3970X (6-core, 3.5/4GHz)
    i7-3930K (6-core, 3.2/3.8GHz)
    i7-3820 (4-core, 3.6/3.8GHz)

    Ivy Bridge-E (LGA2011)
    i7-4960X (6-core, 3.6/4GHz)
    i7-4930K (6-core, 3.4/3.6GHz)
    i7-4820K (4-core, 3.7/3.9GHz)

    Haswell-E (LGA2011-v3)
    i7-5960X (8-core, 3/3.5GHz)
    i7-5930K (6-core, 3.2/3.8GHz)
    i7-5820K (6-core, 3.3/3.6GHz)

    Broadwell-E (LGA2011-v3)
    i7-6950X (10-core, 3.0/3.5GHz)
    i7-6900K (8-core, 3.2/3.7GHz)
    i7-6850K (6-core, 3.6/3.8GHz)
    i7-6800K (6-core, 3.4/3.6GHz)

    La mayoría de los i7 más nuevos que Haswell también deberían contar también con soporte ACS.

    Si por otro lado, el resultado de la ejecución del script es algo como esto:

    … entonces tu sistema soporta el agrupamiento IOMMU. Sólo te quedaría ver si la tarjeta que quieres pasar está aislada en su propio grupo. De ser así hay 99% de probabilidades de que PCI PassThrough sea exitoso. Si la tarjeta PCI o PCIe no está aislada en su propio grupo puedes intentar mover la tarjeta PCI a otro slot o agregar:

    … a las opciones de grub, para luego actualizarlo con:

    … y así, después de reiniciar el sistema con:

    … volver a ejecutar el script MostrarGruposIOMMU y ver si ese cambio dio resultado y la tarjeta quedó aislada o no. Habitualmente, agregar esa última opción al grub ayuda a mejorar la mala implementación de ACS y a conseguir un mejor agrupamiento. Seguramente, si tienes un Xeon E5, no te hará falta agregar esa opción al grub porque los Xeon E5 consiguen un mejor agrupamiento que los E3.

    Una vez logrado que la tarjeta a pasar esté dentro de su propio grupo, puedes proceder con la

    ACTIVACIÓN DE PCI PASSTHROUGH EN LA MV

    En hosts con procesadores Intel, y contando con que ya agregaste IOMMU al grub, ejecuta como root:

    … y reinicia el sistema.

    En hosts con procesadores AMD, y contando con que ya agregaste IOMMU al grub, ejecuta como root:

    … y reinicia el sistema.

    Una vez reiniciado el sistema puedes asignarle la tarjeta PCI a la máquina virtual localizándola primero con:

    Ejecutado lo anterior te saldrá una lista como esta:

    En mi caso la tarjeta a pasar es:

    Por lo que debería tomar nota de los números que aparecen al principio de la línea. En este caso son:

    PASAR LA TARJETA SI ES PCI

    Habiendo tomado nota del número anterior, para pasar la tarjeta a la vm debería editar manualmente su archivo de configuración, según sea su ID con, por ejemplo:

    y asignarle la tarjeta agregando a ese archivo la línea:

    …para luego guardarlo e iniciar la máquina virtual.

    Si la tarjeta a asignar tiene más de un dispositivo dentro, por ejemplo

    01:00.0 y 01:00.1, puedes asignarlos manualmente a todos agregando la línea:

    O sino puedes asignar de forma automática todos los dispositivos de dentro de una tarjeta agregando la línea:

    PASAR LA TARJETA SI ES PCI EXPRESS

    Si la tarjeta es PCIe y no PCI, para pasarla tienes que agregar al archivo de configuración algunos datos extra. Por ejemplo, para pasar una tarjeta 01:00.0 tendrías que agregar al archivo de configuración las líneas:

    Saca tus conclusiones que para eso eres un geek.


    Deja un comentario