17.2. PCI デバイス割り当てと SR-IOV デバイス
<source> 要素でドメイン XML に指定される) は、直接のデバイス割り当て (パススルー と呼ばれることがある) を使用してゲストに直接接続されます。標準の単一ポート PCI イーサネットカードドライバーの設計上の制限により、この方法で割り当てられるのは、シングルルート I/O 仮想化 (SR-IOV) の 仮想機能 (VF) デバイスのみになります。標準の単一ポート PCI または PCIe イーサネットカードをゲストに割り当てるには、従来の <hostdev> デバイスの定義を使用します。
<devices>
<interface type='hostdev'>
<driver name='vfio'/>
<source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</source>
<mac address='52:54:00:6d:90:02'>
<virtualport type='802.1Qbh'>
<parameters profileid='finance'/>
</virtualport>
</interface>
</devices>図17.9 PCI デバイス割り当ての XML サンプル

図17.10 SR-IOV のしくみ
- 物理機能 (PF) は、SR-IOV 機能を含む完全な PCIe デバイスです。物理機能は、通常の PCI デバイスとして検出され、管理され、設定されます。物理機能は、仮想機能を割り当てることで SR-IOV 機能を設定し、管理します。
- 仮想機能 (VF) は、I/O のみを処理する単純な PCIe 機能です。それぞれの仮想機能は物理機能から派生します。デバイス 1 台に備わる仮想機能の数は、デバイスのハードウェアによって制限されます。物理デバイスであるシングルイーサネットポートは、仮想マシンと共有可能な多くの仮想機能にマッピングできます。
17.2.1. SR-IOV の利点
17.2.2. SR-IOV の使用
virsh edit または virsh attach-device コマンドで <hostdev> 内にデバイスエントリーを追加することにより、SR-IOV 仮想機能を仮想マシンに割り当てられます。しかしこの操作は、通常のネットワークデバイスと違って SR-IOV VF は永久的な固有の MAC アドレスを持たず、ホストが再起動するたびに新たな MAC アドレスが割り当てられるので問題になる可能性があります。このため、再起動後にゲストに同じ仮想機能が割り当てられても、ホストが再起動すると、ゲストは新規の MAC アドレスを持たせるために新たなネットワークアダプターを決定します。その結果、ゲストは毎回新たなハードウェアが接続されたと認識し、通常はゲストのネットワークの再設定を要求することになります。
<interface type='hostdev'> インタフェースデバイスが含まれます。このインタフェースデバイスを使って、libvirt はまず指定されたネットワーク特定のハードウェア/スイッチの初期化を行います (MAC アドレスや VLAN タグ、802.1Qbh virtualport パラメーターの設定など)。その後に、ゲストへの PCI デバイス割り当てを実行します。
<interface type='hostdev'> インタフェースデバイスの使用には、以下が必要です。
- SR-IOV 対応ネットワークカード
- Intel VT-d または AMD IOMMU 拡張をサポートするホストハードウェア
- 割り当てられる仮想機能の PCI アドレス
重要
手順17.8 SR-IOV ネットワークデバイスをIntel または AMD システムに割り当てる
Intel VT-d または AMD IOMMU 仕様を BIOS およびカーネル内で有効にします。
Intel システムでは、Intel VT-d が有効にされていない場合、BIOS で有効にします。BIOS およびカーネルで Intel VT-d を有効にする方法については、手順17.1「Intel システムでの PCI デバイス割り当ての準備」を参照してください。Intel VT-d が有効にされ、機能している場合は、このステップを省略してください。AMD システムでは、AMD IOMMU 仕様が有効にされていない場合、BIOS で有効にします。BIOS で IOMMU を有効にする方法については、手順17.2「AMD システムでの PCI デバイス割り当ての準備」を参照してください。サポートを確認します。
SR-IOV 機能に対応する PCI デバイスが検出されるかどうかを確認します。この例では、SR-IOV 対応の Intel 82576 ネットワークインタフェースカードが一覧表示されています。lspciコマンドを使ってデバイスが検出されたかどうかを確認します。#
lspci03: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)出力が変更されて、他のデバイスがすべて削除されていることに注意してください。仮想機能をアクティブにします。
次のコマンドを実行します。#
echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfs仮想機能を永続化します。
再起動後も仮想機能を存続させるためには、任意のエディターを使って以下のような udev ルールを作成し、必要な VF の数をネットワークインターフェースカードでサポートされる上限値までの間で指定します (この例では2つ)。以下の例では、enp14s0f0 を PF ネットワークデバイス名に置き換え、ENV{ID_NET_DRIVER}の値を使用中のドライバーと一致させています。#
vim /etc/udev/rules.d/enp14s0f0.rulesACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ATTR{device/sriov_numvfs}="2"これにより、この機能がブート時間に有効になります。新たな仮想機能を検査します。
lspciコマンドを使用して、Intel 82576 ネットワークデバイスに割り当てられ、新たに追加された仮想機能を一覧表示します。(または、grepを使って仮想機能、または仮想機能をサポートするデバイスを検索します。)#
lspci | grep 825760b: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 デバイスの ID は、lspciコマンドの-nパラメーターを使って確認します。物理機能は、0b:00.0および0b:00.1に対応します。仮想機能にはすべてVirtual Functionと記述されます。virsh を使用してデバイスの有無を確認します。
デバイスを仮想マシンに追加する前に、libvirtサービスはそのデバイスを認識する必要があります。libvirtは、lspci出力に類似する表示を使用します。lspci出力では、すべての句読点とコロン (:) およびピリオド (.) は、アンダースコア (_) に変換されます。virsh nodedev-listコマンドとgrepコマンドを使って、利用可能なホストデバイスの一覧から Intel 82576 ネットワークデバイスを選び出します。この例の0bは、Intel 82576 ネットワークデバイスのフィルターです。これはお使いのシステムによっても異なり、結果として別のデバイスが加わる場合もあります。#
virsh nodedev-list | greppci_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_50bこの一覧には、仮想機能と物理機能の PCI アドレスが表示されます。virsh を使用してデバイスの詳細情報を取得します。
pci_0000_0b_00_0は物理機能の 1 つであり、pci_0000_0b_10_0はこの物理機能に対応する最初の仮想機能です。virsh nodedev-dumpxmlコマンドを使って、両方のデバイスのデバイス情報を表示します。# virsh nodedev-dumpxml pci_0000_03_00_0 <device> <name>pci_0000_03_00_0</name> <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:00.0</path> <parent>pci_0000_00_01_0</parent> <driver> <name>igb</name> </driver> <capability type='pci'> <domain>0</domain> <bus>3</bus> <slot>0</slot> <function>0</function> <product id='0x10c9'>82576 Gigabit Network Connection</product> <vendor id='0x8086'>Intel Corporation</vendor> <capability type='virt_functions'> <address domain='0x0000' bus='0x03' slot='0x10' function='0x0'/> <address domain='0x0000' bus='0x03' slot='0x10' function='0x2'/> <address domain='0x0000' bus='0x03' slot='0x10' function='0x4'/> <address domain='0x0000' bus='0x03' slot='0x10' function='0x6'/> <address domain='0x0000' bus='0x03' slot='0x11' function='0x0'/> <address domain='0x0000' bus='0x03' slot='0x11' function='0x2'/> <address domain='0x0000' bus='0x03' slot='0x11' function='0x4'/> </capability> <iommuGroup number='14'> <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/> </iommuGroup> </capability> </device># virsh nodedev-dumpxml pci_0000_03_11_5 <device> <name>pci_0000_03_11_5</name> <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:11.5</path> <parent>pci_0000_00_01_0</parent> <driver> <name>igbvf</name> </driver> <capability type='pci'> <domain>0</domain> <bus>3</bus> <slot>17</slot> <function>5</function> <product id='0x10ca'>82576 Virtual Function</product> <vendor id='0x8086'>Intel Corporation</vendor> <capability type='phys_function'> <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/> </capability> <iommuGroup number='35'> <address domain='0x0000' bus='0x03' slot='0x11' function='0x5'/> </iommuGroup> </capability> </device>この例では、仮想機能pci_0000_03_10_2をステップ 8 の仮想マシンに追加します。仮想機能のbus、slot、およびfunctionパラメーターは、デバイスを追加するのに必要になります。/tmp/new-interface.xmlなどの一時 XML ファイルにこれらのパラメーターをコピーします。<interface type='hostdev' managed='yes'> <source> <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/> </source> </interface>注記
仮想マシンが起動すると、物理アダプターが提供し、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>MAC アドレスは、指定されない場合は自動生成されます。<virtualport>要素は、802.11Qbh ハードウェアスウィッチに接続する場合のみ使用されます。<vlan>要素は、ゲストのデバイスを42とタグ付けされた VLAN に透過的に配置します。仮想機能を仮想マシンに追加します。
直前のステップで作成された一時ファイルで以下のコマンドを使用して、仮想機能を仮想マシンに追加します。これで新規デバイスは即時に割り当てられ、これ以降のゲストの再起動に備えて保存されます。virsh attach-device MyGuest
/tmp/new-interface.xml--live --configvirsh attach-deviceで--liveを指定することで、新規デバイスを実行中のゲストに割り当てます。--configオプションを使うと、これ以降のゲストの再起動後も新規デバイスが確実に利用可能となります。注記
--liveオプションはゲストが実行中の場合にのみ受け入れられます。--liveオプションが実行中ではないゲストで使用されると、virshはエラーを返します。
17.2.3. SR-IOV デバイスの場合の PCI 割り当ての設定
<hostdev> 要素を使用する従来の方法によりゲスト仮想マシンに割り当てられますが、SR-IOV VF ネットワークデバイスには永続的な固有の MAC アドレスがないため、ホスト物理マシンが再起動されるたびにゲスト仮想マシンのネットワーク設定を再設定する必要があるという問題が生じます。この問題に対処するには、VF をホスト物理マシンに割り当てる前に MAC アドレスを設定する必要があり、この設定はゲスト仮想マシンの起動時に毎回行う必要があります。他のオプションと同様にこの MAC アドレスを割り当てるには、以下の手順を参照してください。
手順17.9 SR-IOV で PCI デバイスを割り当てるための MAC アドレス、vLAN、および仮想ポートの設定
<hostdev> 要素は、MAC アドレス割り当て、vLAN タグ ID 割り当て、または仮想ポートの割り当てなどの機能固有の項目に使用することはできません。<mac>、<vlan>、および <virtualport> 要素は <hostdev> の有効な子ではないためです。それらは hostdev インターフェースタイプ <interface type='hostdev'> で使用できます。このデバイスタイプは、<interface> と <hostdev> のハイブリッドとして機能します。そのため、PCI デバイスをゲスト仮想マシンに割り当てる前に、libvirt はゲスト仮想マシンの XML 設定ファイルに示されるネットワーク固有のハードウェアまたはスイッチ (MAC アドレスの設定、vLAN タグの設定、および/または 802.1Qbh スイッチとの関連付け) を初期化します。vLAN タグ設定についての情報は、「vLAN タグの設定」を参照してください。
情報を収集します。
<interface type='hostdev'>を使用するには、SR-IOV 対応ネットワークカード、また Intel VT-d または AMD IOMMU 拡張のいずれかをサポートするホスト物理マシンハードウェアが必要であり、割り当てる VF の PCI アドレスを把握しておく必要があります。ゲスト仮想マシンをシャットダウンします。
virsh shutdownコマンドを使用して、ゲスト仮想マシンのシャットダウン (ここで使用される名前は guestVM) を実行します。#
virsh shutdown guestVMXML ファイルを開いて編集します。
編集する XML ファイルを開くには、--runningオプションを指定してvirsh save-image-editコマンドを実行します (詳細は、「ゲスト仮想マシン設定の編集」を参照してください)。この例の設定ファイルの名前は guestVM.xml です。#
virsh save-image-edit guestVM.xml--runningユーザーのデフォルトエディターで guestVM.xml を開きます。XML ファイルを編集します。
以下のような<devices>エントリーを組み込むように設定ファイル (guestVM.xml) を更新します。<devices> ... <interface type='hostdev' managed='yes'> <source> <address type='pci' domain='0x0' bus='0x00' slot='0x07' function='0x0'/> <!--these values can be decimal as well--> </source> <mac address='52:54:00:6d:90:02'/> <!--sets the mac address--> <virtualport type='802.1Qbh'> <!--sets the virtual port for the 802.1Qbh switch--> <parameters profileid='finance'/> </virtualport> <vlan> <!--sets the vlan tag--> <tag id='42'/> </vlan> </interface> ... </devices>図17.11 hostdev インターフェースタイプのドメイン XML のサンプル
MAC アドレスを指定しない場合、他のタイプのインターフェースデバイスの場合と同様に、アドレスは自動的に生成されます。さらに、<virtualport>要素は、802.11Qgh ハードウェアスイッチ (802.11Qbg (別名「VEPA」) に接続される場合にのみ使用されます。これらのスイッチは現在サポートされていません。ゲスト仮想マシンを再起動します。
ステップ 2 でシャットダウンしたゲスト仮想マシンを再起動するためにvirsh startコマンドを実行します。詳細は、「仮想マシンの起動、再開および復元」を参照してください。#
virsh start guestVMゲスト仮想マシンが起動すると、設定済みの MAC アドレスと共に、物理ホストマシンのアダプターによって指定されたネットワークデバイスが表示されます。この MAC アドレスは、ゲスト仮想マシンと物理ホストマシンの起動時に変更されることはありません。
17.2.4. SR-IOV 仮想機能のプールからの PCI デバイス割り当ての設定
- 指定した VF は、ゲスト仮想マシンの起動時にはいつでも利用可能な状態でなければなりません。つまり、各 VF を管理者が単一のゲスト仮想マシンに対して永久的に割り当てなければならないことを意味しています (または各ゲスト仮想マシンの起動時に、すべてのゲスト仮想マシンで現在使用されていない VF の PCI アドレスを指定するよう設定ファイルを修正する必要があります)。
- ゲスト仮想マシンが別のホスト物理マシンに移行する場合、そのホスト物理マシンには、PCI バス上の同じ場所に全く同じハードウェアがなければなりません (または、ここでも起動前にゲスト仮想マシンの設定を変更する必要があります)。
手順17.10 デバイスプールの作成
ゲスト仮想マシンをシャットダウンします。
virsh shutdownコマンドを使用して、ゲスト仮想マシンのシャットダウン (ここで使用される名前は guestVM) を実行します。#
virsh shutdown guestVM設定ファイルを作成します。
任意のエディターを使用して、/tmpディレクトリーに XML ファイル (例:passthrough.xml) を作成します。pf dev='eth3'は、お使いの SR-IOV デバイスの物理機能 (PF) の netdev 名に置き換えるようにしてください。以下は、物理機能 (PF) をホスト物理マシンの「eth3」に設定し、SR-IOV アダプターのすべての VF のプールを利用可能にするネットワーク定義のサンプルです。<network> <name>passthrough</name> <!-- This is the name of the file you created --> <forward mode='hostdev' managed='yes'> <pf dev='myNetDevName'/> <!-- Use the netdev name of your SR-IOV devices PF here --> </forward> </network>図17.12 ネットワーク定義の サンプルドメイン XML
新しい XML ファイルをロードします。
/tmp/passthrough.xml を直前のステップで作成した XML ファイルの名前と場所に置き換え、以下のコマンドを入力します。#
virsh net-define /tmp/passthrough.xmlゲストを再起動します。
passthrough.xml を直前のステップで作成した XML ファイルの名前に置き換え、以下を実行します。#
virsh net-autostart passthrough#virsh net-start passthroughゲスト仮想マシンを再起動します。
最初のステップでシャットダウンしたゲスト仮想マシンを再起動するためにvirsh startコマンドを実行します (例では、ゲスト仮想マシンのドメイン名として guestVM を使用しています)。詳細は、「仮想マシンの起動、再開および復元」を参照してください。#
virsh start guestVMデバイスのパススルーを開始します。
単一デバイスのみが表示されていますが、libvirt はゲスト仮想マシンの初回起動時に、PF に関連付けられたすべての VF の一覧を自動的に派生させます。この起動には、以下のようなドメイン XML 内のインターフェース定義が使用されます。<interface type='network'> <source network='passthrough'> </interface>図17.13 インターフェースネットワーク定義のサンプルドメイン XML
検証します。
ネットワークを使用する最初のゲストの起動後にvirsh net-dumpxml passthroughコマンドを実行して検証することができます。以下のような出力が得られます。<network connections='1'> <name>passthrough</name> <uuid>a6b49429-d353-d7ad-3185-4451cc786437</uuid> <forward mode='hostdev' managed='yes'> <pf dev='eth3'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x3'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x5'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x7'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x1'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x3'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x5'/> </forward> </network>図17.14 XML ダンプファイル passthrough の内容
17.2.5. SR-IOV の制限
- Intel® 82576NS Gigabit Ethernet Controller (
igbドライバー) - Intel® 82576EB Gigabit Ethernet Controller (
igbドライバー) - Intel® 82599ES 10 Gigabit Ethernet Controller (
ixgbeドライバー) - Intel® 82599EB 10 Gigabit Ethernet Controller (
ixgbeドライバー)

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.