Menu Close

Red Hat Training

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

第9章 ゲスト仮想マシンデバイスの設定

Red Hat Enterprise Linux 6 は、ゲスト仮想マシンの 3 つのクラスのデバイスに対応します。
  • Emulated devices は、実際のハードウェアを模倣する純粋な仮想デバイスであり、未変更のゲストオペレーティングシステムは標準のインボックスドライバーを使用して動作できるようにします。Red Hat Enterprise Linux 6 は、216 virtio デバイスまで対応します。
  • VirtIO devices は、仮想マシンで最適に動作するように設計された仮想デバイスです。VirtIO デバイスはエミュレートされたデバイスと似ていますが、Linux 以外の仮想マシンには、デフォルトで必要となるドライバーは含まれません。Virtual Machine Manager (virt-manager) や Red Hat Virtualization Hypervisor などの仮想化管理ソフトウェアは、サポートされている Linux 以外のゲストオペレーティングシステム用にこれらのドライバーを自動的にインストールします。Red Hat Enterprise Linux 6 は、最大 700 の scsi ディスクに対応します。
  • 割り当てられたデバイス は、仮想マシンに公開される物理デバイスです。このメソッドは「passthrough」としても知られています。デバイスの割り当てにより、仮想マシンはさまざまなタスクで PCI デバイスに排他的にアクセスできるようになり、PCI デバイスがゲストオペレーティングシステムに物理的に接続されているかのように見え、動作します。Red Hat Enterprise Linux 6 は、仮想マシンごとに割り当てられたデバイスを最大 32 個までサポートします。
デバイスの割り当ては、グラフィックデバイスの選択など、PCIe デバイスでサポートされます。Red Hat Enterprise Linux 6 のデバイスの割り当てで、NVIDIA K シリーズ Quadro、GRID、および Tesla グラフィックカード GPU 機能がサポートされるようになりました。パラレルPCIデバイスは、割り当てられたデバイスとしてサポートされる場合がありますが、セキュリティとシステム構成の競合のために厳しい制限があります。
注記
仮想マシンに接続できるデバイスの数は、いくつかの要因によって異なります。1 つの要因は、QEMU プロセスによって開かれるファイルの数です (/etc/security/limits.conf で設定され、/etc/libvirt/qemu.conf でオーバーライドできます)。他の制限要因には、仮想バスで利用可能なスロット数や、sysctl で設定されたオープンファイルのシステム全体の制限が含まれます。
特定のデバイスの詳細と制限に関する情報は、「Devices」 を参照してください。
Red Hat Enterprise Linux 6 は、仮想マシンに単一の機能スロットとして公開されるデバイスの PCI ホットプラグをサポートします。これを可能にするために、単一機能のホストデバイスや、多機能のホストデバイスの個別の機能を設定できます。デバイスを多機能PCIスロットとして仮想マシンに公開する構成は、ホットプラグ以外のアプリケーションにのみ推奨されます。
注記
デバイスが割り当てられたゲストをホストから完全に分離するには、プラットフォームが割り込みの再マッピングをサポートしている必要があります。このようなサポートがないと、ホストは悪意のあるゲストからの割り込み注入攻撃に対して脆弱となる可能性があります。ゲストが信頼できる環境では、管理者は allow_unsafe_interrupts vfio_iommu_type1 モジュールへのオプションを使用して引き続き PCI デバイスの割り当てを許可することを選択できます。これは、以下を含む /etc/modprobe.d に .conf ファイル (local.conf など) を追加することで、永続的に実行できます。
options vfio_iommu_type1 allow_unsafe_interrupts=1
または sysfs エントリーを使用して動的に同じことを行います。
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts

9.1. PCI デバイス

PCI デバイスの割り当ては、Intel VT-d または AMD IOMMU のいずれかに対応するハードウェアプラットフォームでのみ利用できます。PCI デバイスの割り当てを機能させるには、この Intel VT-d または AMD IOMMU の仕様が BIOS で有効になっている必要があります。

