Red Hat Training

A Red Hat training course is available for RHEL 8

10.8.2. Adjuntar dispositivos de red SR-IOV a máquinas virtuales

Para adjuntar un dispositivo de red SR-IOV a una máquina virtual (VM) en un host Intel o AMD, debe crear una función virtual (VF) desde una interfaz de red con capacidad SR-IOV en el host y asignar la VF como dispositivo a una VM específica. Para más detalles, consulte las siguientes instrucciones.

Requisitos previos

  • La CPU y el firmware de su host soportan la Unidad de Gestión de Memoria de E/S (IOMMU).

    • Si se utiliza una CPU Intel, ésta debe ser compatible con la tecnología de virtualización Intel para E/S dirigida (VT-d).
    • Si se utiliza una CPU de AMD, debe ser compatible con la función AMD-Vi.
  • El sistema anfitrión utiliza el Servicio de Control de Acceso (ACS) para proporcionar aislamiento de acceso directo a la memoria (DMA) para la topología PCIe. Verifique esto con el proveedor del sistema.

    Para obtener información adicional, consulte Consideraciones sobre el hardware para implementar SR-IOV.

  • El dispositivo de red físico soporta SR-IOV. Para verificar si algún dispositivo de red de su sistema admite SR-IOV, utilice el comando lspci -v y busque Single Root I/O Virtualization (SR-IOV) en la salida.

    # lspci -v
    [...]
    02:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    	Subsystem: Intel Corporation Gigabit ET Dual Port Server Adapter
    	Flags: bus master, fast devsel, latency 0, IRQ 16, NUMA node 0
    	Memory at fcba0000 (32-bit, non-prefetchable) [size=128K]
    [...]
    	Capabilities: [150] Alternative Routing-ID Interpretation (ARI)
    	Capabilities: [160] Single Root I/O Virtualization (SR-IOV)
    	Kernel driver in use: igb
    	Kernel modules: igb
    [...]
  • La interfaz de red del host que desea utilizar para crear VFs está en funcionamiento. Por ejemplo, para activar la interfaz eth1 y verificar que se está ejecutando:

    # ip link set eth1 up
    # ip link show eth1
    8: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
       link/ether a0:36:9f:8f:3f:b8 brd ff:ff:ff:ff:ff:ff
       vf 0 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 1 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 2 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
       vf 3 MAC 00:00:00:00:00:00, spoof checking on, link-state auto
  • Para que la asignación de dispositivos SR-IOV funcione, la función IOMMU debe estar habilitada en la BIOS y el kernel del host. Para ello:

    • En un host Intel, active VT-d:

      • Si su host Intel utiliza múltiples entradas de arranque:

        1. Edite el archivo /etc/default/grub y añada los parámetros intel_iommu=on y iommu=pt al final de la línea GRUB_CMDLINE_LINUX:

          GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel_dell-per730-27-swap rd.lvm.lv=rhel_dell-per730-27/root rd.lvm.lv=rhel_dell-per730-27/swap console=ttyS0,115200n81 intel_iommu=on iommu=pt"
        2. Regenerar la configuración de GRUB:

          # grub2-mkconfig -o /boot/grub2/grub.cfg
        3. Reinicia el host.
      • Si su host Intel utiliza una única entrada de arranque:

        1. Regenerar la configuración de GRUB con el parámetro intel_iommu=on:

          # grubby --args="intel_iommu=on" --update-kernel DEFAULT
        2. Reinicia el host.
    • En un host AMD, active AMD-Vi:

      • Si su host AMD utiliza múltiples entradas de arranque:

        1. Edite el archivo /etc/default/grub y añada los parámetros iommu=pt y amd_iommu=on al final de la línea GRUB_CMDLINE_LINUX:

          GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel_dell-per730-27-swap rd.lvm.lv=rhel_dell-per730-27/root rd.lvm.lv=rhel_dell-per730-27/swap console=ttyS0,115200n81 iommu=pt amd_iommu=on"
        2. Regenerar la configuración de GRUB:

          # grub2-mkconfig -o /boot/grub2/grub.cfg
        3. Reinicia el host.
      • Si su host AMD utiliza una única entrada de arranque:

        1. Regenerar la configuración de GRUB con el parámetro iommu=pt:

          # grubby --args="iommu=pt" --update-kernel DEFAULT
        2. Reinicia el host.

