KVMのネットワーク構成

KVM仮想ネットワークを構成および管理するには、次のトピックを参照してください:

概要: 仮想ネットワーク

KVM環境内のネットワークは、KVMゲストに仮想ネットワーク・インタフェース・カード(vNIC)を作成することによって実現されます。vNICは、次のいずれかの方法でホスト・システム独自のネットワーク・インフラストラクチャにマップされます。

  • ホストで実行されている仮想ネットワークへの接続。
  • ホスト上の物理インタフェースを直接使用。
  • PCIeデバイスでのシングル・ルートI/O仮想化(SR-IOV)機能の使用。
  • vNICがホスト上の物理ネットワーク・インタフェースを共有できるようにするネットワーク・ブリッジを使用する。

vNICは、多くの場合、KVMを最初に作成するときに定義されますが、必要に応じてlibvirt APIを使用してvNICを追加または削除できます。ホット・プラグを処理できるため、これらのアクションは実行中の仮想マシンで大幅な中断なしで実行できます。

仮想ネットワーク・タイプ:

KVM環境内に設定できる様々なタイプの仮想ネットワークの概要を次に示します:

  • NATを使用したデフォルトの仮想ネットワーク – KVMネットワークには、(1)ホスト・システム上に直接構成されている物理コンポーネント、(2) libvirt内のKVM構成、および(3)実行中のゲストOS内のネットワーク構成が含まれるため、複雑になることがあります。そのため、多くの開発環境とテスト環境では、libvirtによって提供される仮想ネットワークを使用するようにvNICを構成するだけで十分な場合があります。デフォルトでは、libvirt仮想ネットワークはネットワーク・アドレス変換(NAT)を使用して、KVMゲストが外部ネットワーク・リソースにアクセスできるようにします。このアプローチは構成が簡単であるとみなされ、多くの場合、すでにホスト・システムに構成されている同様のネットワーク・アクセスを円滑にします。
  • ブリッジ・ネットワークとマッピングされた仮想インタフェース – 特定のサブネットワークにVMが属している必要がある場合は、ブリッジ・ネットワークを使用できます。ネットワーク・ブリッジは、ホストの物理インタフェースにマップされて共有される仮想インタフェースを使用します。このアプローチでは、KVMからのネットワーク・トラフィックは、ホスト・システムと同じ物理ネットワークにある独立したシステムから送信されているかように動作します。使用するツールによっては、KVM用に構成する前に、ホスト・ネットワーク構成を手動で変更する必要がある場合があります。
  • ホスト物理ネットワークインタフェース – VM用のネットワークは、ホスト・システムの物理インタフェースを直接使用するように構成することもできます。この構成は、vNICが物理ネットワークに直接接続されているかのように動作するという点で、ブリッジ・ネットワーク・インタフェースの使用と同様のネットワーク動作を提供できます。直接接続では、物理ネットワーク・インタフェースを拡張するためにmacvtapドライバが使用される傾向があります。これにより、多くの機能が提供されることに加えて、ブリッジ・ネットワークと同様に動作しながら構成と維持が簡単でパフォーマンスの向上も得られる可能性がある仮想ブリッジも提供されます。
  • 直接および共有のPCIeパススルー – 別のKVMネットワークの方法は、PCIeパススルーを構成することです。この方法では、PCIeインタフェースによってKVMのネットワーク機能がサポートされます。この方法を使用すると、管理者は直接または共有のPCIeパススルー・ネットワークを構成できます。直接PCIeパススルーは、ホスト・システム上のPCIeデバイスの排他的使用を単一のKVMゲストに割り当てます。共有PCIeパススルーは、SR-IOV (シングル・ルートI/O仮想化)対応のPCIeデバイスの共有使用を複数のKVMゲストに割り当てます。これらのどちらの構成方法でも、ネットワーク使用のためにKVMゲストにPCIeデバイスを接続する前に、ホスト・システムでハードウェアの設定および構成を行う必要があります。

仮想ネットワークを構成するためのKVMツール

ネットワーク構成がより複雑になる可能性がある場合は、Oracle Linux Virtualization Managerを使用することをお薦めします。このガイドで説明するCLIネットワーク構成および操作の基本的な目的は、最も基本的なKVMネットワークのデプロイメント・シナリオを容易にすることです。

Oracle Linux Virtualization Managerのより複雑なネットワーク構成については、Oracle Linux Virtualization Managerのドキュメントを参照してください。

コマンドの使用方法: 仮想ネットワークの管理

