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 busqueSingle 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:
Edite el archivo
/etc/default/grub
y añada los parámetrosintel_iommu=on
yiommu=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"
Regenerar la configuración de GRUB:
# grub2-mkconfig -o /boot/grub2/grub.cfg
- Reinicia el host.
Si su host Intel utiliza una única entrada de arranque:
Regenerar la configuración de GRUB con el parámetro
intel_iommu=on
:# grubby --args="intel_iommu=on" --update-kernel DEFAULT
- Reinicia el host.
En un host AMD, active AMD-Vi:
Si su host AMD utiliza múltiples entradas de arranque:
Edite el archivo
/etc/default/grub
y añada los parámetrosiommu=pt
yamd_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"
Regenerar la configuración de GRUB:
# grub2-mkconfig -o /boot/grub2/grub.cfg
- Reinicia el host.
Si su host AMD utiliza una única entrada de arranque:
Regenerar la configuración de GRUB con el parámetro
iommu=pt
:# grubby --args="iommu=pt" --update-kernel DEFAULT
- Reinicia el host.
Procedimiento
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
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
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)
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 interfazeth1
cuando se inicie el host.AvisoActualmente, 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.
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 [...]
Obtenga los valores
bus
,slot
, yfunction
de un FP y uno de sus correspondientes VF. Por ejemplo, parapci_0000_01_00_0
ypci_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> [...]
Cree un archivo XML temporal y añada una configuración en utilizando los valores
bus
,slot
, yfunction
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>
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.