手順9.1 PCIデバイス割り当てのためのIntelシステムの準備

  1. Intel VT-d 仕様を有効にする

    Intel VT-d 仕様では、物理デバイスを仮想マシンに直接割り当てるハードウェアサポートが提供されます。この仕様は、Red Hat Enterprise Linux で PCI デバイスの割り当てを使用するために必要です。
    Intel VT-d 仕様は、BIOS で有効にする必要があります。システムの製造元によっては、この仕様をデフォルトで無効にしている場合があります。これらの仕様を表示するのに使用される用語はメーカーにより異なります。適切な用語は、システムの製造元のドキュメントを参照してください。
  2. カーネルで Intel VT-d をアクティブにします。

    /etc/sysconfig/grub ファイル内の GRUB_CMDLINX_LINUX 行の末尾に、引用符で囲んで intel_iommu=on パラメーターおよび iommu=pt パラメーターを追加して、カーネル内で Intel VT-d をアクティブにします。
    以下は、Intel VT-d を有効にした修正grubです。
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/
    rhcrashkernel-param || :) rhgb quiet intel_iommu=on"
  3. 設定ファイルの再生成

    以下を実行して /etc/grub2.cfg を再生成します。
    grub2-mkconfig -o /etc/grub2.cfg
    UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg であることに注意してください。
  4. 使用準備完了

    システムを再起動して、変更を有効にします。これで、システムで PCI デバイスの割り当てが可能になります。

手順9.2 PCI デバイス割り当て用の AMD システムの準備

  1. AMD IOMMU 仕様を有効にする

    Red Hat Enterprise Linux で PCI デバイスの割り当てを使用するには、AMD IOMMU の仕様が必要です。この仕様は、BIOS で有効にする必要があります。システムの製造元によっては、この仕様をデフォルトで無効にしている場合があります。
  2. IOMMU カーネルサポートの有効化

    システムの起動時に AMD IOMMU 仕様が有効になるように、/etc/sysconfig/grub の GRUB_CMDLINX_LINUX 行の末尾に引用符で囲って amd_iommu=on を追加します。
  3. 設定ファイルの再生成

    以下を実行して /etc/grub2.cfg を再生成します。
    grub2-mkconfig -o /etc/grub2.cfg
    UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg であることに注意してください。
  4. 使用準備完了

    システムを再起動して、変更を有効にします。これで、システムで PCI デバイスの割り当てが可能になります。

9.1.1. virsh を使用した PCI デバイスの割り当て

この手順では、KVM ハイパーバイザーの仮想マシンに PCI デバイスを割り当てる方法を説明します。
この例では、PCI 識別子コード、pci_0000_01_00_0、および完全に仮想化されたゲストマシン guest1-rhel6-64 を持つ PCIe ネットワークコントローラーを使用します。