KVM環境で仮想ネットワークを管理するには、virsh net-*コマンドを使用します。次に例を示します:

  • virsh net-list all – ホスト・システムに構成されているすべての仮想ネットワークをリストします。
    virsh net-list --all
    出力例:
     Name                 State      Autostart     Persistent
    ----------------------------------------------------------
     default              active     yes           yes      
  • virsh net-info – ネットワークに関する情報を表示します。
    virsh net-info default
    出力例:
    Name:           default
    UUID:           16318035-eed4-45b6-99f8-02f1ed0661d9
    Active:         yes
    Persistent:     yes
    Autostart:      yes
    Bridge:         virbr0
    説明:
    • 名前 = 割り当てられたネットワーク名。
    • UUID = 割り当てられたネットワーク識別子。
    • virbr0 = 仮想ネットワーク・ブリッジ。

      ノート:

      virbr0を従来のブリッジ・ネットワークと混同しないでください。この場合、仮想ブリッジは物理インタフェースに接続されません。仮想ネットワーク・ブリッジは、NATおよびIP転送に依存して、VMを物理ネットワークに接続します。
  • virsh net-dumpxml – ネットワークの完全な構成を表示します。
    virsh net-dumpxml default
    出力例:
    <network>
      <name>default</name>
      <uuid>16318035-eed4-45b6-99f8-02f1ed0661d9</uuid>
      <forward mode='nat'>
        <nat>
          <port start='1024' end='65535'/>
        </nat>
      </forward>
      <bridge name='virbr0' stp='on' delay='0'/>
      <mac address='52:54:00:82:75:1d'/>
      <ip address='192.168.122.1' netmask='255.255.255.0'>
        <dhcp>
          <range start='192.168.122.2' end='192.168.122.254'/>
        </dhcp>
      </ip>
    </network>

    この例では、仮想ネットワークはvirbr0というネットワーク・ブリッジを使用しており、従来のブリッジ・ネットワークと混同しないようにしています。仮想ブリッジは、物理インタフェースに接続されておらず、NATおよびIP転送に依存して、VMを物理ネットワークに接続しています。libvirtは、DHCPを使用してVMへのIPアドレスの割当ても処理しています。通常、デフォルト・ネットワークは192.168.122.1/24の範囲です。

  • virsh net-start – 以前に定義した非アクティブな仮想ネットワークを起動します。
     sudo virsh net-start [--network] <network-identifier>
    ここで、network-identifierはネットワーク名またはネットワークUUIDを表します。
  • virsh net-destroy – アクティブなネットワークを停止し、それによって使用されていたすべてのリソースの割当てを解除します。たとえば、該当するdnsmasqプロセスを停止し、ブリッジを解放します。
    sudo virsh net-start [--network] <network-identifier>

