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 ネットワークデバイスの接続
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 システムの準備」 を参照してください。サポートの確認
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)
# 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)Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力は、その他のデバイスをすべて削除するように変更されていることに注意してください。SR-IOV カーネルモジュールの起動
デバイスがサポートされている場合は、ドライバーカーネルモジュールをカーネルが自動的に読み込む必要があります。オプションのパラメーターは、modprobe コマンドを使用してモジュールに渡すことができます。Intel 82576 ネットワークインターフェイスカードは、igb ドライバーカーネルモジュールを使用します。modprobe igb [<option>=<VAL1>,<VAL2>,] lsmod |grep igb igb 87592 0 dca 6708 1 igb
# modprobe igb [<option>=<VAL1>,<VAL2>,] # lsmod |grep igb igb 87592 0 dca 6708 1 igbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 仮想機能のアクティブ化
igb モジュールのmax_vfsパラメーターは、仮想機能の最大数を割り当てます。max_vfsパラメーターにより、ドライバーは Virtual Functions の パラメーターの値まで生成されます。この特定のカードでは、有効な範囲は0から7です。モジュールを削除して変数を変更します。modprobe -r igb
# modprobe -r igbCopy to Clipboard Copied! Toggle word wrap Toggle overflow max_vfsに設定してモジュールを再起動するか、デバイスでサポートされる最大数の Virtual Function を設定します。7modprobe igb max_vfs=7
# modprobe igb max_vfs=7Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仮想機能を永続化します。
igb max_vfs=7 の行オプションを/etc/modprobe.dのファイルに追加して、仮想機能を永続的にします。以下に例を示します。echo "options igb max_vfs=7" >>/etc/modprobe.d/igb.conf
# echo "options igb max_vfs=7" >>/etc/modprobe.d/igb.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 新しい仮想機能の検査
lspci コマンドを使用して、Intel 82576 ネットワークデバイスに追加した仮想機能の一覧を表示します。(もしくは、grep を使用してVirtual Functionを検索し、仮想機能に対応するデバイスを検索します。)Copy to Clipboard Copied! Toggle word wrap Toggle overflow PCI デバイスの識別子は、lspci コマンドの-nパラメーターで確認できます。Physical Function は、0b:00.0および0b:00.1に対応しています。すべての Virtual Function には、説明にVirtual Functionが含まれます。デバイスが virsh で存在することを確認します。
libvirtサービスは、デバイスを仮想マシンに追加する前にデバイスを認識する必要があります。libvirtは、lspci 出力と同様の表記を使用します。lspci 出力の句読点文字(、、および)はすべてアンダースコア(_)に変更され ます。virsh nodedev-list コマンドと grep コマンドを使用して、利用可能なホストデバイスの一覧から Intel 82576 ネットワークデバイスをフィルターにかけます。0bは、この例では Intel 82576 ネットワークデバイスのフィルターです。これはシステムにより異なるため、デバイスが追加される可能性があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仮想機能と物理機能のシリアル番号は、一覧に含まれている必要があります。virsh でデバイスの詳細を取得する
pci_0000_0b_00_0は物理機能の 1 つで、pci_0000_0b_10_0は、その物理機能で最初に対応する仮想機能です。virsh nodedev-dumpxml コマンドを使用して、両方のデバイスの高度な出力を取得します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、仮想機能pci_0000_0b_10_0 を ステップ 9 の仮想マシンに追加します。仮想機能のbus、slotおよび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><interface type='hostdev' managed='yes'> <source> <address type='pci' domain='0' bus='11' slot='16' function='0'/> </source> </interface>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記MAC アドレスを指定しないと、MAC アドレスが自動的に生成されます。<virtualport>要素は、802.11Qbh ハードウェアスイッチに接続する場合にのみ使用されます。<vlan>要素は Red Hat Enterprise Linux 6.4 の新機能で、ゲストのデバイスを VLAN タグ付き42に透過的に配置します。仮想マシンが起動すると、物理アダプターが提供するタイプのネットワークデバイスと、設定された MAC アドレスが表示されます。この MAC アドレスは、ホストおよびゲストの再起動後も変更されません。以下の<interface>の例は、オプションの<mac address>、<virtualport>、および<vlan>要素の構文を示しています。実際には、例に示すように、<vlan>要素または<virtualport>要素のいずれかを同時に使用しないでください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仮想マシンへの仮想機能の追加
上の手順で作成した一時ファイルを使用し、次のコマンドを実行して仮想マシンに仮想機能を追加します。これにより、新しいデバイスがすぐに接続され、以降のゲストの再起動のために保存されます。virsh attach-device MyGuest /tmp/new-interface.xml --config
virsh attach-device MyGuest /tmp/new-interface.xml --configCopy to Clipboard Copied! Toggle word wrap Toggle overflow --configオプションを使用すると、今後ゲストを再起動しても新しいデバイスを使用できるようになります。
仮想マシンが新しいネットワークインターフェイスカードを検出します。この新しいカードは、SR-IOV デバイスの仮想機能です。