手順9.3 virsh を使用した PCI デバイスのゲスト仮想マシンへの割り当て

  1. デバイスの識別

    まず、仮想マシンへのデバイス割り当てに指定されている PCI デバイスを特定します。使用可能な PCI デバイスの一覧を表示する場合は、lspci コマンドを実行します。grep を使用して、lspci の出力を絞り込むことができます。
    この例では、以下の出力で強調表示されているイーサネットコントローラーを使用します。
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    このイーサネットコントローラーは、短い識別子 00:19.0 で表示されます。この PCI デバイスを仮想マシンに割り当てるには、virsh が使用する完全な ID を確認する必要があります。
    これを行うには、virsh nodedev-list コマンドを使用して、ホストマシンに接続されている特定タイプ (pci) のデバイスをすべて一覧表示します。次に、使用するデバイスの短い識別子にマップする文字列の出力を調べます。
    この例では、短い識別子 00:19.0 を使用して、イーサネットコントローラーにマップする文字列を示しています。この例では、:.が、完全な識別子では、文字はアンダースコアに置き換えられます。
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    使用するデバイスにマップする PCI デバイス番号を記録します。これは別の手順で必要になります。
  2. デバイス情報の確認

    ドメイン、バス、および機能の情報は、virsh nodedev-dumpxml コマンドの出力から取得できます。
    virsh nodedev-dumpxml pci_0000_00_19_0
    <device>
      <name>pci_0000_00_19_0</name>
      <parent>computer</parent>
      <driver>
        <name>e1000e</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>0</bus>
        <slot>25</slot>
        <function>0</function>
        <product id='0x1502'>82579LM Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    注記
    IOMMU グループは、IOMMU からの視認性とデバイスの分離に基づいて決定されます。各 IOMMU グループには、1 つ以上のデバイスを含めることができます。複数のデバイスが存在する場合は、グループ内のすべてのデバイスがゲストに割り当てられるため、IOMMU グループ内のすべてのエンドポイントが要求されます。これは、追加のエンドポイントをゲストに割り当てるか、virsh nodedev-detach を使用してホストドライバーから外すことで実行できます。1 つのグループに含まれるデバイスが複数のゲストに分割されたり、ホストとゲストが分割されたりすることはありません。PCIe root ポート、スイッチポート、ブリッジなどのエンドポイント以外のデバイスは、ホストドライバーから分離しないでください。また、エンドポイントの割り当てに影響を及ぼしません。
    IOMMU グループ内のデバイスは、virsh nodedev-dumpxml 出力の IOMMU グループセクションを使用して決定できます。グループの各メンバーは、別の「アドレス」フィールドで提供されます。この情報は、sysfs で以下を使用して取得することもできます。
    $ ls /sys/bus/pci/devices/0000:01:00.0/iommu_group/devices/
    この出力の例を以下に示します。
    0000:01:00.0  0000:01:00.1
    ゲストに 0000.01.00.0 のみを割り当てるには、ゲストを起動する前に、使用されていないエンドポイントをホストから分離する必要があります。
    $ virsh nodedev-detach pci_0000_01_00_1
  3. 必要な設定の詳細を決定する

    設定ファイルに必要な値は、virsh nodedev-dumpxml pci_0000_00_19_0 コマンドの出力を参照してください。
    この例のデバイスは、bus = 0、slot = 25、および function = 0 の値を持ちます。10 進数の設定では、この 3 つの値が使用されます。
    bus='0'
    slot='25'
    function='0'
  4. 設定の詳細の追加

    virsh edit を実行し、仮想マシン名を指定し、<source> セクションにデバイスエントリーを追加して、PCI デバイスをゲスト仮想マシンに割り当てます。
    # virsh edit guest1-rhel6-64
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
         <address domain='0' bus='0' slot='25' function='0'/>
      </source>
    </hostdev>
    または、virsh attach-device を実行して、仮想マシンの名前とゲストの XML ファイルを指定します。
    virsh attach-device guest1-rhel6-64 file.xml
  5. 仮想マシンの起動

    # virsh start guest1-rhel6-64
これにより、PCI デバイスが仮想マシンに正常に割り当てられ、ゲストオペレーティングシステムにアクセスできるようになります。

9.1.2. virt-manager を使用した PCI デバイスの割り当て

PCI デバイスは、グラフィカルvirt-managerツールを使用してゲスト仮想マシンに追加できます。次の手順では、ギガビットイーサネットコントローラーをゲスト仮想マシンに追加します。

手順9.4 virt-manager を使用した PCI デバイスのゲスト仮想マシンへの割り当て

  1. ハードウェア設定を開く

    ゲスト仮想マシンを開き、Add Hardware をクリックして、仮想マシンに新しいデバイスを追加します。

    図9.1 仮想マシンのハードウェア情報ウィンドウ

    The virtual machine hardware window with the Information button selected on the top taskbar and Overview selected on the left menu pane.
  2. PCI デバイスの選択

    左側の Hardware 一覧から PCI Host Device を選択します。
    未使用の PCI デバイスを選択します。別のゲストが使用している PCI デバイスを選択すると、エラーが発生する可能性があります。この例では、予備の 82576 ネットワークデバイスが使用されています。Finish を選択して設定を完了します。

    図9.2 Add new virtual hardware ウィザード

    The Add new virtual hardware wizard with PCI Host Device selected on the left menu pane, showing a list of host devices for selection in the right menu pane.
  3. 新しいデバイスの追加

    セットアップが完了し、ゲスト仮想マシンがPCIデバイスに直接アクセスできるようになりました。

    図9.3 仮想マシンのハードウェア情報ウィンドウ

    The virtual machine hardware window with the Information button selected on the top taskbar and Overview selected on the left menu pane, displaying the newly added PCI Device in the list of virtual machine devices in the left menu pane.
