私の目標は、libvirt API (>=0.10) のみを使用して、新しい仮想マシンの IP アドレスを見つけることです。現在、libvirt の net-update コマンドを使用しています。新しいマシンを起動する前に、静的 DHCP エントリを設定し、既知のアドレスで仮想マシンを起動します。
古い libvirt バージョンでもほぼ正常に動作しますが、バグが 1 つあります。マシンを「強制的にオフ」にすると、DHCP サーバー (libvirt/dnsmasq) に「解放」クエリが送信されず、この IP がリース ファイルに残ります。DHCP リースがタイムアウトする前に同じ IP アドレスで新しいマシンを作成すると、DHCP サーバーはこの IP がすでに使用されていると見なすため (リース ファイルの情報に基づく)、静的エントリから IP アドレスを取得できません。
ターゲット サーバーへのシェル アクセスや仮想マシン内の静的ネットワーク構成を使用せずに、マシンの IP アドレスを取得したり、起動前に設定したりするための、より堅牢なソリューションはありますか?
答え1
libvirt >= 1.2.14 では、libvirt にクエリを実行してゲスト NIC に割り当てられた IP アドレスを問い合わせることができるため、静的 IP アドレスを設定する必要がなくなります。例:
# virsh domifaddr f25kubdev
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet1 52:54:00:b4:fc:f2 ipv4 192.168.122.13/24
ただし、libvirt 0.10.0について言及しているので、それが役に立つかどうかはわかりません。
1.2.10以上のバージョンを使用している場合は、DHCPリースデータベースを照会することで情報を取得するより簡単な方法があります。
# virsh net-dhcp-leases default
Expiry Time MAC address Protocol IP address Hostname Client ID or DUID
-------------------------------------------------------------------------------------------------------------------
2017-01-19 12:01:01 52:54:00:b4:fc:f2 ipv4 192.168.122.13/24 f25kubdev ff:00:b4:fc:f2:00:04:52:fb:4b:29:01:5e:44:c8:b6:57:85:dd:f2:7a:98:73
次に、MAC アドレスを関心のあるドメインに手動でマッピングする必要があります。'domifaddr' コマンドは、そのマッピングを自動的に実行します。
1.2.10 より前では、libvirt API 経由でこの情報を取得する方法がまったくありませんでした。dnsmasq リース ファイル内を直接調べる必要がありました。