第16章 ゲスト仮想マシンのデバイス設定
- エミュレートされたデバイス は、実際のハードウェアを模倣する純粋な仮想デバイスであり、未変更のゲストオペレーティングシステムが標準のインボックスドライバーを使用して動作できるようにします。
- Virtio デバイス (paravirtualized とも呼ばれます) は、純粋に仮想マシンで最適に機能するように設計された仮想デバイスです。Virtio デバイスはエミュレートされたデバイスに似ていますが、Linux 以外の仮想マシンには、デフォルトで必要なドライバーが含まれません。Virtual Machine Manager (virt-manager) や Red Hat Virtualization Hypervisor などの仮想化管理ソフトウェアは、サポートされている Linux 以外のゲストオペレーティングシステム用にこれらのドライバーを自動的にインストールします。Red Hat Enterprise Linux 7 は、最大 216 の virtio デバイスに対応します。詳細は、5章KVM 準仮想化 (virtio) ドライバー. を参照してください。
- 割り当てられたデバイス は、仮想マシンに公開される物理デバイスです。この方法は passthrough としても知られています。デバイスの割り当てにより、仮想マシンはさまざまなタスクで PCI デバイスに排他的にアクセスできるようになり、PCI デバイスがゲストオペレーティングシステムに物理的に接続されているかのように見え、動作します。Red Hat Enterprise Linux 7 は、仮想マシンごとに最大 32 の割り当てられたデバイスをサポートします。デバイスの割り当ては、一部のグラフィックデバイス を含む PCIe デバイスでサポートされています。パラレル PCI デバイスは、割り当てられたデバイスとしてサポートされる場合がありますが、セキュリティーとシステム設定の競合のために厳しい制限があります。
vfio_iommu_type1
モジュールへの allow_unsafe_interrupts
を使用した 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
16.1. PCI デバイス
手順16.1 PCI デバイス割り当てのための Intel システムの準備
Intel VT-d 仕様を有効にする
Intel VT-d 仕様では、物理デバイスを仮想マシンに直接割り当てるハードウェアサポートが提供されます。この仕様は、Red Hat Enterprise Linux で PCI デバイスの割り当てを使用するために必要です。Intel VT-d 仕様は、BIOS で有効にする必要があります。システムの製造元によっては、この仕様をデフォルトで無効にしている場合があります。これらの仕様を表示するのに使用される用語はメーカーにより異なります。適切な用語は、システムの製造元のドキュメントを参照してください。カーネルで 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 iommu=pt"
設定ファイルの再生成
以下を実行して /etc/grub2.cfg を再生成します。grub2-mkconfig -o /etc/grub2.cfg
UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg
であることに注意してください。使用準備完了
システムを再起動して、変更を有効にします。これで、システムで PCI デバイスの割り当てが可能になります。
手順16.2 PCI デバイス割り当て用の AMD システムの準備
AMD IOMMU 仕様を有効にする
Red Hat Enterprise Linux で PCI デバイスの割り当てを使用するには、AMD IOMMU の仕様が必要です。この仕様は、BIOS で有効にする必要があります。システムの製造元によっては、この仕様をデフォルトで無効にしている場合があります。IOMMU カーネルサポートの有効化
システムの起動時に AMD IOMMU 仕様が有効になるように、/etc/sysconfig/grub
の GRUB_CMDLINX_LINUX 行の末尾に引用符で囲ってiommu=pt
を追加します。設定ファイルの再生成
以下を実行して /etc/grub2.cfg を再生成します。grub2-mkconfig -o /etc/grub2.cfg
UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg
であることに注意してください。使用準備完了
システムを再起動して、変更を有効にします。これで、システムで PCI デバイスの割り当てが可能になります。
16.1.1. virsh を使用した PCI デバイスの割り当て
pci_0000_01_00_0
、および完全に仮想化されたゲストマシン guest1-rhel7-64 を持つ PCIe ネットワークコントローラーを使用します。
手順16.3 virsh を使用した PCI デバイスのゲスト仮想マシンへの割り当て
デバイスの識別
まず、仮想マシンへのデバイス割り当てに指定されている 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 デバイス番号を記録します。これは別の手順で必要になります。デバイス情報の確認
ドメイン、バス、および機能の情報は、virsh nodedev-dumpxml コマンドの出力から取得できます。図16.1 ダンプの内容
# 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
必要な設定の詳細を決定する
設定ファイルに必要な値は、virsh nodedev-dumpxml pci_0000_00_19_0 コマンドの出力を参照してください。この例のデバイスは、bus = 0、slot = 25、および function = 0 の値を持ちます。10 進数の設定では、この 3 つの値が使用されます。bus='0' slot='25' function='0'
設定の詳細の追加
virsh edit を実行し、仮想マシン名を指定し、<devices>
セクションにデバイスエントリーを追加して、PCI デバイスをゲスト仮想マシンに割り当てます。以下に例を示します。# virsh edit guest1-rhel7-64
図16.2 PCI デバイスの追加
<devices> [...] <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0' bus='0' slot='25' function='0'/> </source> </hostdev> [...] </devices>
または、virsh attach-device を実行して、仮想マシンの名前とゲストの XML ファイルを指定します。virsh attach-device guest1-rhel7-64
file.xml
注記PCI デバイスには、デバイスファームウェアまたはデバイス用の起動前ドライバー (PXE など) を提供するための オプションの読み取り専用メモリー (ROM) モジュール (オプション ROM または 拡張 ROM としても知られている) が含まれます。通常、このオプション ROM は、PCI デバイスの割り当てを使用して物理 PCI デバイスを仮想マシンに接続する際に、仮想環境でも機能します。ただし、オプション ROM が必要ない場合があります。これにより、仮想マシンの起動に時間がかかったり、デバイスが提供する起動前ドライバーが仮想化と互換性がなくなり、ゲスト OS の起動に失敗する可能性があります。この場合、Red Hat は、仮想マシンからオプション ROM をマスクすることを推奨します。これを行うには、以下を行います。- ホストで、割り当てるデバイスに拡張 ROM ベースアドレスレジスタ (BAR) があることを確認します。これを行うには、デバイスに対して lspci -v コマンドを使用し、以下を含む行の出力を確認します。
Expansion ROM at
- <rom bar='off'/> 要素を、ゲストの XML 設定の <hostdev> 要素の子として追加します。
<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0' bus='0' slot='25' function='0'/> </source> <rom bar='off'/> </hostdev>
仮想マシンの起動
# virsh start guest1-rhel7-64
16.1.2. virt-manager を使用した PCI デバイスの割り当て
手順16.4 virt-manager を使用した PCI デバイスのゲスト仮想マシンへの割り当て
ハードウェア設定を開く
ゲスト仮想マシンを開き、をクリックして、仮想マシンに新しいデバイスを追加します。図16.3 仮想マシンのハードウェア情報ウィンドウ
PCI デバイスの選択
左側の Hardware リストから PCI Host Device を選択します。未使用の PCI デバイスを選択します。現在、別のゲストが使用している PCI デバイスを選択すると、エラーが発生することに注意してください。この例では、予備のオーディオコントローラーが使用されています。Finish を選択して設定を完了します。図16.4 Add new virtual hardware ウィザード
新しいデバイスの追加
セットアップが完了し、ゲスト仮想マシンが PCI デバイスに直接アクセスできるようになりました。図16.5 仮想マシンのハードウェア情報ウィンドウ
16.1.3. virt-install を使用した PCI デバイスの割り当て
--host-device
パラメーターを使用します。
手順16.5 virt-install を使用した、仮想マシンへの PCI デバイスの割り当て
デバイスの識別
ゲスト仮想マシンにデバイス割り当てに指定されている 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
図16.6 PCI デバイスファイルの内容
<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 デバイスの割り当て」 の 注記 を参照してください。デバイスの追加
virsh nodedev コマンドから出力された PCI 識別子を、--host-device
パラメーターの値として使用します。virt-install \ --name=guest1-rhel7-64 \ --disk path=/var/lib/libvirt/images/guest1-rhel7-64.img,size=8 \ --vcpus=2 --ram=2048 \ --location=http://example1.com/installation_tree/RHEL7.0-Server-x86_64/os \ --nonetworks \ --os-type=linux \ --os-variant=rhel7 --host-device=pci_0000_01_00_0
インストールを完了する
ゲストのインストールを完了します。PCI デバイスはゲストに接続する必要があります。
16.1.4. 割り当てられた PCI デバイスの取り外し
managed
モード (ドメインの XML ファイル の managed='yes'
パラメーターを使用して設定) の場合は、ゲストマシンに接続し、ゲストマシンの接続を解除し、必要に応じてホストマシンに再度接続します。PCI デバイスが managed
モードではない場合は、ゲストマシンから PCI デバイスの接続を解除し、virsh または virt-manager を使用して再度接続できます。
手順16.6 virsh を使用したゲストからの PCI デバイスの切り離し
デバイスの取り外し
次のコマンドを使用して、ゲストの XML ファイルから PCI デバイスを削除し、ゲストから PCI デバイスを切り離します。# virsh detach-device name_of_guest file.xml
デバイスをホストに再接続します (オプション)。
デバイスがmanaged
モードの場合は、この手順を省略します。デバイスは自動的にホストに戻ります。デバイスがmanaged
モードを使用していない場合は、次のコマンドを使用して、PCI デバイスをホストマシンに再接続します。# virsh nodedev-reattach device
たとえば、pci_0000_01_00_0
デバイスーをホストコンピューターに再接続するには、次のコマンドを実行します。# virsh nodedev-reattach pci_0000_01_00_0
これで、デバイスがホストで使用できるようになります。
手順16.7 virt-manager を使用したゲストからの PCI デバイスの切り離し
仮想ハードウェアの詳細画面を開きます。
virt-manager で、デバイスを含む仮想マシンをダブルクリックします。Show virtual hardware details ボタンを選択すると、仮想ハードウェアのリストが表示されます。図16.7 仮想ハードウェアの詳細ボタン
デバイスを選択して削除する
左側のパネルにある仮想デバイスのリストから、取り外す PCI デバイスを選択します。図16.8 取り外す PCI デバイスの選択
16.1.5. PCI ブリッジ
16.1.6. PCI デバイスの割り当ての制限
vfio_iommu_type1
モジュールへの allow_unsafe_interrupts
オプションを使用して、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