11.7. 仮想マシンでの PCI デバイスの管理
仮想マシン (VM) を使用する場合、ホストシステムに割り当てられているストレージコントローラーやネットワークコントローラーなどの PCI デバイスにアクセスして制御できます。このような場合、ホストシステムはデバイスの制御を仮想マシンに渡します。これは、PCI デバイス割り当て、または PCI パススルー とも呼ばれます。
11.7.1. 仮想マシンへの PCI デバイスの割り当て
仮想マシン (VM) でホストに割り当てられた PCI ハードウェアデバイスを使用するには、ホストからデバイスの割り当てを解除し、仮想マシンに割り当てます。これは PCI パススルー とも呼ばれます。
前提条件
ホストが IBM Z アーキテクチャーを使用している場合は、
vfio
カーネルモジュールをホストにロードする必要があります。確認するには、次のコマンドを使用します。# lsmod | grep vfio
出力に次のモジュールが含まれている必要があります。
-
vfio_pci
-
vfio_pci_core
-
vfio_iommu_type1
-
次の手順では、一般的な PCI デバイスの割り当てについて説明します。特定のタイプの PCI デバイスを割り当てる手順については、次の手順を参照してください。
使用するデバイスの PCI アドレス識別子を取得します。たとえば、ホストに割り当てられている NVME ディスクを使用する場合、このディスクは次の出力でデバイス
0000:65:00.0
として表示されます。# lspci -nkD 0000:00:00.0 0600: 8086:a708 (rev 01) Subsystem: 17aa:230e Kernel driver in use: igen6_edac Kernel modules: igen6_edac 0000:00:02.0 0300: 8086:a7a1 (rev 04) Subsystem: 17aa:230e Kernel driver in use: i915 Kernel modules: i915, xe 0000:00:04.0 1180: 8086:a71d (rev 01) Subsystem: 17aa:230e Kernel driver in use: proc_thermal_pci Kernel modules: processor_thermal_device_pci 0000:00:05.0 0604: 8086:a74d (rev 01) Subsystem: 17aa:230e Kernel driver in use: pcieport 0000:00:07.0 0604: 8086:a76e (rev 01) Subsystem: 17aa:230e Kernel driver in use: pcieport 0000:65:00.0 0108: 144d:a822 (rev 01) DeviceName: PCIe SSD in Slot 0 Bay 2 Subsystem: 1028:1fd9 Kernel driver in use: nvme Kernel modules: nvme 0000:6a:00.0 0108: 1179:0110 (rev 01) DeviceName: PCIe SSD in Slot 11 Bay 2 Subsystem: 1028:1ffb Kernel driver in use: nvme Kernel modules: nvme
PCI デバイスを割り当てる仮想マシンの XML 設定を開きます。
# virsh edit vm-name
以下の
<hostdev>
設定を XML ファイルの<devices>
セクションに追加します。address
行の値を、デバイスの PCI アドレスに置き換えます。必要に応じて、デバイスが仮想マシン内で使用する PCI アドレスを変更するには、<address type="pci">
行に別のアドレスを設定できます。たとえば、ホスト上のデバイスアドレスが
0000:65:00.0
で、ゲストでは0000:02:00.0
を使用する場合は、次の設定を使用します。<hostdev mode="subsystem" type="pci" managed="yes"> <driver name="vfio"/> <source> <address domain="0x0000" bus="0x65" slot="0x00" function="0x0"/> </source> <address type="pci" domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> </hostdev>
オプション: IBM Z ホストでは、ゲストオペレーティングシステムが PCI デバイスを検出する方法を変更できます。これを行うには、
<address>
要素に<zpci>
サブ要素を追加します。<zpci>
行では、uid
値とfid
値を調整できます。これにより、ゲストオペレーティングシステムのデバイスの PCI アドレスと機能 ID が変更されます。<hostdev mode="subsystem" type="pci" managed="yes"> <driver name="vfio"/> <source> <address domain="0x0000" bus="0x65" slot="0x00" function="0x0"/> </source> <address type="pci" domain='0x0000' bus='0x02' slot='0x00' function='0x0'> <zpci uid="0x0008" fid="0x001807"/> </address> </hostdev>
この例では、以下が適用されます。
-
uid="0x0008"
は、仮想マシンのデバイスのドメイン PCI アドレスを0008:00:00.0
に設定します。 fid="0x001807"
は、デバイスのスロット値を0x001807
に設定します。これにより、仮想マシンのファイルシステムのデバイス設定が/sys/bus/pci/slots/00001087/address
に保存されます。これらの値が指定されていない場合は、
libvirt
がこれらの値を自動的に設定します。
-
- XML 設定を保存します。
仮想マシンが実行中の場合はシャットダウンします。
# virsh shutdown vm-name
検証
- 仮想マシンを起動し、ゲストオペレーティングシステムにログインします。
ゲストオペレーティングシステムで、PCI デバイスがリストされていることを確認します。
たとえば、ゲストデバイスのアドレスを
0000:02:00.0
に設定した場合は、次のコマンドを使用します。# lspci -nkD | grep 0000:02:00.0 0000:02:00.0 8086:9a09 (rev 01)
11.7.2. Web コンソールを使用した仮想マシンへのデバイスの割り当て
仮想マシン (VM) に特定の機能を追加するには、Web コンソールを使用してホストデバイスを仮想マシンに接続します。
複数のホストデバイスを同時に接続することはできません。一度に接続できるデバイスは 1 つだけです。
詳細は、RHEL 8 Known Issues を参照してください。
前提条件
- RHEL 8 Web コンソールがインストールされている。
- cockpit サービスが有効になっている。
ユーザーアカウントが Web コンソールにログインできる。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
PCI デバイスを接続している場合は、
hostdev
要素のmanaged
属性のステータスが、yes
に設定されていることを確認してください。注記PCI デバイスを仮想マシンに接続するときは、
hostdev
要素のmanaged
属性を省略したり、no
に設定したりしないでください。設定している場合は、PCI デバイスを仮想マシンに渡すときに、PCI デバイスをホストから自動的に切り離すことができなくなります。また、仮想マシンをオフにしたときに、ホストに自動的に再接続することもできません。その結果、ホストが応答しなくなったり、予期せずシャットダウンしたりする可能性があります。
managed
属性のステータスは、仮想マシンの XML 設定で確認できます。次の例では、example-VM-1
仮想マシンの XML 設定を開きます。# virsh edit example-VM-1
- 仮想マシンからの重要なデータのバックアップを作成している。
オプション: 仮想マシンの XML 設定をバックアップします。たとえば、
example-VM-1
仮想マシンをバックアップするには、次のようにします。# virsh dumpxml example-VM-1 > example-VM-1.xml
- Web コンソールの仮想マシンプラグインがシステムにインストールされている。
手順
RHEL 8 Web コンソールにログインします。
詳細は、Web コンソールへのログイン を参照してください。
新しいページが開き、選択した仮想マシンに関する基本情報を含む Overview セクションと、仮想マシンのグラフィカルインターフェイスにアクセスするための Console セクションが表示されます。
Host devices セクションには、仮想マシンに接続されているデバイスに関する情報と、デバイスを 追加 または 削除 するためのオプションが表示されます。
ホストデバイスの追加 ダイアログが表示されます。
- VM に接続するデバイスを選択します。
選択したデバイスが仮想マシンに接続されます。
検証
- VM を実行し、デバイスが ホストデバイス セクションに表示されるかどうかを確認します。
11.7.3. コマンドラインを使用した仮想マシンからの PCI デバイスの削除
仮想マシン (VM) から PCI デバイスを削除するには、仮想マシンの XML 設定からデバイス情報を削除します。
手順
PCI デバイスが割り当てられている仮想マシンの XML 設定で、デバイスの設定がある
<hostdev>
セクションの<address domain>
行を見つけます。# virsh dumpxml <VM-name> [...] <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x65' slot='0x00' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> </hostdev> [...]
--hostdev
オプションとデバイスアドレスを指定したvirsh detach-device
コマンドを使用します。たとえば、次のコマンドは、前のステップで見つかったデバイスを永続的に削除します。
# virt detach-device <VM-name> --hostdev 0000:65:00.0 --config Domain 'VM-name' defined successfully.
注記実行中の仮想マシンから PCI デバイスを削除するには、前のコマンドに
--live
引数を追加します。オプション: PCI デバイスをホストに再割り当てします。たとえば、次のコマンドは、前のステップで仮想マシンから削除したデバイスを再割り当てします。
# virsh nodedev-reattach pci_0000_65_00_0 Device pci_0000_65_00_0 re-attached
検証
仮想マシンの XML 設定を再度表示し、デバイスの
<hostdev>
セクションが表示されなくなっていることを確認します。# virsh dumpxml <VM-name>
関連情報
-
システム上の
virsh (1)
man ページ - 仮想マシンへのデバイスの割り当て
11.7.4. Web コンソールを使用した仮想マシンからのデバイスの削除
リソースを解放するか、仮想マシンの機能を変更するか、その両方を行うには、Web コンソールを使用して仮想マシンを変更し、不要になったホストデバイスを削除します。
デバイスと USB デバイスのバス番号の相関が正しくないことが原因で、接続された USB ホストデバイスを Web コンソールで削除することができない場合があります。
詳細は、RHEL 8 Known Issues を参照してください。
回避策として、virsh ユーティリティーを使用して、仮想マシンの XML 設定から USB デバイスの <hostdev> 部分を削除します。次の例では、example-VM-1
仮想マシンの XML 設定を開きます。
# virsh edit <example-VM-1>
前提条件
- RHEL 8 Web コンソールがインストールされている。
- cockpit サービスが有効になっている。
ユーザーアカウントが Web コンソールにログインできる。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
- Web コンソールの仮想マシンプラグインがシステムにインストールされている。
オプション:
virsh dumpxml example-VM-1
を使用して仮想マシンの XML 設定をバックアップし、出力をファイルに送信します。たとえば、以下は、testguest1 仮想マシンの設定のバックアップファイルtestguest1.xml
を作成します。# virsh dumpxml testguest1 > testguest1.xml # cat testguest1.xml <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <name>testguest1</name> <uuid>ede29304-fe0c-4ca4-abcd-d246481acd18</uuid> [...] </domain>
手順
新しいページが開き、選択した仮想マシンに関する基本情報を含む Overview セクションと、仮想マシンのグラフィカルインターフェイスにアクセスするための Console セクションが表示されます。
Host devices セクションには、仮想マシンに接続されているデバイスに関する情報と、デバイスを 追加 または 削除 するためのオプションが表示されます。
VM から削除するデバイスの横にある
ボタンをクリックします。デバイスの削除確認ダイアログが表示されます。
デバイスが VM から削除されます。
トラブルシューティング
ホストデバイスを取り外すことで、仮想マシンが起動できなくなる場合は、
virsh define
ユーティリティーを使用して、以前にバックアップした XML 設定ファイルを再ロードして XML 設定を復元します。# virsh define testguest1.xml