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 デバイスを割り当てる手順については、次の手順を参照してください。

  1. 使用するデバイスの 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
  2. PCI デバイスを割り当てる仮想マシンの XML 設定を開きます。

    # virsh edit vm-name
  3. 以下の <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>
  4. オプション: 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 がこれらの値を自動的に設定します。

  5. XML 設定を保存します。
  6. 仮想マシンが実行中の場合はシャットダウンします。

    # virsh shutdown vm-name

検証

  1. 仮想マシンを起動し、ゲストオペレーティングシステムにログインします。
  2. ゲストオペレーティングシステムで、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 コンソールの仮想マシンプラグインがシステムにインストールされている

手順

  1. RHEL 8 Web コンソールにログインします。

    詳細は、Web コンソールへのログイン を参照してください。

  2. Virtual Machines インターフェイスで、ホストデバイスを接続する仮想マシンをクリックします。

    新しいページが開き、選択した仮想マシンに関する基本情報を含む Overview セクションと、仮想マシンのグラフィカルインターフェイスにアクセスするための Console セクションが表示されます。

  3. Host devices までスクロールします。

    Host devices セクションには、仮想マシンに接続されているデバイスに関する情報と、デバイスを 追加 または 削除 するためのオプションが表示されます。

    選択した仮想マシンのホストデバイスセクションを表示しているイメージ。
  4. ホストデバイスの追加 をクリックします。

    ホストデバイスの追加 ダイアログが表示されます。

    ホストデバイスの追加ダイアログボックスを表示しているイメージ。
  5. VM に接続するデバイスを選択します。
  6. 追加 をクリックします。

    選択したデバイスが仮想マシンに接続されます。

検証

  • VM を実行し、デバイスが ホストデバイス セクションに表示されるかどうかを確認します。

11.7.3. コマンドラインを使用した仮想マシンからの PCI デバイスの削除

仮想マシン (VM) から PCI デバイスを削除するには、仮想マシンの XML 設定からデバイス情報を削除します。

手順

  1. 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>
    [...]
  2. --hostdev オプションとデバイスアドレスを指定した virsh detach-device コマンドを使用します。

    たとえば、次のコマンドは、前のステップで見つかったデバイスを永続的に削除します。

    # virt detach-device <VM-name> --hostdev 0000:65:00.0 --config
    Domain 'VM-name' defined successfully.
    注記

    実行中の仮想マシンから PCI デバイスを削除するには、前のコマンドに --live 引数を追加します。

  3. オプション: PCI デバイスをホストに再割り当てします。たとえば、次のコマンドは、前のステップで仮想マシンから削除したデバイスを再割り当てします。

    # virsh nodedev-reattach pci_0000_65_00_0
    Device pci_0000_65_00_0 re-attached

検証

  1. 仮想マシンの XML 設定を再度表示し、デバイスの <hostdev> セクションが表示されなくなっていることを確認します。

    # virsh dumpxml <VM-name>

関連情報

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>

手順

  1. Virtual Machines インターフェイスで、ホストデバイスを削除する仮想マシンをクリックします。

    新しいページが開き、選択した仮想マシンに関する基本情報を含む Overview セクションと、仮想マシンのグラフィカルインターフェイスにアクセスするための Console セクションが表示されます。

  2. Host devices までスクロールします。

    Host devices セクションには、仮想マシンに接続されているデバイスに関する情報と、デバイスを 追加 または 削除 するためのオプションが表示されます。

    選択した VM のホストデバイスセクションを表示するイメージ。
  3. VM から削除するデバイスの横にある 削除 ボタンをクリックします。

    デバイスの削除確認ダイアログが表示されます。

    接続されている仮想デバイスを削除するオプションを表示するイメージ。
  4. 削除 をクリックします。

    デバイスが VM から削除されます。

トラブルシューティング

  • ホストデバイスを取り外すことで、仮想マシンが起動できなくなる場合は、virsh define ユーティリティーを使用して、以前にバックアップした XML 設定ファイルを再ロードして XML 設定を復元します。

    # virsh define testguest1.xml
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.