Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

13.2. SR-IOV の使用

本セクションでは、PCI パススルーを使用して、SR-IOV 対応マルチポートネットワークカードの Virtual Function をネットワークデバイスとして仮想マシンに割り当てる方法について説明します。
SR-IOV Virtual Function (VF)は、virsh edit コマンドまたは virsh attach-device コマンドを使用して <hostdev> にデバイスエントリーを追加することで、仮想マシンに割り当てることができます。ただし、これは通常のネットワークデバイスとは異なり、SR-IOV VF ネットワークデバイスには永続的な一意の MAC アドレスがなく、ホストを再起動するたびに新しい MAC アドレスが割り当てられるため、問題になることがあります。このため、システムの再起動後にゲストに同じ VF が割り当てられた場合でも、ホストの再起動時に、ゲストのネットワークアダプターが新しい MAC アドレスを持つと判断します。その結果、ゲストは毎回新しいハードウェアが接続されていると考え、通常はゲストのネットワーク設定を再設定する必要があります。
libvirt-0.9.10 後半には <interface type='hostdev'> インターフェイスデバイスが含まれています。このインターフェイスデバイスを使用すると、libvirt は最初に、示されたネットワーク固有のハードウェア/スイッチの初期化(MAC アドレス、VLAN タグ、802.1Qbh 仮想ポートパラメーターの設定など) を実行し、次にゲストへの PCI デバイス割り当てを実行します。
<interface type='hostdev'> インターフェイスデバイスを使用するには、以下が必要です。
  • SR-IOV 対応のネットワークカード、
  • Intel VT-d または AMD IOMMU 拡張機能のいずれかをサポートするホストハードウェア
  • 割り当てる VF の PCI アドレス。
SR-IOV 対応のネットワークインターフェイスカード(NIC)の一覧は、を参照してください https://access.redhat.com/articles/1390483
重要
SR-IOV デバイスを仮想マシンに割り当てるには、ホストハードウェアが Intel VT-d または AMD IOMMU 仕様をサポートしている必要があります。
Intel または AMD システムに SR-IOV ネットワークデバイスを接続する場合は、以下の手順を行います。