注記
デバイスの割り当てに失敗すると、同じ IOMMU グループに、ホストに依然として接続されているその他のエンドポイントが存在する可能性があります。virt-manager を使用してグループ情報を取得する方法はありませんが、virsh コマンドを使用すると、IOMMU グループの境界を分析したり、必要に応じてデバイスを隔離したりできます。
IOMMU グループの詳細と、virsh を使用してエンドポイントデバイスの割り当てを解除する方法は、「virsh を使用した PCI デバイスの割り当て」注記 を参照してください。

9.1.3. virt-install を使用した PCI デバイスの割り当て

virt-install を使用して PCI デバイスを割り当てるには、--host-device パラメーターを使用します。

手順9.5 virt-install を使用した、仮想マシンへの PCI デバイスの割り当て

  1. デバイスの識別

    ゲスト仮想マシンにデバイス割り当てに指定されている PCI デバイスを特定します。
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    virsh nodedev-list コマンドは、システムに接続されているすべてのデバイスの一覧を表示し、各 PCI デバイスを文字列で識別します。出力を PCI デバイスのみに制限するには、次のコマンドを実行します。
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    PCI デバイス番号を記録します。この番号は他の手順で確認する必要があります。
    ドメイン、バス、および機能の情報は、virsh nodedev-dumpxml コマンドの出力から取得できます。
    # virsh nodedev-dumpxml pci_0000_01_00_0
    <device>
      <name>pci_0000_01_00_0</name>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igb</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>1</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10c9'>82576 Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    注記
    IOMMU グループに複数のエンドポイントがあり、そのすべてがゲストに割り当てられていない場合は、ゲストを起動する前に次のコマンドを実行して、ホストからその他のエンドポイントの割り当てを手動で解除する必要があります。
    $ virsh nodedev-detach pci_0000_00_19_1
    IOMMU グループの詳細は、「virsh を使用した PCI デバイスの割り当て」注記 を参照してください。
  2. デバイスの追加

    virshnodedev コマンドから出力された PCI 識別子を --host-device パラメーターの値として使用します。
    virt-install \
    --name=guest1-rhel6-64 \
    --disk path=/var/lib/libvirt/images/guest1-rhel6-64.img,size=8 \
    --nonsparse --graphics spice \
    --vcpus=2 --ram=2048 \
    --location=http://example1.com/installation_tree/RHEL6.0-Server-x86_64/os \
    --nonetworks \
    --os-type=linux \
    --os-variant=rhel6
    --host-device=pci_0000_01_00_0
  3. インストールを完了する

    ゲストのインストールを完了します。PCI デバイスはゲストに接続する必要があります。

9.1.4. 割り当てられた PCI デバイスの取り外し

ホストの PCI デバイスがゲストマシンに割り当てられると、ホストがそのデバイスを使用できなくなります。このセクションを読んで、virsh または virt-manager を使用してデバイスをゲストからデタッチし、ホストで使用できるようにする方法を学習してください。

手順9.6 virsh を使用したゲストからの PCI デバイスの切り離し

  1. デバイスの取り外し

    次のコマンドを使用して、ゲストのXMLファイルからPCIデバイスを削除し、ゲストからPCIデバイスを切り離します。
    # virsh detach-device name_of_guest file.xml
  2. デバイスをホストに再接続します (オプション)。

    デバイスが managed モードにある場合は、この手順を省略します。デバイスは自動的にホストに戻ります。
    デバイスが managed モードを使用していない場合は、以下のコマンドを使用して PCI デバイスをホストマシンに再接続します。
    # virsh nodedev-reattach device
    たとえば、pci_0000_01_00_0 デバイスーをホストコンピューターに再接続するには、次のコマンドを実行します。
    virsh nodedev-reattach pci_0000_01_00_0
    これで、デバイスがホストで使用できるようになります。