libvirtのネットワーク管理コマンドの詳細なリストは、libvirt仮想ネットワークのサイト(https://wiki.libvirt.org/VirtualNetworking.html#virsh-xml-commands)の仮想ネットワークの基本的なコマンドラインの使用方法に関する項を参照してください。

コマンドの使用方法: vNICの追加または削除

既存のKVMに新しいvNICを追加するには、virsh attach-interfaceコマンドを使用します。このコマンドは、KVMで使用可能なネットワーク・タイプのいずれかを使用するKVMに、vNICを作成するために使用できます。

virsh attach-interface --domain guest --type network --source default --config

このコマンドで、次のパラメータを指定する必要があります。

  • --domain – KVM名、IDまたはUUID。
  • --type – vNICが使用するネットワークのタイプ。

    使用可能なオプションは次のとおりです:

    • network: NATを使用するlibvirt仮想ネットワークの場合

    • bridge: ホスト上のブリッジ・デバイスの場合

    • direct: ホストのネットワーク・インタフェースまたはブリッジのいずれかへの直接マッピングの場合

    • hostdev: ホスト上のPCIデバイスを使用したパススルー接続の場合。

  • --source – 指定したネットワーク・タイプに使用されるソース。

    これらの値は、タイプによって異なります:

    • networkの場合は、仮想ネットワークの名前を指定します
    • bridgeの場合は、ブリッジ・デバイスの名前を指定します
    • direct接続の場合は、ホストのインタフェースまたはブリッジの名前を指定します
    • hostdev接続の場合は、domain:bus:slot.functionとしてフォーマットされたホストのインタフェースのPCIアドレスを指定します。
  • --config – ゲストVMの格納されているXML構成を変更し、ゲストの起動時に有効になります。
  • --live – ゲストVMは稼働している必要があり、変更は即時に行われ、vNICがホット・プラグされます。
  • --current – 現在のゲストVMに影響します。

他のネットワーク・タイプを使用する場合は、MACアドレスの設定やターゲットmacvtapデバイスの構成など、このインタフェースをさらにカスタマイズするための追加のオプションが使用できます。--modelオプションを使用すると、VMに提供されるネットワーク・インタフェースのモデルを変更することもできます。デフォルトでは、virtioモデルが使用されますが、e1000rtl8139などの他のモデルを使用できます。詳細は、virsh help attach-interfaceを実行するか、virsh(1)マニュアル・ページを参照してください。

VMからvNICを削除するには、virsh detach-interfaceコマンドを使用します。次に例を示します:

virsh detach-interface --domain guest --type network --mac 52:54:00:41:6a:65 --config

domainまたはVM名とtypeは、必須パラメータです。VMに複数のvNICがアタッチされている場合は、macパラメータを指定して、削除するvNICのMACアドレスを提示する必要があります。この値は、VMにアタッチされているvNICをリストして取得できます。たとえば、次のコマンドを実行します。

virsh domiflist guest

次のような出力が表示されます。

Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      network    default    virtio      52:54:00:8c:d2:44
vnet1      network    default    virtio      52:54:00:41:6a:65

ブリッジ・ネットワーク: 設定

CLIを使用して、管理者は直接仮想ネットワーク・インタフェース・カード(vNICs)を使用してKVMブリッジ・ネットワークを設定できます。詳細は、次のトピックを参照してください:

設定のガイドライン: ブリッジ・ネットワーク

Linuxブリッジを使用した従来のネットワーク・ブリッジは、virsh iface-bridgeコマンドを使用して構成できます。このコマンドを使用すると、管理者はホスト・システムにブリッジを作成し、それに物理インタフェースを追加できます。たとえば、次のコマンド構文では、enp0s31f6という名前のイーサネット・ポートを持つvmbridge1という名前のブリッジが作成されます:

virsh iface-bridge vmbridge1 enp0s31f6

ブリッジ・ネットワーク・インタフェースを設定したら、管理者はvirsh attach-interfaceコマンドを使用してそれをVMに接続できます。

従来のLinuxブリッジ・ネットワークの複雑さ

KVMゲストに従来のLinuxブリッジ・ネットワークを使用する場合は、次のことを考慮してください:

  • ワイヤレス・インターフェイスでのソフトウェア・ブリッジの設定は、802.11フレームで使用可能なアドレス数のために複雑と見なされます。
  • ソフトウェア・ブリッジを処理するコードが複雑になるため、スループットの低下、レイテンシの増大および構成の複雑さを招くことがあります。
MacVTapドライバを使用したブリッジ・ネットワークの利点

ブリッジ・ネットワークの主な利点は、ホスト・システムがブリッジ・ネットワークを使用するように構成されたゲストとネットワーク・スタックを通じて直接通信できるようになることです。

従来のLinuxブリッジの使用に関連する問題のほとんどは、仮想化されたブリッジ・ネットワークを簡素化するmacvtapドライバを使用することで簡単に解消できます。KVMのほとんどのブリッジ・ネットワーク構成では、パフォーマンスが向上して構成が容易になるため、このアプローチをお薦めします。macvtapドライバは、KVM XML構成ファイル内のネットワーク・タイプがdirectに設定されている場合に使用します。次に例を示します:
<interface type="direct">
  <mac address="#:##:##:##:#:##"/>   
  <source dev="kvm-host-network-interface- name" mode="bridge"/> 
  <model type="virtio"/> 
  <driver name="vhost"/> 
</interface>
説明:
  • mac address="#:##:##:##:#:##" – MACアドレス・フィールドはオプションです。省略すると、libvirtデーモンによって一意のアドレスが生成されます。
  • interface type="direct" – MacVTapで使用されます。既存のKVMホスト・デバイスへの直接マッピングを指定します。
  • source dev="KVM-host-device" mode="bridge" – KVMゲストのMacVTapインタフェースで使用されるKVMホスト・ネットワーク・インタフェース名を指定します。modeキーワードは、使用するMacVTapモードを定義します。
MacVTAPドライバのモード

macvtapドライバは、既存のネットワーク・インタフェースを拡張するためにtun/tap ioctlインタフェース・モデルに従うエンドポイント・デバイスを作成します。KVMは、各種のネットワーク機能をサポートする物理ネットワーク・インタフェースに直接接続するために、このエンドポイント・デバイスを使用できます。このような機能は、インタフェースに別のモードを設定することで制御できます。使用可能なモードは次のとおりです。

  • vepa (仮想イーサネット・ポート・アグリゲータ)はデフォルトのモードです。このモードでは、vNICのすべてのデータが物理インタフェースからネットワーク・スイッチに強制的に送信されます。スイッチがヘアピン・モードをサポートしている場合、同じ物理インタフェースに接続されている別のvNICsがそのスイッチを介して通信できます。今日の多くのスイッチはヘアピン・モードをサポートしていません。つまり、VEPAモードで実行されている直接接続インタフェースを使用する仮想マシンは通信できませんが、スイッチを使用して外部ネットワークに接続できます。

  • bridgeモードでは、すべてのvNICが相互に直接接続されるため、同じ物理インタフェース上の仮想マシン間のトラフィックはスイッチに送信されず、直接送信されます。bridgeモード・オプションは、ヘアピン・モードをサポートしないスイッチや、VM間の通信に最大限のパフォーマンスが必要な場合に最も役立ちます。bridgeモードは、従来のソフトウェア・ブリッジとは異なり、ホストがこのインタフェースを使用してKVMと直接通信できない点に注意してください。

  • privateモードでは、ヘアピン・モード・オプションをサポートするスイッチがない場合、VEPAモードのvNICと同様に動作します。ただし、スイッチがヘアピン・モードをサポートしている場合でも、同じ物理インタフェースに接続されている2つのVMは相互に通信できません。このオプションでは、限られたユースケースがサポートされます。

  • passthroughモードは、物理インタフェース・デバイスまたはSR-IOV仮想機能(VF)をvNICに直接接続しますが、移行機能は失われません。すべてのパケットは、構成されたネットワーク・デバイスに直接送信されます。passthroughモードで構成すると、ネットワーク・デバイスとVMの間に1対1のマッピングが存在します。この構成では、ネットワーク・デバイスをVM間で共有できないためです。

ノート:

virsh attach-interfaceコマンドには、macvtapドライバを使用するダイレクト・タイプのインタフェースを接続するときに使用可能な様々なモードを指定するオプションがなく、デフォルトでVEPAモードに設定されます。グラフィカルなvirt-managerユーティリティでは、macvtapを使用したブリッジ・ネットワークの設定が簡単になり、様々なモードごとのオプションが用意されています。

作成: ブリッジ・ネットワーク接続

MacVTapドライバを使用して、仮想ブリッジ・ネットワーク・インタフェースを作成し、KVMゲストに接続する方法について説明します。
前提条件
  • root権限。
  • ホスト・システム上の既存のKVMゲスト。
  • イーサネット・デバイスをブリッジのポートとして使用するには、物理イーサネット・デバイスまたは仮想イーサネット・デバイスをホスト・システムにインストールする必要があります。

手順

既存のホストKVMインスタンスでmacvtapドライバを使用してブリッジ・ネットワークを構成するには、次の手順に従います。

  1. virsh iface-bridgeコマンドを使用して、ブリッジ・デバイスを作成し、ホスト上の物理ネットワーク・デバイス・インタフェースに接続します。
    例:
    sudo virsh iface-bridge [bridge_name] [enp0s31f6]
    説明:
    • bridge_name – ブリッジに割り当てられる名前。
    • enp0s31f6 – この例で使用されているイーサネット・ポート名の物理インタフェース。
  2. virsh attach-interfaceコマンドを使用して、KVMインスタンスにブリッジ・インタフェースを接続します。
    例:
    sudo virsh attach-interface --domain My_KVM_Guest_Name --type direct --source wlp4s0 --config
    説明:
    • My_KVM_Guest_Name – KVMインスタンスの名前。
    • wlp4s0 --config – この例で使用されているソース・インタフェース名。

    virsh-attachコマンドの使用の詳細は、「コマンドの使用方法: vNICの追加または削除」を参照してください。

  3. KVMインスタンスを停止します。詳細は、「KVM: インスタンスの停止」を参照してください
  4. KVM XML構成を編集して、ソース・インタフェースmodebridgeに設定します。次に例を示します:
    1. virsh editを使用して、ファイルを編集します:
      sudo virsh edit [My_KVM_Guest_Name]

      ノート:

      virsh editコマンドでは、$EDITORシェル・パラメータで指定されたテキスト・エディタでXMLファイルが開きます。デフォルトでは、viエディタが設定されます。
    2. ソース・インタフェース・モードをbridgeに設定します。

      ノート:

      デフォルトでは、ソース・インタフェース・モードはvepaに設定されます。

      ソース・インタフェース・モードをbridgeに設定する方法の詳細は、「設定のガイドライン: ブリッジ・ネットワーク」macvtapドライバの例を参照してください。

  5. KVM XML構成の変更を保存します。
  6. virsh undefineおよびvirsh defineコマンドを使用して、KVM XML構成の変更をlibvirtデーモンに通知します。
    例:
    sudo virsh undefine [My_KVM_Guest_Name]
    sudo virsh define [My_KVM_Guest_Name-libvirt-xml-file]
    virsh undefineコマンドは既存のKVM構成を削除し、virsh defineはXMLファイルの更新済構成に置き換えます。
  7. KVMインスタンスを起動します。詳細は、「KVM: インスタンスの起動」を参照してください。
    直接ネットワーク・インタフェースはbridge modeで接続され、KVMインスタンスの起動時に自動的に起動します。

スループットの向上のための結合インタフェース

複数のサービスを同時に提供する複数のVMを同時実行するホストの場合、ネットワーク・スループットを向上させるために結合インタフェースを使用することが一般的です。この場合、物理サーバーにホストされているアプリケーションに対して十分な帯域幅を単一の物理インタフェースが提供している可能性があり、単一の物理インタフェースを共有して複数のVMが実行されるときにネットワーク・トラフィックが増加すると、ネットワークのパフォーマンスに悪影響を与える可能性があります。結合インタフェースを使用することで、KVMネットワークのスループットが大幅に向上し、ネットワーク・ボンディングで使用可能な高可用性機能を活用できます。

VMが使用する物理ネットワーク・インタフェースはVMではなくホストにあるため、スループットの向上や高可用性のためには、いずれかの形式の結合ネットワークをホスト・システムに構成する必要があります。このプロセスでは、ホスト上でネットワーク結合を構成してから、ネットワーク・ブリッジなどの仮想ネットワーク・インタフェースをホスト上の結合ネットワークに直接接続します。

VMの高可用性ネットワークを実現するには、まずホスト・システムにネットワーク結合を構成する必要があります。ネットワーク・ボンディングの設定方法の詳細は、次のいずれかのガイドのネットワーク・ボンディングの使用を参照してください:

結合を構成したら、ネットワーク・ブリッジの構成時に結合されたインタフェースを使用するように仮想マシン・ネットワークを構成できます。これは、(1)インタフェース・タイプのbridgeモード、または(2)macvtapドライバのbridgeモードを使用するように構成されたdirectインタフェースのいずれかを使用して実行できます。結合インタフェースは、仮想ネットワーク・インタフェースの構成時に、物理ネットワーク・インタフェースのかわりに使用できます。

PCIeパススルー: 設定

この項では、KVMゲストへのPCIeパススルーを構成するための次の方法について説明します。
  • libvirtを使用してKVMゲストにPCIeパススルーを直接送信します。このメソッドは、ホスト・システム上のPCIeデバイスの排他的使用を単一のKVMゲストに割り当てる場合に使用します。この方法では、libvirtデバイス割当てを使用して、単一のKVMゲストへの直接I/Oパスを構成します。

    ノート:

    直接PCIeパススルーを使用すると、ホスト・システムのCPUリソースの消費量が増加し、ホスト・システムの全体的なパフォーマンスが低下する可能性があります。

    この方法を使用したPCIeパススルーの構成の詳細は、「作成: 直接PCIeパススルー接続」を参照してください。

    .
  • SR-IOVを使用したKVMゲストへの共有PCIeパススルー。この方法を使用して、SR-IOV (単一ルートI/O仮想化)対応のPCIeデバイスの共有使用を複数のKVMゲストに割り当てます。この方法では、SR-IOVデバイス割当てを使用して、複数のKVMゲスト間で共有されるPCIeリソースを構成します。SR-IOVデバイスの割当ては、パケットレートが高いワークロードや待機時間が短いワークロードで役立ちます。SR-IOV PCIeパススルーの詳細は、次のトピックを参照してください。

作成: 直接PCIeパススルー接続

次の情報では、単一のKVMゲストへの直接PCIe接続を作成する方法について説明します。

排他的PCIeデバイス制御

KVMゲストは、ホスト・システムで使用可能なPCIeデバイスに直接アクセスし、その機能を排他的に制御するように構成できます。virshコマンドを使用して、KVMゲストにホストPCIeデバイスを割り当てます。PCIeデバイスがゲストに割り当てられると、ゲストはデバイスに排他的にアクセスでき、システム上のホストまたは他のゲストが使用できなくなります。

ノート:

次の手順では、SR-IOVイーサネット仮想デバイスのパススルーを有効にする構成については説明しません。SR-IOV対応PCIeデバイスにパススルーを構成する方法については、「作成: SR-IOV PCIeパススルー接続」を参照してください。

手順

ホストPCIeデバイスをKVMゲストに直接割り当てるには、次のステップを実行します。

  1. KVMゲストを停止します。
    sudo virsh shutdown GuestName
  2. 接続されているホストPCIeデバイスとその割当て済IDを識別するには、次のようにlspciコマンドを使用します。
    lspci -D|awk '{gsub("[:\\.]","_",$0); sub("^","pci_",$0); print;}' 
    説明:
    • lspciは、すべてのPCIeデバイスをリストします。
    • -Dオプションは、各デバイスのPCIeドメイン番号を一覧表示します。
    • awkは、デバイスIDをvirshコマンドで使用可能な形式に操作するスクリプト言語です。
    たとえば、出力は次のようになります。
    pci_0000_00_00_0 Host bridge_ Intel Corporation 11th Gen Core Processor Host Bridge/DRAM Registers (rev 01)
    pci_0000_00_02_0 VGA compatible controller_ Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
    pci_0000_00_04_0 Signal processing controller_ Intel Corporation TigerLake-LP Dynamic Tuning Processor Participant (rev 01)
    pci_0000_00_06_0 PCI bridge_ Intel Corporation 11th Gen Core Processor PCI Express Controller (rev 01)
    pci_0000_00_07_0 PCI bridge_ Intel Corporation Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #0 (rev 01)
    ...
  3. パススルー用に構成するデバイスを選択し、デバイスIDを含む変数を作成します。次に例を示します:
    pci_dev="pci_0000_00_07_0" 
  4. virsh nodedev-dumpxmlコマンドを使用して、PCIeデバイス・ドメイン、バス、スロットおよびファンクションのパラメータを使用可能な変数に計算します。次に例を示します:
    domain=$(virsh nodedev-dumpxml $pci_dev --xpath '//domain/text()') 
    bus=$(virsh nodedev-dumpxml $pci_dev --xpath '//bus/text()') 
    slot=$(virsh nodedev-dumpxml $pci_dev --xpath '//slot/text()') 
    function=$(virsh nodedev-dumpxml $pci_dev --xpath '//function/text()')
  5. パススルーに必要なデバイス・ソース・ドメイン・アドレスを識別するには、print関数を使用して、PCIeドメイン、バス、スロットおよび関数変数を16進値に変換します。
    次に例を示します:
    printf "<address domain='0x%x' bus='0x%x' slot='0x%x' function='0x%x'/>\n" $domain $bus $slot $function
  6. PCIeデバイスをKVMゲストに割り当てます。
    virsh editを実行し、KVMゲスト名を指定して、<source>セクションにPCIeデバイス・ドメイン・アドレスを追加します。

    次に例を示します:

    # virsh edit GuestName
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
         <address domain='0x0' bus='0x0' slot='0x14' function='0x3'/>
      </source>
    </hostdev>

    ノート:

    管理対象および管理対象外のlibvirtは、PCIeデバイスを処理するための2つの管理モード(managed='yes' (デフォルト)またはmanaged='no")を認識します。モードがmanaged='yes'に設定されている場合、libvirtは、既存のドライバからのデバイスのアンバインドを処理し、デバイスをリセットしてから、ドメインを起動する前にvfio-pciドライバにバインドします。ドメインが停止された場合、またはデバイスがドメインから削除された場合、libvirtはドメインをvfio-pciドライバからバインド解除し、元のドライバに再バインドします。モードがmanaged='no'に設定されている場合、PCIeデバイスをホストから手動でデタッチしてから、vfio-pciドライバに手動でアタッチする必要があります。
    たとえば、デタッチするには:
    sudo virsh nodedev-dettach pci_0000_device_ID_#
    再アタッチするには:
    sudo virsh nodedev-reattach pci_0000_device_ID_#
    または、Cockpitを使用してホスト・デバイスを接続および削除できます。詳細は、Oracle Linux: Cockpit Webコンソールの使用ガイドのVMホスト・デバイスの追加または削除を参照してください。
  7. ホスト・システムで、仮想PCIeパススルーに対してゲスト管理を有効にします。
    sudo setsebool -P virt_use_sysfs 1
  8. KVMゲストを起動します。
    sudo virsh start GuestName

    PCIeデバイスはKVMゲストに正常に割り当てられ、ゲストOSはその機能を排他的に制御できるようになりました。

設定のガイドライン: SR-IOV PCIeパススルー

単一ルートI/O仮想化(SR-IOV)仕様は、複数のKVMゲスト間で単一のPCIeリソースを共有できるデバイス割当ての標準です。SR-IOVは、物理PCIeリソースを、通常のPCIeデバイスとして検出、管理および構成できる仮想PCIe関数にパーティション化する機能を提供します。

SR-IOVを使用した PCIeデバイスのパススルー構成には、次の機能が含まれます。
  • 物理機能(PF)物理機能(PF)は、物理PCIeアダプタデバイスを指します。各物理PCIeアダプタは、最大8つの関数を持つことができます(ただし、最も一般的なケースは1つの関数です)。各関数には完全な構成領域があり、ソフトウェアによって個別のPCIeデバイスとして認識されます。PCIe関数の構成領域にSR-IOVサポートが含まれている場合、その関数はSR-IOV物理機能とみなされます。SR-IOV物理機能を使用すると、仮想化を有効にして仮想機能(VF)を公開するためのSR-IOV設定を管理および構成できます。
  • 仮想機能(VF)。仮想機能(VF)は、PCIeデバイスの仮想化インスタンスを指します。各VFは、データの入出力を行うように設計されています。VFは物理機能(PF)から導出されます。たとえば、各VFはベースとなるPFに接続され、各PFはゼロ(0)から1 (1)以上のVFを持つことができます。VFはほとんどの設定をPFから継承するため、構成スペースが短縮されます。
SR-IOVの利点
PCIeパススルーにSR-IOVを使用する主な利点は次のとおりです。
  • PCIeリソースの効率的な共有を可能にすることで、パフォーマンスと容量を最適化します。
  • 1つのPFに関連付けられた数百のVFを作成することで、ハードウェア・コストを削減します。
  • SR-IOV機能をオンにするように設計されたレジスタによるPFによる動的な制御により、時間のかかる統合が不要になります。
  • 仮想ゲスト環境からハードウェアへの直接アクセスにより、パフォーマンスが向上します。

作成: SR-IOV PCIeパススルー接続

次の情報では、KVMゲストのSR-IOV PCIeパススルー接続を作成する方法について説明します。
SR-IOVの利点と機能

シングル・ルートI/O仮想化(SR-IOV)は、高パフォーマンスの仮想化ソリューションとして動作するOracle Linux機能をさらに拡張します。SR-IOVを使用すると、Oracle LinuxはSR-IOV機能を持つPCIデバイスから仮想リソースを割り当てることができます。仮想機能(VF)と呼ばれるこれらの仮想リソースは、KVMゲストへの新しい割当て可能なPCIeデバイスとして表示されます。

SR-IOVは、物理PCIデバイスをゲストに割り当てるのと同じ機能を提供します。ただし、SR-IOVを使用するための主な利点には、I/Oパフォーマンスの最適化(ゲストOSがデバイスハードウェアと直接やり取りするとき)、およびハードウェアコストの削減(周辺デバイスの大規模なシステム構成を管理する必要性の排除)があります。

手順

KVMゲストへのSR-IOV PCIeパススルーを構成するには、次のステップを実行します。

  1. Intel VT-dまたはAMD IOMMUオプションが、BIOS/UEFIレベルのシステム・ファームウェアで有効になっているかどうかを確認します。詳細は、該当するOracleサーバー・モデルのドキュメントを参照してください。
  2. Intel VT-dまたはAMD IOMMUオプションがカーネルでアクティブ化されているかどうかを確認します。これらのカーネルオプションが有効になっていない場合は、次を実行します。
    • Intel仮想化の場合、/etc/default/grub.cfgファイルのGRUB_CMDLINX_LINUX行の末尾にintel_iommu=onおよび iommu=ptパラメータを追加します。

      ノート:

      /etc/sysconfig/grub/etc/default/grubの間にシンボリックリンクが存在するため、/etc/sysconfig/grub.cfgファイルを構成することもできます。
    • AMD仮想化の場合、/etc/default/grub.cfgファイルのGRUB_CMDLINX_LINUX行の最後にintel_iommu=onおよびiommu=pt パラメータを追加します。
      grub.cfgファイルを再生成してから、システムを再起動して変更を有効にします。
      grub2-mkconfig -o /etc/grub.cfg
  3. lspciコマンドを使用して、SR-IOV対応のPCIeデバイスがホスト・システムで検出されているかどうかを確認します。次に例を示します:
    lspci -D|awk '{gsub("[:\\.]","_",$0); sub("^","pci_",$0); print;}' 
    説明:
    • lspciは、すべてのPCIeデバイスをリストします。
    • -Dオプションは、各デバイスのPCIeドメイン番号を一覧表示します。
    • awkは、デバイスIDをvirshコマンドで使用可能な形式に操作するスクリプト言語です。
    たとえば、出力は次のようになります。
    pci_0000_00_00_0 Host bridge_ Intel Corporation 11th Gen Core Processor Host Bridge/DRAM Registers (rev 01)
    pci_0000_00_02_0 VGA compatible controller_ Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
    pci_0000_00_04_0 Signal processing controller_ Intel Corporation TigerLake-LP Dynamic Tuning Processor Participant (rev 01)
    pci_0000_00_06_0 PCI bridge_ Intel Corporation 11th Gen Core Processor PCI Express Controller (rev 01)
    pci_0000_00_07_0 PCI bridge_ Intel Corporation Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #0 (rev 01)
    ...

    ノート:

    SR-IOV互換のPCIeデバイスのリストについては、「SR-IOV対応PCIeデバイス」を参照してください。
  4. デバイス・ドライバ・カーネル・モジュールをロードします。

    SR-IOV PCIeデバイスが検出されると、ドライバ・カーネル・モジュールが自動的にロードされます。

    必要に応じて、modprobeコマンドを使用してモジュールにパラメータを渡すことができます。次の出力例は、82576ネットワーク・インタフェース・カードのigbドライバを示しています。
    sudo modprobe igb [<option>=<VAL1>,<VAL2>,]
    sudo lsmod |grep igb
    igb    82576  0
    dca    6708    1 igb
  5. 次の手順を実行して、仮想機能(VF)をアクティブにします。
    • カーネル・ドライバによって提供される最大VFを設定するには、次の手順を実行します。
      1. カーネル・ドライバによって提供される最大VFを設定するには、まずデバイス・ドライバ・カーネル・モジュールを削除する必要があります。次に例を示します:
        sudo modprobe -r drivername

        ステップ4の前の例では、igbはドライバの名前です。デバイス・ドライバ名を検索するには、ethtoolコマンドを使用します。次に例を示します:

        ethtool -i em1 | grep ^driver
      2. max_vfs7 (または最大許容数)に設定してモジュールを起動します。次に例を示します:
        sudo modprobe drivername max_vfs=7
      3. VFをブート時に永続的にします。

        options drivername max_vfs=7/etc/modprobe.d内の任意のファイルに追加します。次に例を示します。

        sudo echo "options drivername max_vfs=7" >>/etc/modprobe.d/igb.conf
    • 作成に必要なVFを割り当てるには、次を発行します。
      echo N > /sys/bus/pci/devices/${PF_DEV}/sriov_numvfs

      説明:

      • Nは、カーネル・ドライバで作成するVFの数です。
      • ${PF_DEV}は、物理デバイスのPCIバス/デバイス/機能IDです。例: "0000:02:00.0"(ステップ3の出力例に示すように)。
  6. lspci | grepコマンドを使用して、新しく追加されたVFをリストします。

    たとえば、次の出力には、82576ネットワーク・コントローラに関連付けられたVFが一覧表示されます。

    sudo lspci | grep 82576
    0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection(rev 01)
    0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)

    物理機能(PF)は、0b:00.0および0b:00.1エントリに対応します。すべてのVFが説明のVirtual Functionエントリとして表示されます。

  7. virsh nodedev-list | grepコマンドを使用して、libvirtがSR-IOVデバイスを検出できることを確認します。

    Intel 82576ネットワーク・デバイスの例の場合、フィルタされた出力は次のように表示されます。

    virsh nodedev-list | grep 0b
    pci_0000_0b_00_0
    pci_0000_0b_00_1
    pci_0000_0b_10_0
    pci_0000_0b_10_1
    pci_0000_0b_10_2
    pci_0000_0b_10_3
    pci_0000_0b_10_4
    pci_0000_0b_10_5
    pci_0000_0b_10_6
    pci_0000_0b_11_7
    pci_0000_0b_11_1
    pci_0000_0b_11_2
    pci_0000_0b_11_3
    pci_0000_0b_11_4
    pci_0000_0b_11_5

    libvirtは、lspci出力と同様の表記を使用します。セミコロン(;)やピリオド(.)などの句読点文字は、lspci出力にアンダースコア(_)として表示されます。

  8. virsh nodedev-dumpxmlコマンドを使用して、SR-IOV物理機能および仮想機能のデバイスの詳細を確認します。

    たとえば、高度な出力には、pci_0000_0b_00_0物理機能とそれに対応する最初の仮想機能(pci_0000_0b_10_0_)に関連する詳細が表示されます。

    sudo virsh nodedev-dumpxml pci_0000_0b_00_0
    <device>
       <name>pci_0000_0b_00_0</name>
       <parent>pci_0000_00_01_0</parent>
       <driver>
          <name>igb</name>
       </driver>
       <capability type='pci'>
          <domain>0</domain>
          <bus>11</bus>
          <slot>0</slot>
          <function>0</function>
          <product id='0x10c9'>82576 Gigabit Network Connection</product>
          <vendor id='0x8086'>Intel Corporation</vendor>
       </capability>
    </device>
    sudo virsh nodedev-dumpxml pci_0000_0b_10_0
    <device>
       <name>pci_0000_0b_10_0</name>
       <parent>pci_0000_00_01_0</parent>
       <driver>
          <name>igbvf</name>
       </driver>
       <capability type='pci'>
          <domain>0</domain>
          <bus>11</bus>
          <slot>16</slot>
          <function>0</function>
          <product id='0x10ca'>82576 Virtual Function</product>
          <vendor id='0x8086'>Intel Corporation</vendor>
       </capability>
    </device>

    VFのbusslotfunctionパラメータに注意してください。これらのパラメータは、次のステップでVFをKVMゲストに割り当てる必要があります。

    これらのVFパラメータを一時XMLファイル(/tmp/new-interface.xmlなど)にコピーします。次に例を示します:
    <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0' bus='11' slot='16' function='0'/>
         </source>
       </interface>

    ノート:

    • MACアドレスが指定されていない場合は、MACアドレスが自動的に生成されます。
    • <virtualport>要素は、802.11Qbhハードウェア・スイッチに接続する場合にのみ使用されます。
    • <vlan>要素は、42タグの付いたVLANをゲストに透過的に割り当てます。

      KVMゲストが起動すると、物理アダプタによって提供されるタイプのネットワーク・デバイスが構成済MACアドレスとともに表示されます。このMACアドレスは、ホストおよびゲストのリブート後も変更されません。

      次の<interface>の例は、<mac address><virtualport><vlan>オプション要素の構文を示しています。実際には、次の例に示すように、<vlan>または<virtualport>要素を使用しますが、両方同時ではありません

    ...
     <devices>
       ...
       <interface type='hostdev' managed='yes'>
         <source><address type='pci' domain='0' bus='11' slot='16' function='0'/>
         </source><mac address='52:54:00:6d:90:02'><vlan><tag id='42'/>
         </vlan><virtualport type='802.1Qbh'>
         <parameters profileid='finance'/>
         </virtualport></interface>
       ...
     </devices>
  9. 前のステップで作成したnew-interface.xmlファイルと virsh attach-deviceコマンドを使用して、SR-IOV PCIeデバイスのVFをKVMゲストに割り当てます。
    次に例を示します:
    virsh attach-device MyGuestName /tmp/new-interface.xml  --config

    --configオプションを使用すると、KVMゲストの今後の再起動後に新しいVFが使用可能になります。

SR-IOV対応PCIeデバイス

ノート:

新しいSR-IOV PCIeデバイスとLinuxカーネルが継続的に開発されているため、他のSR-IOV対応のPCIeデバイスは時間の経過とともに利用できる可能性があり、次の表には取得されません。

表5-1 PCIeのデバイスおよびドライバ

デバイス名 デバイス・ドライバ
Intel 82599ES 10ギガビット・イーサネット・コントローラ Intel(R)イーサネット・ネットワーク接続用のIntel xgbe Linuxベース・ドライバ

最新のxgbeドライバのリストは、http://e1000.sourceforge.netまたはhttp://downloadcenter.intel.comを参照してください

Intelイーサネット・コントローラXL710シリーズ

Intelイーサネット・ネットワーク・アダプタXXV710

Intel(R)イーサネット・ネットワーク接続用Intel i40e Linuxベース・ドライバ

最新のi40eドライバのリストは、http://e1000.sourceforge.netまたはhttp://downloadcenter.intel.comを参照してください

NVIDA (Mellanox) ConnectX-5、ConnectX-6 DX、ConnectX-7 NVIDA (Mellanox) mlx5_coreドライバ
Intel 82576ギガビット・イーサネット・コントローラ Intel(R)イーサネット・ネットワーク接続用Intel igb Linux*ベース・ドライバ

最新のxgbeドライバのリストは、http://e1000.sourceforge.netまたはhttp://downloadcenter.intel.comを参照してください

Broadcom NetXtreme II BCM57810 Broadcom bnx2x Broadcom NetXtreme IIネットワーク接続用のLinuxベース・ドライバ
QSFP用イーサネット・コントローラ E810-C Intel(R)イーサネット・ネットワーク接続で使用可能なOracle Linuxベース・ドライバ・パッケージ
SFC9220 10/40Gイーサネット・コントローラ

sfc Linuxベース・ドライバ

FastLinQ QL41000シリーズ10/25/40/50GbEコントローラ qede FastLinQイーサネット・ネットワーク接続用ポーリング・モード・ドライバ