手順13.1 Intel または AMD システムでの SR-IOV ネットワークデバイスの接続

  1. BIOS およびカーネルで、Intel VT-d または AMD IOMMU の仕様を有効にします。

    Intel システムでは、BIOS で Intel VT-d が有効になっていない場合は有効にします。BIOS およびカーネルで Intel VT-d を有効にする方法については、手順12.1「PCI デバイス割り当てのための Intel システムの準備」 を参照してください。
    Intel VT-d が既に有効で機能している場合は、この手順をスキップしてください。
    AMD システムでは、BIOS で AMD IOMMU 仕様が有効になっていない場合は有効にします。BIOS で IOMMU を有効にする方法については、手順12.2「PCI デバイス割り当て用の AMD システムの準備」 を参照してください。
  2. サポートの確認

    SR-IOV 機能のある PCI デバイスが検出されたかどうかを確認します。この例では、SR-IOV に対応する Intel 82576 ネットワークインターフェイスカードを一覧表示します。lspci コマンドを使用して、デバイスが検出されたかどうかを確認します。
    # lspci
    03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    この出力は、その他のデバイスをすべて削除するように変更されていることに注意してください。
  3. SR-IOV カーネルモジュールの起動

    デバイスがサポートされている場合は、ドライバーカーネルモジュールをカーネルが自動的に読み込む必要があります。オプションのパラメーターは、modprobe コマンドを使用してモジュールに渡すことができます。Intel 82576 ネットワークインターフェイスカードは、igb ドライバーカーネルモジュールを使用します。
    # modprobe igb [<option>=<VAL1>,<VAL2>,]
    # lsmod |grep igb
    igb    87592  0
    dca    6708    1 igb
  4. 仮想機能のアクティブ化

    igb モジュールの max_vfs パラメーターは、仮想機能の最大数を割り当てます。max_vfs パラメーターにより、ドライバーは Virtual Functions の パラメーターの値まで生成されます。この特定のカードでは、有効な範囲は 0 から 7 です。
    モジュールを削除して変数を変更します。
    # modprobe -r igb
    max_vfs に設定してモジュールを再起動するか、デバイスでサポートされる最大数の Virtual Function を設定します。7
    # modprobe igb max_vfs=7
  5. 仮想機能を永続化します。

    igb max_vfs=7 の行オプション/etc/modprobe.d のファイルに追加して、仮想機能を永続的にします。以下に例を示します。
    # echo "options igb max_vfs=7" >>/etc/modprobe.d/igb.conf
  6. 新しい仮想機能の検査

    lspci コマンドを使用して、Intel 82576 ネットワークデバイスに追加した仮想機能の一覧を表示します。(もしくは、grep を使用して Virtual Function を検索し、仮想機能に対応するデバイスを検索します。)
    # lspci | grep 82576
    0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection(rev 01)
    0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    PCI デバイスの識別子は、lspci コマンドの -n パラメーターで確認できます。Physical Function は、0b:00.0 および 0b:00.1 に対応しています。すべての Virtual Function には、説明に Virtual Function が含まれます。
  7. デバイスが virsh で存在することを確認します。

    libvirt サービスは、デバイスを仮想マシンに追加する前にデバイスを認識する必要があります。libvirt は、lspci 出力と同様の表記を使用します。lspci 出力の句読点文字(、、および)はすべてアンダースコア(_)に変更され ます。
    virsh nodedev-list コマンドと grep コマンドを使用して、利用可能なホストデバイスの一覧から Intel 82576 ネットワークデバイスをフィルターにかけます。0b は、この例では Intel 82576 ネットワークデバイスのフィルターです。これはシステムにより異なるため、デバイスが追加される可能性があります。
    # virsh nodedev-list | grep 0b
    pci_0000_0b_00_0
    pci_0000_0b_00_1
    pci_0000_0b_10_0
    pci_0000_0b_10_1
    pci_0000_0b_10_2
    pci_0000_0b_10_3
    pci_0000_0b_10_4
    pci_0000_0b_10_5
    pci_0000_0b_10_6
    pci_0000_0b_11_7
    pci_0000_0b_11_1
    pci_0000_0b_11_2
    pci_0000_0b_11_3
    pci_0000_0b_11_4
    pci_0000_0b_11_5
    仮想機能と物理機能のシリアル番号は、一覧に含まれている必要があります。
  8. virsh でデバイスの詳細を取得する

    pci_0000_0b_00_0 は物理機能の 1 つで、pci_0000_0b_10_0 は、その物理機能で最初に対応する仮想機能です。virsh nodedev-dumpxml コマンドを使用して、両方のデバイスの高度な出力を取得します。
    # virsh nodedev-dumpxml pci_0000_0b_00_0
    <device>
       <name>pci_0000_0b_00_0</name>
       <parent>pci_0000_00_01_0</parent>
       <driver>
          <name>igb</name>
       </driver>
       <capability type='pci'>
          <domain>0</domain>
          <bus>11</bus>
          <slot>0</slot>
          <function>0</function>
          <product id='0x10c9'>82576 Gigabit Network Connection</product>
          <vendor id='0x8086'>Intel Corporation</vendor>
       </capability>
    </device>
    # virsh nodedev-dumpxml pci_0000_0b_10_0
    <device>
       <name>pci_0000_0b_10_0</name>
       <parent>pci_0000_00_01_0</parent>
       <driver>
          <name>igbvf</name>
       </driver>
       <capability type='pci'>
          <domain>0</domain>
          <bus>11</bus>
          <slot>16</slot>
          <function>0</function>
          <product id='0x10ca'>82576 Virtual Function</product>
          <vendor id='0x8086'>Intel Corporation</vendor>
       </capability>
    </device>
    この例では、仮想機能 pci_0000_0b_ 10_0 を ステップ 9 の仮想マシンに追加します。仮想機能の busslot および function のパラメーターに注意してください。これらはデバイスの追加に必要です。
    このパラメーターは、/tmp/new-interface.xml などの一時 XML ファイルにコピーします。
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0' bus='11' slot='16' function='0'/>
         </source>
       </interface>
    注記
    MAC アドレスを指定しないと、MAC アドレスが自動的に生成されます。<virtualport> 要素は、802.11Qbh ハードウェアスイッチに接続する場合にのみ使用されます。<vlan> 要素は Red Hat Enterprise Linux 6.4 の新機能で、ゲストのデバイスを VLAN タグ付き 42 に透過的に配置します。
    仮想マシンが起動すると、物理アダプターが提供するタイプのネットワークデバイスと、設定された MAC アドレスが表示されます。この MAC アドレスは、ホストおよびゲストの再起動後も変更されません。
    以下の <interface> の例は、オプションの <mac address><virtualport>、および <vlan> 要素の構文を示しています。実際には、例に示すように、<vlan> 要素または <virtualport> 要素のいずれかを同時に使用しないでください。
    ...
     <devices>
       ...
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0' bus='11' slot='16' function='0'/>
         </source>
         <mac address='52:54:00:6d:90:02'>
         <vlan>
            <tag id='42'/>
         </vlan>
         <virtualport type='802.1Qbh'>
           <parameters profileid='finance'/>
         </virtualport>
       </interface>
       ...
     </devices>
  9. 仮想マシンへの仮想機能の追加

    上の手順で作成した一時ファイルを使用し、次のコマンドを実行して仮想マシンに仮想機能を追加します。これにより、新しいデバイスがすぐに接続され、以降のゲストの再起動のために保存されます。
    virsh attach-device MyGuest /tmp/new-interface.xml  --config
    
    --config オプションを使用すると、今後ゲストを再起動しても新しいデバイスを使用できるようになります。
仮想マシンが新しいネットワークインターフェイスカードを検出します。この新しいカードは、SR-IOV デバイスの仮想機能です。