手順9.7 virt-manager を使用したゲストからの PCI デバイスの切り離し

  1. 仮想ハードウェアの詳細画面を開きます。

    virt-manager で、デバイスを含む仮想マシンをダブルクリックします。Show virtual hardware details ボタンを選択すると、仮想ハードウェアの一覧が表示されます。

    図9.4 仮想ハードウェアの詳細ボタン

    The Show virtual hardware details button.
  2. デバイスを選択して削除する

    左側のパネルにある仮想デバイスの一覧から、取り外す PCI デバイスを選択します。

    図9.5 取り外す PCI デバイスの選択

    The PCI device details and the Remove button.
    Remove ボタンをクリックして確定します。これで、デバイスがホストで使用できるようになります。

9.1.5. PCI ブリッジの作成

PCI (Peripheral Component Interconnect) ブリッジは、ネットワークカード、モデム、サウンドカードなどのデバイスに接続するために使用されます。物理デバイスと同様に、仮想デバイスも PCI ブリッジに接続できます。以前は、31 個の PCI デバイスしかゲスト仮想マシンに追加できませんでした。現在、31 番目の PCI デバイスを追加すると、PCI ブリッジが 31 番目のスロットに自動的に配置され、追加した PCI デバイスを PCI ブリッジに移動します。各 PCI ブリッジには、31 の追加デバイス用に 31 個のスロットがあり、すべてがブリッジになることができます。この方法では、ゲスト仮想マシンで 900 を超えるデバイスを使用できます。
注記
ゲスト仮想マシンの実行中は、このアクションを実行できません。シャットダウンするゲスト仮想マシンに PCI デバイスを追加する必要があります。

9.1.6. PCI パススルー

<source> 要素で指定される PCI ネットワークデバイスは、ジェネリックデバイスパススルーを使用してゲストに直接割り当てられます。このデバイスの MAC アドレスは、最初にオプションで設定された値に設定され、そのデバイスの MAC アドレスがオプションで指定された virtualport 要素を使用して 802.1Qbh 対応スイッチに関連付けられます (<type='direct'> ネットワークデバイスの場合は、上記の仮想ポートの例を参照してください)。標準的なシングルポートの PCI イーサネットカードドライバー設計の制限により、この方法で割り当てることができるのは Single Root I/O Virtualization (SR-IOV) virtual function (VF) デバイスのみとなります。標準的なシングルポートの PCI または PCIe イーサネットカードをゲストに割り当てる場合は、従来の <hostdev> デバイス定義を使用します。
従来の/レガシー KVM デバイス割り当てではなく VFIO デバイス割り当てを使用するために (VFIO は UEFI セキュアブートと互換性のあるデバイス割り当ての新しい方法です)、<type='hostdev'> インターフェイスは name 属性を持つオプションのドライバーサブ要素を持つことができます vfio に設定します。従来の KVM デバイス割り当てを使用するには、名前を kvm に設定できます (または、現在、<driver ='kvm'> がデフォルトであるため、単に <driver> 要素を省略します)。
注記
ネットワークデバイスにおけるインテリジェントパススルーは、標準の <hostdev> デバイスの機能と非常に似ています。相違点は、パススルーデバイスに MAC アドレスと<virtualport>を指定できることです。これらの機能が必要ない場合、SR-IOV をサポートしない標準のシングルポート PCI、PCIe、または USB ネットワークカードを使用している場合 (したがって、ゲストドメインに割り当てられた後、リセット中に設定された MAC アドレスが失われます)、または 0.9.11 より前のバージョンの libvirt を使用している場合は、<interface type='hostdev'/> の代わりに、標準の <hostdev> を使用してデバイスをゲストに割り当てる必要があります。

図9.6 PCI デバイスの割り当ての XML 例


     <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>

9.1.7. SR-IOV デバイスを使用した PCI 割り当て (パススルー) の設定