Procedimiento

  1. Optional: Confirme el número máximo de VFs que su dispositivo de red puede utilizar. Para ello, utilice el siguiente comando y sustituya eth1 por su dispositivo de red compatible con SR-IOV.

    # cat /sys/class/net/eth1/device/sriov_totalvfs
    7
  2. Utilice el siguiente comando para crear una función virtual (VF):

    # echo VF-number > /sys/class/net/network-interface/device/sriov_numvfs

    En el comando, reemplaza:

    • VF-number con el número de VFs que desea crear en el FP.
    • network-interface con el nombre de la interfaz de red para la que se crearán los VF.

    El siguiente ejemplo crea 2 VFs desde la interfaz de red eth1:

    # echo 2 > /sys/class/net/eth1/device/sriov_numvfs
  3. Compruebe que se han añadido los VF:

    # lspci | grep Ethernet
    01:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
    01:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
    07:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
    07:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
  4. Haz que los FVs creados sean persistentes creando una regla udev para la interfaz de red que utilizaste para crear los FVs. Por ejemplo, para la interfaz eth1, cree el archivo /etc/udev/rules.d/eth1.rules y añada la siguiente línea:

    ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ATTR{device/sriov_numvfs}="2"

    Esto garantiza que los dos VF que utilizan el controlador ixgbe estarán automáticamente disponibles para la interfaz eth1 cuando se inicie el host.

    Aviso

    Actualmente, este comando no funciona correctamente cuando se intenta hacer persistentes los FV en los adaptadores Broadcom NetXtreme II BCM57810. Además, actualmente no es fiable adjuntar VFs basados en estos adaptadores a VMs de Windows.

  5. Utilice el comando virsh nodedev-list para verificar que libvirt reconoce los dispositivos VF añadidos. Por ejemplo, lo siguiente muestra que los FPs 01:00.0 y 07:00.0 del ejemplo anterior se han convertido con éxito en VFs:

    # virsh nodedev-list | grep pci_
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_07_10_0
    pci_0000_07_10_1
    [...]
  6. Obtenga los valores bus, slot, y function de un FP y uno de sus correspondientes VF. Por ejemplo, para pci_0000_01_00_0 y pci_0000_01_00_1:

    # virsh nodedev-dumpxml pci_0000_01_00_0
    <device>
      <name>pci_0000_01_00_0</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>ixgbe</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>1</bus>
        <slot>0</slot>
        <function>0</function>
    [...]
    # virsh nodedev-dumpxml pci_0000_01_00_1
    <device>
      <name>pci_0000_01_00_1</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.1</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>vfio-pci</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>1</bus>
        <slot>0</slot>
        <function>1</function>
    [...]
  7. Cree un archivo XML temporal y añada una configuración en utilizando los valores bus, slot, y function que obtuvo en el paso anterior. Por ejemplo:

    <interface type='hostdev' managed='yes'>
      <source>
        <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
      </source>
    </interface>
  8. Añada el VF a una VM utilizando el archivo XML temporal. Por ejemplo, lo siguiente adjunta un VF guardado en el /tmp/holdmyfunction.xml a una VM testguest1 en ejecución y asegura que esté disponible después de que la VM se reinicie:

    # virsh attach-device testguest1 /tmp/holdmyfunction.xml --live --config
    Device attached successfully.

    Si esto tiene éxito, el sistema operativo invitado detecta una nueva tarjeta de interfaz de red.