B.8. ゲスト上の PXE ブート (または DHCP ) が失敗
- 現象
- ゲスト仮想マシンは正常に起動するが、DHCP から IP アドレスを取得できないか、PXE プロトコルを使用してブートを実行できない、またはその両方。このエラーには、ブリッジの転送遅延時間が長く設定されている場合と iptables パッケージとカーネルがチェックサムの難号化 (mangle) 規則をサポートしない場合という 2 つの一般的な原因があります。
- ブリッジの転送遅延時間が長い
- 調査
- これは、このエラーの最も一般的な原因になります。ゲストのネットワークインターフェイスが STP (Spanning Tree Protocol) 対応のブリッジデバイスに接続しており、かつ長時間の転送遅延時間が設定されていると、ゲストがブリッジに接続してからその転送遅延時間が経過してからでなければゲスト仮想マシンからブリッジにネットワークパケットを転送しません。この遅延により、インターフェイスからのトラフィックの監視、背後での MAC アドレスの決定、ネットワークトポロジー内の転送ループ防止がブリッジ時間で可能になります。転送遅延がゲストの PXE または DHCP クライアントのタイムアウトよりも長い場合、クライアントの操作に失敗し、ゲストは(PXE の場合)起動に失敗するか、または(DHCP の場合) IP アドレスの取得に失敗します。
- 解決方法
- この場合は、ブリッジの転送遅延を 0 に変更するか、ブリッジの STP を無効にします。注記この解決法は、ブリッジが複数のネットワーク接続に使用されておらず、複数のエンドポイントを単一のネットワーク接続のみに使用されている場合にのみ適用されます (libvirt で使用される最も一般的なブリッジのユースケース)。ゲストが libvirt が管理する仮想ネットワークに接続するインターフェイスを備えている場合、そのネットワークの定義を編集し、再起動します。たとえば、以下のコマンドでデフォルトのネットワークを編集します。
# virsh net-edit default
<bridge>
要素に以下の属性を追加します。<name_of_bridge='virbr0'
delay='0' stp='on'
/>注記delay='0'
およびstp='on'
は仮想ネットワークのデフォルト設定なので、このステップは設定がデフォルトから変更されている場合にのみ必要となります。ゲストインターフェイスが libvirt 外で設定されているホストブリッジに接続されている場合は、遅延設定を変更します。/etc/sysconfig/network-scripts/ifcfg-name_of_bridge
ファイルで以下の行を追加または編集し、0 秒の遅延で STP を有効にします。STP=on DELAY=0
設定ファイルの変更後にブリッジデバイスを再起動します。/sbin/ifdown name_of_bridge /sbin/ifup name_of_bridge
注記name_of_bridge がネットワークのルートブリッジではない場合、そのブリッジの遅延は最終的にルートブリッジに設定された遅延時間にリセットされます。この場合の唯一の解決策は、name_of_bridge で STP を完全に無効にすることです。
- iptables パッケージとカーネルがチェックサム難号化ルールをサポートしない場合
- 調査
- このメッセージは、以下の 4 つの条件すべてが該当する場合にのみ問題となります。
- ゲストが virtio ネットワークデバイスを使用している。その場合、設定ファイルに
model type='virtio'
が含まれています。 - ホストに
vhost-net
モジュールがロードされている。ls
を実行して空の結果が返されなければ、このモジュールはロードされています。/dev/vhost-net
- ゲストがホスト上で直接実行されている DHCP サーバーから IP アドレスを取得しようとしている。
- ホストの iptables のバージョンが 1.4.10 よりも古い。iptables 1.4.10 は
libxt_CHECKSUM
拡張を追加する最初のバージョンでした。libvirtd ログに以下のメッセージが表示される場合は、これに該当します。warning: Could not add rule to fixup DHCP response checksums on network default warning: May need to update iptables package and kernel to support CHECKSUM rule.
重要この一覧の最初の 3 つの条件すべてが該当していなければ上記の警告メッセージは問題を示すものではなく、無視することができます。
これらの条件が当てはまる場合、ホストからゲストへ送信される UDP パケットには未算出のチェックサムがあります。これにより、ホストの UDP パケットがゲストのネットワークスタックには無効のように表示されます。 - ソリューション
- この問題を解決するには、上記の 4 つの条件のいずれかを無効にします。最善の解決策は、ホスト iptables およびカーネルを可能な限り iptables-1.4.10 以降に更新することです。または、この特定のゲストの
vhost-net
ドライバーを無効にすることが最も具体的な修正方法になります。これを実行するには、以下のコマンドでゲストの設定を編集します。virsh edit name_of_guest
<driver>
の行を変更するか、<interface>
セクションに追加します。<interface type='network'> <model type='virtio'/> <driver name='qemu'/> ... </interface>
変更を保存し、ゲストをシャットダウンしてから再起動します。この問題が解決されない場合、firewalld とデフォルトの libvirt ネットワーク間に競合がある可能性があることが原因として考えられます。これを修正するには、service firewalld stop コマンドで firewalld を停止し、service libvirtd restart コマンドで libvirt を再起動します。