このセクションは、SR-IOV デバイスのみを対象としています。SR-IOV ネットワークカードは、複数の Virtual Functions を提供します。各 VF は、PCI デバイスの割り当てを使用してゲスト仮想マシンに個別に割り当てることができます。割り当てが完了すると、各デバイスは完全な物理ネットワークデバイスとして機能します。これにより、多くのゲスト仮想マシンは、ホスト物理マシン上の単一のスロットのみを使用しながら、直接PCIデバイス割り当てのパフォーマンス上の利点を得ることができます。
これらの VF は従来の方法でゲスト仮想マシンに <hostdev> 要素を使用して割り当てることができますが、SR-IOV VF ネットワークデバイスには永続的な一意の MAC アドレスがないため、ホストの物理マシンを再起動するたびにゲスト仮想マシンのネットワーク設定を再設定する必要があります。これを解決するには、VF をホスト物理マシンに割り当てる前に MAC アドレスを設定する必要があり、ゲスト仮想マシンが起動するたびにこれを設定する必要があります。この MAC アドレスやその他のオプションを割り当てるには、手順9.8「SR-IOV で PCI デバイスを割り当てる MAC アドレス、vLAN、および仮想ポートの設定」の手順を参照してください。

手順9.8 SR-IOV で PCI デバイスを割り当てる MAC アドレス、vLAN、および仮想ポートの設定

<mac><vlan>、および <virtualport> 要素は <hostdev> の有効な子ではないため、<hostdev> 要素は MAC アドレス割り当て、vLAN タグ ID 割り当て、仮想ポート割り当てなどの機能固有の項目には使用できないことに注意してください。これらは <インターフェイス> で有効であるため、新しいインターフェイスタイプのサポートが追加されました (<interface type='hostdev'>)。この新しいインターフェイスデバイスタイプは、<インターフェイス><hostdev> のハイブリッドとして動作します。そのため、libvirt は、ゲスト仮想マシンに PCI デバイスを割り当てる前に、ゲスト仮想マシンの XML 設定ファイルに示されているネットワーク固有のハードウェア/スイッチを初期化します (MAC アドレスの設定、vLAN タグの設定、802.1Qbh スイッチへの関連付けなど)。vLAN タグの設定に関する詳細は、「vLAN タグの設定」 を参照してください。
  1. ゲスト仮想マシンをシャットダウンします。

    virsh shutdown コマンドの使用 (「ゲスト仮想マシンのシャットダウン」 を参照)、guestVM という名前のゲスト仮想マシンをシャットダウンします。
    # virsh shutdown guestVM
  2. 情報の収集

    <interface type='hostdev'> を使用するには、SR-IOV 対応のネットワークカード、Intel VT-d 拡張機能または AMD IOMMU 拡張機能に対応するホストの物理マシンハードウェアが必要で、割り当てる VF の PCI アドレスを把握している必要があります。
  3. 編集する XML ファイルを開く

    # virsh save-image-edit コマンドを実行し、XML ファイルを編集用に開きます (詳細は 「ドメイン XML 設定ファイルの編集」 を参照してください)。ゲスト仮想マシンを以前の実行状態に復元する必要があるため、この場合は --running が使用されます。この例の設定ファイルの名前は guestVM.xml です。ゲスト仮想マシンの名前は guestVM です。
     # virsh save-image-edit guestVM.xml --running 
    guestVM.xmlがデフォルトのエディターで開きます。
  4. XML ファイルの編集

    設定ファイル (guestVM.xml) を更新して、以下のような<devices> エントリーが表示されるようにします。

    図9.7 hostdev インターフェースタイプのサンプルドメイン 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>
    
    
    MAC アドレスを指定しないと、その他のタイプのインターフェースデバイスと同様に、MAC アドレスが自動的に生成されることに注意してください。また、<virtualport> 要素は、802.11Qgh ハードウェアスイッチ (802.11Qbg (別名VEPA)) は現在サポートされていません。
  5. ゲスト仮想マシンの再起動

    virsh start コマンドを実行して、最初の手順でシャットダウンしたゲスト仮想マシンを再起動します (例では、ゲスト仮想マシンのドメイン名として guestVM を使用します)。詳細は、「定義済みドメインの開始」 を参照してください。
     # virsh start guestVM 
    ゲスト仮想マシンは起動時に、設定された MAC アドレスを持つ、物理ホストマシンのアダプターにより提供されたネットワークデバイスを認識します。この MAC アドレスは、ゲスト仮想マシンやホストの物理マシンを再起動しても変更されません。

