第16章 ゲスト仮想マシンデバイスの設定
- エミュレートされたデバイス は、実際のハードウェアを模倣する純粋の仮想デバイスです。変換されていないゲストオペレーティングシステムは標準のインボックスドライバーを使ってこれらのデバイスと動作できるようになります。
- 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 デバイスは割り当てデバイスとしてのサポートが可能ですが、セキュリティーとシステム設定の競合により、極端な制限があります。
注記
allow_unsafe_interrupts
モジュールに対して vfio_iommu_type1
オプションを使用する 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
16.1. PCI デバイス
手順16.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 デバイス割り当てを使用できるようになりました。
手順16.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 デバイス割り当てを使用できるようになりました。
注記
16.1.1. virsh を使用した PCI デバイスの割り当て
pci_0000_01_00_0
の PCIe ネットワークコントローラーと guest1-rhel7-64 という名前の完全仮想化ゲストマシンを使用します。
手順16.3 virsh を使用した PCI デバイスのゲスト仮想マシンへの割り当て
デバイスを特定します。
最初に、仮想マシンへのデバイス割り当てに指定されているPCI デバイスを特定します。lspci
コマンドで利用可能な PCI デバイスを一覧表示します。lspci
の出力をgrep
を使って絞り込むことができます。この例では、以下の出力で強調表示されているイーサネットコントローラーを使用します。#
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
が使用する完全な識別子を見つける必要があります。これを実行するには、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
コマンドの出力を参照してください。# 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>
図16.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>
図16.2 PCI デバイスの追加
または、仮想マシン名とゲストの XML ファイルを指定してvirsh attach-device
を実行します。virsh attach-device guest1-rhel7-64
file.xml
注記
PCI デバイスには、デバイスファームウェアを配信するための オプション ROM または 拡張 ROM とも呼ばれる オプションの読み取り専用メモリー (ROM) モジュール、またはデバイスのプリブートドライバー (PXEなど) が含まれる場合があります。通常、このようなオプション ROM は、PCI デバイス割り当てを使用して物理 PCI デバイスを仮想マシンに接続すると、仮想化環境でも機能します。ただし、場合によっては、オプション ROM が不要になり、仮想マシンの起動が遅くなる可能性があります。または、デバイスが提供するプリブートドライバーが仮想化と互換性がなく、ゲスト OS が起動できなくなる場合があります。そのような場合、Red Hat は仮想マシンのオプション ROM をマスクすることを推奨します。これには、以下を行います。- ホスト上で、割り当てるデバイスに、拡張 ROM のベースアドレスレジスター (BAR) があることを確認します。これを行うには、デバイスに
lspci -v
コマンドを使用し、以下を含む行の出力を確認します。拡張 ROM
- <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 デバイスの割り当て
virt-manager
ツールを使ってゲスト仮想マシンに追加することができます。以下の手順では、Gigabit イーサネットコントローラーをゲスト仮想マシンに追加します。
手順16.4 virt-manager を使用した PCI デバイスのゲスト仮想マシンへの割り当て
ハードウェア設定を開きます。
ゲスト仮想マシンを開き、ボタンをクリックして新規デバイスを仮想マシンに追加します。図16.3 仮想マシンのハードウェア情報ウィンドウ
PCI デバイスを選択します。
左側の PCI Host Deviceハードウェア リストから を選択します。未使用の PCI デバイスを選択します。別のゲストが使用中の PCI デバイスを選択するとエラーが発生するので注意してください。以下の例では、予備のオーディオコントローラーが使用されます。完了 をクリックしてセットアップを終了します。図16.4 新しい仮想ハードウェアを追加ウィザード
新規デバイスを追加します。
セットアップが完了し、これでゲスト仮想マシンは 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_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>
図16.6 PCI デバイスファイルの内容
注記
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
モードにある場合は (managed='yes'
ドメイン XML ファイル の パラメーターを使って設定)、必要に応じてゲストマシンに接続し、ゲストマシンから切り離し、再びホストマシンに接続することができます。PCI デバイスが managed
モードにない場合は、virsh
または virt-manager を使って PCI デバイスをゲストマシンから切り離し、再び接続することができます。
手順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 で、デバイスを含む仮想マシンをダブルクリックします。仮想マシンの情報を表示 ボタンを選択し、仮想ハードウェアの一覧を表示します。図16.7 仮想ハードウェア詳細ボタン
デバイスを選択し、削除します。
左側パネルの仮想デバイスの一覧より、接続を解除する PCI デバイスを選択します。図16.8 接続解除する PCI デバイスの選択
16.1.5. PCI ブリッジ
16.1.6. PCI デバイス割り当ての制限
allow_unsafe_interrupts
モジュールに対して vfio_iommu_type1
オプションを使用する 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
このページには機械翻訳が使用されている場合があります (詳細はこちら)。