Red Hat Training

A Red Hat training course is available for RHEL 8

10.8.2. Fixação de dispositivos de rede SR-IOV em máquinas virtuais

Para anexar um dispositivo de rede SR-IOV a uma máquina virtual (VM) em um host Intel ou AMD, você deve criar uma função virtual (VF) a partir de uma interface de rede capaz de SR-IOV no host e atribuir a VF como um dispositivo a uma VM especificada. Para detalhes, veja as seguintes instruções.

Pré-requisitos

  • A CPU e o firmware de seu host suportam a Unidade de Gerenciamento de Memória I/O (IOMMU).

    • Se utilizar uma CPU Intel, ela deve suportar a Tecnologia de Virtualização Intel para E/S direcionada (VT-d).
    • Se estiver usando uma CPU AMD, ela deve suportar a funcionalidade AMD-Vi.
  • O sistema host usa o Serviço de Controle de Acesso (ACS) para fornecer acesso direto à memória (DMA) isolação para a topologia PCIe. Verifique isto com o fornecedor do sistema.

    Para informações adicionais, consulte Considerações sobre Hardware para implementação do SR-IOV.

  • O dispositivo físico de rede suporta SR-IOV. Para verificar se algum dispositivo de rede em seu sistema suporta SR-IOV, use o comando lspci -v e procure Single Root I/O Virtualization (SR-IOV) na saída.

    # 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
    [...]
  • A interface da rede anfitriã que você deseja usar para criar VFs está em execução. Por exemplo, para ativar a interface eth1 e verificar se ela está em execução:

    # 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 o dispositivo SR-IOV possa funcionar, o recurso IOMMU deve estar habilitado na BIOS e no kernel do host. Para fazer isso:

    • Em um host Intel, habilite o VT-d:

      • Se seu host Intel usa múltiplas entradas de inicialização:

        1. Edite o arquivo /etc/default/grub e adicione os parâmetros intel_iommu=on e iommu=pt no final da linha 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 a configuração do GRUB:

          # grub2-mkconfig -o /boot/grub2/grub.cfg
        3. Reiniciar o anfitrião.
      • Se seu host Intel usa uma única entrada de inicialização:

        1. Regenerar a configuração do GRUB com o parâmetro intel_iommu=on:

          # grubby --args="intel_iommu=on" --update-kernel DEFAULT
        2. Reiniciar o anfitrião.
    • Em um host AMD, habilite o AMD-Vi:

      • Se seu host AMD usa múltiplas entradas de inicialização:

        1. Edite o arquivo /etc/default/grub e adicione os parâmetros iommu=pt e amd_iommu=on no final da linha 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 a configuração do GRUB:

          # grub2-mkconfig -o /boot/grub2/grub.cfg
        3. Reiniciar o anfitrião.
      • Se seu host AMD usa uma única entrada de inicialização:

        1. Regenerar a configuração do GRUB com o parâmetro iommu=pt:

          # grubby --args="iommu=pt" --update-kernel DEFAULT
        2. Reiniciar o anfitrião.

Procedimento

  1. Optional: Confirme o número máximo de VFs que seu dispositivo de rede pode usar. Para isso, use o seguinte comando e substitua eth1 pelo seu dispositivo de rede compatível com SR-IOV.

    # cat /sys/class/net/eth1/device/sriov_totalvfs
    7
  2. Use o seguinte comando para criar uma função virtual (VF):

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

    No comando, substitua:

    • VF-number com o número de VFs que você deseja criar no PF.
    • network-interface com o nome da interface da rede para a qual as VFs serão criadas.

    O exemplo a seguir cria 2 VFs a partir da interface de rede eth1:

    # echo 2 > /sys/class/net/eth1/device/sriov_numvfs
  3. Verificar se as VFs foram adicionadas:

    # 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. Torne as VFs criadas persistentes, criando uma regra udev para a interface de rede que você usou para criar as VFs. Por exemplo, para a interface eth1, crie o arquivo /etc/udev/rules.d/eth1.rules, e acrescente a seguinte linha:

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

    Isto assegura que as duas VFs que usam o driver ixgbe estarão automaticamente disponíveis para a interface eth1 quando o host iniciar.

    Atenção

    Atualmente, este comando não funciona corretamente quando se tenta tornar as VFs persistentes nos adaptadores Broadcom NetXtreme II BCM57810. Além disso, anexar VFs baseadas nestes adaptadores às VMs do Windows não é atualmente confiável.

  5. Use o comando virsh nodedev-list para verificar que libvirt reconhece os dispositivos VF adicionados. Por exemplo, o seguinte mostra que os PFs 01:00.0 e 07:00.0 do exemplo anterior foram convertidos com sucesso em 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. Obter os valores bus, slot e function de uma PF e uma de suas FVs correspondentes. Por exemplo, para pci_0000_01_00_0 e 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. Crie um arquivo XML temporário e adicione uma configuração usando os valores obtidos no passo anterior: bus, slot, e function. Por exemplo:

    <interface type='hostdev' managed='yes'>
      <source>
        <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
      </source>
    </interface>
  8. Adicione a VF a uma VM usando o arquivo temporário XML. Por exemplo, o seguinte anexa uma VF salva no /tmp/holdmyfunction.xml a uma VM em funcionamento testguest1 e garante que ela estará disponível após o reinício da VM:

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

    Se isto for bem-sucedido, o sistema operacional convidado detecta uma nova placa de interface de rede.