9.1.8. SR-IOV 仮想機能のプールからの PCI デバイス割り当ての設定

特定の Virtual Functions (VF) のPCIアドレスをゲストの設定にハードコーディングすることには、2つの重大な制限があります。
  • 指定の VF は、ゲスト仮想マシンが起動したときにいつでも利用できる必要があります。つまり、管理者は、各 VF を 1 つのゲスト仮想マシンに永続的に割り当てる必要があります (または、各ゲスト仮想マシンの設定ファイルを変更して、ゲスト仮想マシンが起動するたびに現在使用されていない VF の PCI アドレスを指定します)。
  • ゲスト仮想マシンを別のホスト物理マシンに移動する場合は、そのホスト物理マシンのハードウェアが PCI バス上の同じ場所にある必要があります (または、ゲスト仮想マシンの設定を起動前に変更する必要があります)。
SR-IOV デバイスのすべての VF を含むデバイスプールで libvirt ネットワークを作成することで、この両方の問題を回避できます。完了したら、ゲスト仮想マシンがこのネットワークを参照するように設定します。ゲストを起動するたびに、プールから 1 つの VF が割り当てられ、ゲスト仮想マシンに割り当てられます。ゲスト仮想マシンが停止すると、VF は別のゲスト仮想マシンが使用するためにプールに戻されます。

手順9.9 デバイスプールの作成

  1. ゲスト仮想マシンをシャットダウンします。

    virsh shutdown コマンドの使用 (「ゲスト仮想マシンのシャットダウン、再起動、および強制シャットダウン」 を参照)、guestVM という名前のゲスト仮想マシンをシャットダウンします。
    # virsh shutdown guestVM
  2. 設定ファイルの作成

    任意のエディターを使用して、/tmp ディレクトリーに XML ファイル (名前は passthrough.xml など) を作成します。pf dev='eth3' を、ご使用の SR-IOV デバイスの PF の netdev 名に置き換えてください。
    以下は、ホスト物理マシンの "eth3' にある physical function (PF) を持つ SR-IOV アダプターのすべての VF のプールを使用できるようにするネットワーク定義の例です。

    図9.8 サンプルのネットワーク定義ドメイン XML

          
    <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>
          
    
    
  3. 新しい XML ファイルの読み込み

    /tmp/passthrough.xml を、前の手順で作成した XML ファイルの名前と場所に置き換え、次のコマンドを実行します。
    # virsh net-define /tmp/passthrough.xml
  4. ゲストの再起動

    以下の passthrough.xml を、前の手順で作成した XML ファイルの名前に置き換えます。
     # virsh net-autostart passthrough # virsh net-start passthrough 
  5. ゲスト仮想マシンの再起動

    virsh start コマンドを実行して、最初の手順でシャットダウンしたゲスト仮想マシンを再起動します (例では、ゲスト仮想マシンのドメイン名として guestVM を使用します)。詳細は、「定義済みドメインの開始」 を参照してください。
     # virsh start guestVM 
  6. デバイスのパススルーの開始

    表示されているデバイスは1つだけですが、libvirtは、ゲスト仮想マシンが次のようなドメインXMLのインターフェース定義で初めて起動されたときに、そのPFに関連付けられているすべてのVFのリストを自動的に取得します。

    図9.9 インターフェースネットワーク定義のサンプルドメイン XML

             
    <interface type='network'>
       <source network='passthrough'>
    </interface>
          
    
    
  7. 検証

    ネットワークを使用する最初のゲストを起動したら、virsh net-dumpxml passthrough コマンドを実行し、これを確認できます。以下のような出力が得られます。

    図9.10 XML ダンプファイルの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>