14.4. コマンドラインを使用した仮想マシンへの PCI デバイスの接続
仮想マシン (VM) を使用する場合、ホストシステムに接続されているストレージコントローラーやネットワークコントローラーなどの PCI デバイスにアクセスして制御できます。このような場合、ホストシステムはデバイスの制御を仮想マシンに渡します。これは、PCI デバイス割り当て、または PCI パススルーとも呼ばれます。
ホストに接続された PCI ハードウェアデバイスを仮想マシン (VM) で使用するには、ホストからデバイスの接続を解除し、仮想マシンに接続します。
この手順では、一般的な PCI デバイスの割り当て方法を説明します。特定の種類の PCI デバイスを割り当てる手順については、該当する手順を参照してください。
前提条件
ホストが IBM Z アーキテクチャーを使用している場合は、
vfioカーネルモジュールをホストにロードする必要があります。確認するには、次のコマンドを使用します。# lsmod | grep vfio出力に次のモジュールが含まれている必要があります。
-
vfio_pci -
vfio_pci_core -
vfio_iommu_type1
-
手順
使用するデバイスの 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: 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: nvmePCI デバイスを接続する仮想マシンの 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)