Red Hat Training

A Red Hat training course is available for RHEL 8

10.8.2. SR-IOV ネットワークデバイスの仮想マシンへの割り当て

Intel ホストまたは AMD ホストの仮想マシンに SR-IOV ネットワークデバイスを割り当てるには、VF (Virtual Function) をホストの SR-IOV 対応ネットワークインターフェースから作成し、VF をデバイスとして、指定された仮想マシンに割り当てます。詳細は、次の手順を参照してください。

前提条件

  • ホストの CPU およびファームウェアは、IOMMU (I/O Memory Management Unit) に対応している。

    • Intel CPU を使用している場合は、Intel VT-d (Virtualization Technology for Directed I/O) に対応する必要があります。
    • AMD CPU を使用している場合は、AMD-Vi 機能に対応している必要があります。
  • ホストシステムが、アクセス制御サービス (ACS) を使用して PCIe トポロジーの DMA (Direct Memory Access) 分離を提供している。この点をシステムベンダーに確認してください。

    詳細は、「SR-IOV 実装に関するハードウェアの考慮事項」を参照してください。

  • 物理ネットワークデバイスが SR-IOV をサポートしている。システムのネットワークデバイスが SR-IOV に対応しているかどうかを確認するには、lspci -v コマンドを使用して、出力で Single Root I/O Virtualization (SR-IOV) を探します。

    # 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
    [...]
  • VF の作成に使用するホストのネットワークインターフェースが実行中である。たとえば、eth1 インターフェースをアクティブにして、実行していることを確認するには、次のコマンドを実行します。

    # 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
  • SR-IOV デバイス割り当てを有効にするには、ホスト BIOS およびカーネルで IOMMU 機能を有効にする必要があります。改善点を報告する場合は、以下のように行います。

    • Intel ホストで VT-d を有効にします。

      • Intel ホストが複数のブートエントリーを使用する場合は、以下を行います。

        1. /etc/default/grub ファイルを編集し、intel_iommu=on パラメーターおよび iommu=pt パラメーターを 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. GRUB 設定を再生成します。

          # grub2-mkconfig -o /boot/grub2/grub.cfg
        3. ホストを再起動します。
      • Intel ホストがブートエントリーを 1 つ使用する場合は、以下を行います。

        1. intel_iommu=on パラメーターで GRUB 設定を再生成します。

          # grubby --args="intel_iommu=on" --update-kernel DEFAULT
        2. ホストを再起動します。
    • AMD ホストで、AMD-Vi を有効にします。

      • AMD ホストが複数のブートエントリーを使用する場合は、以下を行います。

        1. /etc/default/grub ファイルを編集し、iommu=pt パラメーターおよび amd_iommu=on パラメーターを 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. GRUB 設定を再生成します。

          # grub2-mkconfig -o /boot/grub2/grub.cfg
        3. ホストを再起動します。
      • AMD ホストがブートエントリーを 1 つ使用する場合は、以下を行います。

        1. iommu=pt パラメーターで GRUB 設定を再生成します。

          # grubby --args="iommu=pt" --update-kernel DEFAULT
        2. ホストを再起動します。

手順

  1. (必要に応じて) ネットワークデバイスが使用できる VF の最大数を確認します。これを実行するには、次のコマンドを使用して、eth1 を SR-IOV 互換のネットワークデバイスに置き換えます。

    # cat /sys/class/net/eth1/device/sriov_totalvfs
    7
  2. 次のコマンドを実行して、Virtual Function (VF) を作成します。

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

    上記コマンドでは、以下のようになります。

    • VF-number には、PF に作成する VF の数を入力します。
    • network-interface は、VF が作成されるネットワークインターフェースの名前に置き換えます。

    以下の例では、eth1 ネットワークインターフェースから 2 つの VF を作成します。

    # echo 2 > /sys/class/net/eth1/device/sriov_numvfs
  3. 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. VF の作成に使用したネットワークインターフェース用の udev ルールを作成して、作成した VF を永続化します。たとえば、eth1 インターフェースの場合は、/etc/udev/rules.d/eth1.rules ファイルを作成し、以下の行を追加します。

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

    これにより、ホストの起動時に ixgbe ドライバーを使用する 2 つの VF が eth1 インターフェースで自動的に利用できるようになります。

    警告

    現在、Broadcom NetXtreme II BCM57810 アダプターで VF を永続化しようとすると、このコマンドは正しく機能しません。また、このアダプターに基づく VF を Windows 仮想マシンに接続することは、現在信頼性がありません。

  5. virsh nodedev-list コマンドを使用して、追加された VF デバイスを libvirt が認識していることを確認します。たとえば、以下の例では、前の例の 01:00.0 と 07:00.0 PF が VF に正常に変換されていることを示しています。

    # 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. PF の busslot、および function の値、および対応する VF 値のいずれかを取得します。たとえば、pci_0000_01_00_0 および 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. 一時 XML ファイルを作成し、前の手順で取得した busslot、および function の値を使用して構成を追加します。以下に例を示します。

    <interface type='hostdev' managed='yes'>
      <source>
        <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
      </source>
    </interface>
  8. 一時 XML ファイルを使用して VF を仮想マシンに追加します。たとえば、以下は、/tmp/holdmyfunction.xml に保存されている VF を稼働中の仮想マシン testguest1 に接続し、仮想マシンの再起動後に利用できるようにします。

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

    これに成功すると、ゲストオペレーティングシステムは新規ネットワークインターフェースカードを検出します。