第17章 ゲスト仮想マシンデバイスの設定
- エミュレートされたデバイス は、実際のハードウェアを模倣する純粋の仮想デバイスです。変換されていないゲストオペレーティングシステムは標準のインボックスドライバーを使ってこれらのデバイスと動作できるようになります。
- Virtio デバイス (準仮想化 とも呼ばれる) は、仮想マシン内で最適に動作するように設計された仮想デバイスです。Virtio デバイスは、エミュレートされたデバイスと似ていますが、Linux 以外の仮想マシンにはこれらのデバイスが必要とするドライバーがデフォルトで含まれていません。仮想マシンマネージャー (virt-manager) や Red Hat Virtualization Hypervisor といった仮想化管理ソフトウェアは、対応する Linux 以外のゲストオペレーティングシステム用にこれらのドライバーを自動的にインストールします。Red Hat Enterprise Linux 7 は最高 216 の virtio デバイスに対応します。詳細については、「5章KVM 準仮想化 (virtio) ドライバー」を参照してください。
- 割り当てデバイス は、仮想マシンに公開されている物理デバイスです。この方法は、パススルー とも呼ばれます。デバイス割り当てにより、仮想マシンによる PCI デバイスへの排他的アクセスが可能となり、PCI デバイスを使用した各種のタスクを実行できるようになります。また、PCI デバイスがゲストオペレーティングシステムに物理的に接続されているかのように表示させ、動作させることができます。Red Hat Enterprise Linux 7 は、1 仮想マシンあたり最高 32 の割り当てデバイスに対応します。デバイス割り当ては、グラフィックデバイスの選択 を含めて PCIe デバイス上でサポートされています。パラレル PCI デバイスは割り当てデバイスとしてのサポートが可能ですが、セキュリティーとシステム設定の競合により、極端な制限があります。
注記
vfio_iommu_type1 モジュールに対して allow_unsafe_interrupts オプションを使用する PCI デバイス割り当てを許可することを選択できます。これは、以下を含む .conf ファイル (例: local.conf) を /etc/modprobe.d に追加することで永続的に実行できます。
options vfio_iommu_type1 allow_unsafe_interrupts=1または sysfs エントリーを動的に使用して同じことを実行します。
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts
17.1. PCI デバイス
手順17.1 Intel システムでの PCI デバイス割り当ての準備
Intel VT-d 仕様を有効にします。
Intel VT-d 仕様は、物理デバイスを仮想マシンに直接割り当てるためのハードウェアサポートを提供します。この仕様は、Red Hat Enterprise Linux で PCI デバイス割り当てを使用するために必要なものです。Intel VT-d 仕様は、BIOS で有効にされている必要があります。システムメーカーの中には、この仕様をデフォルトで無効にしているところもあります。この仕様に言及するために使用される用語はメーカーによって異なります。それぞれの該当する用語については、システムメーカーの資料を参照してください。カーネルで Intel VT-d をアクティブにします。
カーネルで Intel VT-d をアクティブにするには、intel_iommu=onとiommu=ptパラメーターを/etc/sysconfig/grubファイルの GRUB_CMDLINX_LINUX 行の終わりの引用符の内側に追加します。以下は、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 デバイス割り当てを使用できるようになりました。
手順17.2 AMD システムでの PCI デバイス割り当ての準備
AMD IOMMU 仕様を有効にします。
AMD IOMMU 仕様は、Red Hat Enterprise Linux で PCI デバイス割り当てを使用するために必要なものです。この仕様は、BIOS で有効にされている必要があります。システムメーカーの中には、この仕様をデフォルトで無効にしているところもあります。IOMMU カーネルサポートを有効にします。
amd_iommu=ptを/etc/sysconfig/grubの GRUB_CMDLINX_LINUX 行の末尾の引用符の内側に追加し、AMD IOMMU 仕様が起動時に有効になるようにします。設定ファイルを再生成します。
以下を実行して /etc/grub2.cfg を再生成します。grub2-mkconfig -o /etc/grub2.cfg
UEFI ベースのホストの場合、ターゲットファイルは/etc/grub2-efi.cfgであることに注意してください。これで使用できるようになります。
システムを再起動して、変更を有効にします。これでシステムで PCI デバイス割り当てを使用できるようになりました。
注記
17.1.1. virsh を使用した PCI デバイスの割り当て
pci_0000_01_00_0 の PCIe ネットワークコントローラーと guest1-rhel7-64 という名前の完全仮想化ゲストマシンを使用します。
手順17.3 virsh を使用した PCI デバイスのゲスト仮想マシンへの割り当て
デバイスを特定します。
最初に、仮想マシンへのデバイス割り当てに指定されているPCI デバイスを特定します。lspciコマンドで利用可能な PCI デバイスを一覧表示します。lspciの出力をgrepを使って絞り込むことができます。この例では、以下の出力で強調表示されているイーサネットコントローラーを使用します。#
lspci | grep Ethernet00: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が使用する完全な識別子を見つける必要があります。これを実行するには、virsh nodedev-listコマンドを使用して、ホストマシンに接続されている特定の種類 (pci) のデバイスをすべて一覧表示します。次に出力を参照し、使用するデバイスの短い識別子にマップされている文字列を探します。この例では、短い識別子00:19.0を持つイーサネットコントローラーにマップされている文字列が強調表示されています。完全な識別子では、:と.文字がアンダースコアに置き換えられていることに注意してください。#
virsh nodedev-list --cap pcipci_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_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>図17.1 内容のダンプ
注記
IOMMU グループは、IOMMU から見たデバイスの可視性と分離度に基づいて決定されます。それぞれの IOMMU グループには、1 つ以上のデバイスが含まれる可能性があります。複数のデバイスが表示される場合、すべてのエンドポイントが、ゲストに割り当てられるIOMMU グループ内のすべてのデバイスに対して要求される必要があります。これは、追加のエンドポイントをゲストに割り当てるか、またはvirsh nodedev-detachを使用してエンドポイントをホストドライバーから分離するかのいずれかの方法で実行できます。単一グループに含まれるデバイスは、複数のゲスト間で分割したり、ホストとゲストの間で分割したりすることができないことがあります。PCIe ルートポート、スイッチポート、およびブリッジなどエンドポイント以外のデバイスはホストドライバーから分離することはできません。これらはエンドポイントの割り当てを妨げることはありません。IOMMU グループ内のデバイスは、virsh nodedev-dumpxml出力の iommuGroup セクションを使用して判別できます。グループの各メンバーは別個の「アドレス」フィールドで指定されます。この情報は、以下を使用して 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 進法の設定では、これらの値を使用します。bus='0' slot='25' function='0'
設定の詳細を追加します。
仮想マシン名を指定してvirsh editを実行し、<source>セクションにデバイスエントリーを追加して PCI デバイスをゲスト仮想マシンに割り当てます。#
virsh edit guest1-rhel7-64<hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0' bus='0' slot='25' function='0'/> </source> </hostdev>図17.2 PCI デバイスの追加
または、仮想マシン名とゲストの XML ファイルを指定してvirsh attach-deviceを実行します。virsh attach-device guest1-rhel7-64
file.xml仮想マシンを起動します。
#
virsh start guest1-rhel7-64
17.1.2. virt-manager を使用した PCI デバイスの割り当て
virt-manager ツールを使ってゲスト仮想マシンに追加することができます。以下の手順では、Gigabit イーサネットコントローラーをゲスト仮想マシンに追加します。
手順17.4 virt-manager を使用した PCI デバイスのゲスト仮想マシンへの割り当て
ハードウェア設定を開きます。
ゲスト仮想マシンを開き、 ボタンをクリックして新規デバイスを仮想マシンに追加します。
図17.3 仮想マシンのハードウェア情報ウィンドウ
PCI デバイスを選択します。
左側の ハードウェア リストから PCI ホストデバイス を選択します。未使用の PCI デバイスを選択します。別のゲストが使用中の PCI デバイスを選択するとエラーが発生するので注意してください。以下の例では、予備のオーディオコントローラーが使用されます。完了 をクリックしてセットアップを終了します。
図17.4 新しい仮想ハードウェアを追加ウィザード
新規デバイスを追加します。
セットアップが完了し、これでゲスト仮想マシンは PCI デバイスに直接アクセスできます。
図17.5 仮想マシンのハードウェア情報ウィンドウ
注記
17.1.3. virt-install を使用した PCI デバイスの割り当て
--host-device パラメーターを使用します。
手順17.5 virt-install を使用したゲスト仮想マシンへのPCI デバイス割り当て
デバイスを特定します。
ゲスト仮想マシンへのデバイス割り当てに指定されているPCI デバイスを特定します。#
lspci | grep Ethernet00: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 pcipci_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_0PCI デバイス番号は他のステップで必要になるので、書き留めます。ドメイン、バスおよび各種機能についての情報は、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>図17.6 PCI デバイスファイルの内容
注記
IOMMU グループに複数のエンドポイントがあり、それらのすべてがゲストに割り当てられている訳ではない場合、ゲストを起動する前に以下のコマンドを実行して、他のエンドポイントをホストから手動で切り離す必要があります。$
virsh nodedev-detach pci_0000_00_19_1IOMMU グループの詳細は、「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 デバイスはゲストに接続されています。
17.1.4. 割り当てた PCI デバイスの接続解除
managed モードにある場合は (ドメイン XML ファイル の managed='yes' パラメーターを使って設定)、必要に応じてゲストマシンに接続し、ゲストマシンから切り離し、再びホストマシンに接続することができます。PCI デバイスが managed モードにない場合は、virsh または virt-manager を使って PCI デバイスをゲストマシンから切り離し、再び接続することができます。
手順17.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これでこのデバイスはホストで使用できます。
手順17.7 virt-manager を使用した PCI デバイスのゲストからの接続解除
仮想ハードウェアの詳細画面を開きます。
virt-manager で、デバイスを含む仮想マシンをダブルクリックします。仮想マシンの情報を表示 ボタンを選択し、仮想ハードウェアの一覧を表示します。
図17.7 仮想マシンの情報を表示ボタン
デバイスを選択し、削除します。
左側パネルの仮想デバイスの一覧より、接続を解除する PCI デバイスを選択します。
図17.8 接続解除する PCI デバイスの選択
ボタンをクリックします。これでデバイスがホストで使用可能になります。
17.1.5. PCI ブリッジの作成
17.1.5.1. PCI ブリッジのホットプラグ/アンホットプラグサポート
- virtio-net-pci
- virtio-scsi-pci
- e1000
- rtl8139
- virtio-serial-pci
- virtio-balloon-pci
17.1.6. PCI デバイス割り当ての制限
vfio_iommu_type1 モジュールに対して allow_unsafe_interrupts オプションを使用する PCI デバイス割り当て許可を選択できます。これは、以下を含む .conf ファイル (例: local.conf) を /etc/modprobe.d に追加することで永続的に実行できます。
options vfio_iommu_type1 allow_unsafe_interrupts=1または sysfs エントリーを動的に使用して同じことを実行します。
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts

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.