この記事では、libvirtベースのアプリケーションで使用される一般的なネットワーク構成について説明します。この情報は、Xen、KVM、その他を問わず、すべての「ハイパーバイザー」に適用されます。
2つの一般的な設定は次のとおりです。
*仮想ネットワーク:「NAT転送」。箱から出して、あまり設定する必要はありません。 *共有機器:「ブリッジネットワーク」。特定の手動構成が必要です。
この記事では、主にこの2種類のネットワークを紹介します。最後の部分は「ネットワークデバイスダイレクト」に関連しています。
仮想ネットワーク:NAT転送
#1ホストを構成する
libvirtが標準でインストールされている場合、デフォルトでNATベースの仮想マシン接続を提供します。
#virsh net-list --all Name State Autostart Persistent -------------------------------------- -------- デフォルトの非アクティブはいはい
存在しない場合は、以下を定義またはアクティブ化できます。
#virsh net-define /usr/share/libvirt/networks/default.xml /usr/share/libvirt/networks/default.xml から定義されたネットワークデフォルト #virsh net-autostart default 自動起動としてマークされたネットワークデフォルト #virsh net-start default ネットワークのデフォルトが開始されました
上記のdefault.xmlファイルの内容は次のとおりです。
<!-virsh net-dumpxml --inactive --network default-> <network> <name> default </ name> <uuid> aa81e36e-28c6-4ba7-87d1-4599b2671550 </ uuid> <forward mode = ' nat '/> <bridge name =' virbr0'stp = 'on'delay =' 0 '/> <mac address = '52:54:00:a3:b6:d1' /> <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>
関連するネットワーク定義については、公式の「ネットワークXML形式」の記事を参照してください。
ネットワークが開始すると、ネットワークブリッジ「virbr0」とネットワークカード「virbr0-nic」が表示されます。このネットワークカードは「NAT」+「転送」を介して外部にアクセスするため、物理的な機器を追加しないことに注意してください。機器を追加しないでください。
#brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400a3b6d1 yes virbr0-nic
同時に、libvirtはファイアウォールルールをINPUT、FORWARD、OUTPUT、およびPOSTROUTINGチェーンに追加して、virbr0デバイスにバインドされたゲストとの間のトラフィックを許可します。また、ip_forward設定(net.ipv4.ip_forward = 1)を有効にしようとします。
「仮想ネットワーク」に関連するもう1つのものは、dnsmasqサービスです。各仮想ネットワークには、対応するdnsmasqのインスタンスがあります。記事「Libvirtdとdnsmasq」を参照してください。
#2ゲストを構成する
ネットワークが開始されたら、ゲストを構成できます。
<!-virsh edit --domain <guest>-> <interface type = 'network'> <source network = 'default' /> <mac address = '00:16:3e:1a:b3:4a '/ > </ interface>
その中で、<mac>はオプションであり、設定されていない場合は自動的に定義されます。
ネットワークインターフェイスの定義については、「ネットワークインターフェイス」の記事を参照してください。
#3効果的なネットワーク変更
場合によっては、ネットワーク定義を編集して、変更を動的に適用する必要があります。最も一般的なシナリオは、ネットワークのDHCPサーバーに新しい静的MACIPマッピングを追加することです。virsh net-editを使用してネットワークを編集する場合、ネットワークが破棄されて再起動されるまで有効になりませんが、これにより、すべてのゲストネットワークインターフェイスが再接続する前にホストとのネットワーク接続を失います。
この問題については、virshnet-updateを使用して解決できます。たとえば、MACIPバインディングを追加するには:
virsh net-update default add ip-dhcp-host \ "<host mac = '52:54:00:00:00:01 'name =' bob 'ip =' 192.168.122.45 '/>" \ --live- -config
addコマンドに加えて、delete、modify、add-first、およびadd-lastコマンドもあります。ip-dhcp-host構成項目に加えて、ip-dhcp- range、forward-interface、portgroup、dns-host、dns-txt、およびdns-srv構成項目もあります。詳細な使用法については、man 1virshのマニュアルを参照してください。
注:コマンドラインのXMLのコンテンツは、変更または追加するコンテンツである必要があります。また、XMLのエスケープに注意してください。
もちろん、一部のネットワーク変更ではネットワークを再起動する必要があり、これらの変更はvirshnet-updateでは更新できません。再起動すると、実行中のすべてのゲストがネットワークから切断されます。解決策の1つは、再起動後にすべてのネットワークに接続することです。関係者は「スクリプト」を提供しましたが、接続を開くことができませんでした...これは「スクリプト」である必要があります。
#「着信接続」を転送する
デフォルトでは、<forward mode = 'nat' />の仮想ネットワークを介して、「Guest」は外部ネットワークに自由にアクセスでき、「Host」または「Guest onthesamenetwork」からの接続も受け入れることができます。
ただし、上記の接続に加えて、他の「着信接続」はiptablesルールによってブロックされます。
この問題を解決したい場合は、qemuのlibvirt「フック」スクリプトを設定して、指定されたポートからゲストポートに着信接続を転送するために必要なiptablesルール(DNAT)を設定できます。
実際、それは次のとおりです。ゲストが開始(停止)するときに、libvirtフックを使用してファイアウォールルールを追加(削除)します。「Forwarding_Incoming_Connections」のマニュアルを参照してください。
共有機器:ネットワークブリッジ
#1ホストを構成する
NATベースの接続は、「迅速で簡単な展開」または「動的ネットワーキング」で非常に役立ちます。ただし、上級ユーザーは、ゲストがLANに直接接続される「フルブリッジ」を使用することをお勧めします。この設定はリリースによって異なり、リリースごとに操作が異なります。
!!!残念ながら、ワイヤレスインターフェイス( "wlanX")を介して外部ネットワークに接続する場合、ワイヤレスインターフェイスはLinuxホストブリッジに接続できないため、このネットワークモードをゲスト仮想マシンに使用することはできません。
!!!ブリッジインターフェイスを使用しようとした後、ネットワークリンクが停止していて再び機能しない場合は、アップストリームルーター/スイッチがネットワーク内の「無許可のスイッチ」をブロックしている可能性があります(たとえば、BPDUパケットを検出することにより) )。ホスト/ネットワークポートが「スイッチ」として機能することを明示的に許可するには、構成を変更する必要があります。
ホストで、NetworkManagerを使用してネットワークを管理する場合:
* [[https://www.happyassassin.net/2014/07/23/bridged-networking-for-libvirt-with-networkmanager-2014-fedora-21/|nm-connection-editorUIの使用]] * [[ https://lukas.zapletalovi.com/2015/09/fedora-22-libvirt-with-bridge.html |コマンドラインの使用]]
ホストでは、NetworkManagerを使用してネットワークを管理しないでください。
* RHEL / Fedoraシリーズの場合は、従来のブリッジ構成方法を使用します。 * Debianシリーズの場合は、マニュアル「[[https://wiki.debian.org/BridgeNetworkConnections|BridgeNetworkConnections]]」を参照してください。 *他のディストリビューションについても同じです。真の運用アイデア
この手順の目的は、ブリッジネットワークカード「br0インターフェイス」(またはその他)を追加し、「eth0インターフェイス」(またはその他)にブリッジすることです。このネットワークカードは、ゲストを構成するときに使用されます。
#2ゲストを構成する
ゲストがこのブリッジを使用するには、「LANへのブリッジ」で説明されているように、その構成にインターフェイス定義を含める必要があります。本質的には、接続するブリッジの名前を指定することです。ブリッジが「br0」という名前の共有物理デバイスであるとすると、ゲスト仮想マシンのXMLは次のようになります。
<interface type = 'bridge'> <source bridge = 'br0' /> <mac address = '00:16:3e:1a:b3:4a '/> <model type =' virtio '/> <!-# VLANで問題が発生した場合は、これを試してください-> </ interface>
その中で、MACアドレスはオプションであり、省略した場合は自動的に生成されます。
virsh edit <VM name>を使用して、構成ファイルを変更します。
その他の質問については、FAQの「VM構成ファイルはどこに保存されていますか?VMのXML構成を編集するにはどうすればよいですか?」のエントリを参照してください。
ネットワークデバイスのパススルーについて
PCIネットワークデバイスは、ゲスト仮想マシンへの「パススルー」にすることができます。ホストは「IntelVT-d」または「AMDIOMMU」テクノロジーをサポートしている必要があることが前提です。
機器を割り当てる方法は2つあります。
*「<hostdev>」を 使用して割り当てます*「<interfacetype = 'hostdev'>」を使用して割り当てます(SRIOVデバイスのみ)
#1 <hostdev>割り当てを使用する
ネットワークカードに限らず、PCIデバイスを割り当てる従来の方法を設定するには、「libvirtPCIデバイスの割り当て」の記事を参照してください。
#2 <interface type = 'hostdev'>を使用して割り当てます(SRIOVデバイスのみ)
SRIOVネットワークカードは複数の「仮想機能」(VF)を提供し、各VFは「PCIデバイス割り当て」を使用してゲストに個別に割り当てることができ、それぞれが完全な物理ネットワークデバイスとして機能します。これにより、多くのゲストは、物理マシン上の単一のスロットのみを使用しながら、PCIデバイスの直接割り当てのパフォーマンス上の利点を得ることができます。
これらのVFは、<hostdev>を使用して従来の方法でゲストに割り当てることができますが、(通常のネットワークデバイスとは異なり)SRIOV VFネットワークデバイスには永続的な一意のMACアドレスがないため、この方法では最終的に問題が発生しますが、ホストオペレーティングシステムを再起動します毎回新しいランダムMACアドレスが与えられたとき。その結果、毎回同じVFがゲストに割り当てられている場合でも、ホストを再起動するたびに、ゲストはネットワークアダプターに新しいMACアドレスがあることを確認します。これにより、ゲストは新しいハードウェアがゲストのネットワーク設定を再構成する必要があります。
ホストはゲスト仮想マシンにVFを割り当てる前にMACアドレスを設定できますが、<hostdev>設定にはそのような設定はありません(<hostdev>は一般的なPCIデバイスに使用されるため、特定の機能項目とは関係ありません) 、MACアドレスなど。知っている)。この問題を解決するために、libvirt-0.9.10は新しい<interface type = 'hostdev'>( " document ")を追加しました。この新しいタイプのインターフェースデバイスは、<interface>と<hostdev>の混合として表示されます-libvirtは、最初にネットワーク固有のハードウェア/スイッチの初期化(MACアドレスの設定や802.1Qbhスイッチへの関連付けなど)を実行し、次にゲストへのPCIデバイスの割り当てを実行します。
<interface type = 'hostdev'>を使用するには、SRIOVをサポートするネットワークカードと、IntelVT-dまたはAMDIOMMU拡張をサポートするホストハードウェアが必要です。また、割り当てるVFのPCIアドレスを知っている必要があります(これを行う方法操作の手順については、このドキュメントを参照してください)。
上記の情報を確認/理解した後、ゲストのドメイン構成を編集し、次のデバイスエントリを設定できます。
<interface type = 'hostdev'managed =' yes '> <source> <address type =' pci 'domain =' 0x0 'bus =' 0x00 'slot =' 0x07 'function =' 0x0 '/> </ source> < mac address = '52:54:00:6d:90:02 '/> <virtualport type =' 802.1Qbh '> <parameters profileid =' finance '/> </ virtualport> </ interface>
Macアドレスを指定しない場合、他のタイプのインターフェースデバイスを使用する場合と同様に、MACアドレスが自動的に生成されることに注意してください。さらに、<virtualport>要素は、802.11Qghハードウェアスイッチ(802.11)に接続している場合にのみ使用されます。このモードは現在、Qbg(「VEPA」とも呼ばれます)スイッチをサポートしていません。
ゲスト仮想マシンが起動すると、物理アダプターによって提供されるネットワークデバイスのタイプと、構成されたMACアドレスが表示されます。ゲストとホストの再起動後、このMACアドレスは変更されません。
#「libvirt <ネットワーク>で定義されたSRIOVVFプール」から割り当てます
特定のVFのPCIアドレスをゲスト仮想マシン構成にハードコーディングすることには、2つの重大な制限があります。
(1)ゲスト仮想マシンの起動時に、指定されたVFが使用可能である必要があります。つまり、管理者は各VFを単一のゲスト仮想マシンに永続的に割り当てる(またはゲスト仮想マシンのたびにゲスト仮想マシンの構成を変更する)必要があります。開始)現在未使用のVFのPCIアドレスを指定します)。 (2)ゲスト仮想マシンを別のホストに移動する場合、ホストはPCIバス上の同じ場所にまったく同じハードウェアを持っている必要があります(または、開始する前にゲスト仮想マシンの構成も変更する必要があります)。
libvirt 0.10.0以降、「SRIOVデバイスを含むすべてのVFのデバイスプール」の「libvirtネットワーク」を作成し、このネットワークを参照するようにゲスト仮想マシンを構成することで、これら2つの問題を回避できます。ゲストが開始されるたびに、VFがプールから割り当てられ、ゲストに割り当てられます。ゲストが停止すると、VFはプールに戻され、別の訪問者が使用できるようになります。
以下は、SR-IOVアダプターのすべてのVFプールを提供するネットワーク定義の例であり、そのPF(物理機能)はホストの「eth3」にあります。
<network> <name>パススルー</ name> <forward mode = 'hostdev'managed =' yes '> <pf dev =' eth3 '/> </ forward> </ network>
このネットワークを使用するには、上記のテキストをたとえば/tmp/passthrough.xmlに入れ(「eth3」を独自のSR-IOVデバイスのPFのnetdev名に置き換えます)、次のコマンドを実行します。
#!/ bin / sh virsh net-define /tmp/passthrough.xml virshnet -autostartパススルーvirshnet -startパススルー。
表示されるデバイスは1つだけですが、libvirtは、以下に示すように、ゲスト仮想マシンがインターフェイス定義を使用して初めて起動したときに、PFに関連付けられたすべてのVFのリストを自動的に取得します。
<interface type = 'network'> <source network = 'passthrough'> </ interface>
これは、ネットワークを使用する最初のゲスト仮想マシンを起動した後に「virsh net-dumpxml passthrough」を実行することで確認できます。次のような出力が得られます:
<network connections = '1'> <name> passthrough </ name> <uuid> a6b49429-d353-d7ad-3185-4451cc786437 </ uuid> <forward mode = 'hostdev'managed =' yes '> <pf dev =' eth3 '/> <アドレスタイプ=' pci 'ドメイン=' 0x0000 'バス=' 0x02 'スロット=' 0x10 '関数=' 0x1 '/> <アドレスタイプ=' pci 'ドメイン=' 0x0000 'バス=' 0x02 ' slot = '0x10' function = '0x3' /> <address type = 'pci' domain = '0x0000' bus = '0x02' slot = '0x10' function = '0x5' /> <address type = 'pci' domain = '0x0000'バス= '0x02'スロット= '0x10'関数= '0x7' /> <アドレスタイプ= 'pci'ドメイン= '0x0000'バス= '0x02'スロット= '0x11'関数= '0x1' /> <アドレスタイプ= 'pci'ドメイン= '0x0000'バス= '0x02'スロット= '0x11 'function =' 0x3 '/> <アドレスタイプ= 'pci'ドメイン= '0x0000'バス= '0x02'スロット= '0x11 'function =' 0x5 '/> </ forward> </ network>
関連記事
「KVM」-一般的なエラーと注意事項
「KVM」-CPUモデルとトポロジ(未完成)
「KVM」-
仮想マシンの移行「KVM」-Virt-Manager
「libvirt」-オフライン移行
「KVM」-Kimchi(Web管理ツール)
" QEMU、KVM、およびlibvirt 」-その他の「KVM」-環境のセットアップ