KVM 上の VM の IP を見つけるにはどうすればよいですか (Nmap を使用)? そうでない場合、Libvirt にそれを行う関数はありますか?
答え1
Centos 63 x86_64 上の KVM の簡単な例。このセグメント内の VM が持つ可能性のあるすべての IP アドレスに対してバックグラウンドで短い ping を実行します。
for i in {1..249}
do
ping -c 1 -n -q -r -t 1 -s 1 -W 1 192.168.100.$i > /dev/null &
done
virsh経由でVMの名前とMACアドレスを抽出し、ARPテーブルからIPを抽出します。
for name in `virsh list | grep running | awk '{ print $2 }'`
do
printf "\n$name\n "
arp -e | grep "`virsh dumpxml $name | grep "mac address"|sed "s/.*'\(.*\)'.*/\1/g"`" |
awk '{ printf $1 ; printf " " ; printf $3 }'
done
答え2
長時間手を汚した後、私は偶然これ素晴らしいリンク。
- VM の構成ファイルから VM の MAC アドレスを取得します (KVM を使用しているため、MAC アドレスについては .xml ファイルを照会しました)。
- 次にarp -aを使用して、すべてのMACアドレスとインターフェースのアドレスを取得し、ファイルに保存します。
- ステップ 1 の VM の MAC アドレスをファイルで照会します。
答え3
私はこれを実行する bash スクリプトを作成しましたが、名前に「swarm」が含まれるマシンもフィルタリングします。必要に応じて、フィルタを削除したり変更したりできます。(削除| grep "swarm"
) これを完全なスクリプトとして使用するか、1 行の部分をコピーして貼り付けることができます。
#!/usr/bin/env bash
# we make assumption that the VM's we want have the word swarm in their name. Edit for different name or to get all unfiltered names
for i in $(virsh list | grep "swarm" | awk '{print $2;}' ); do virsh domifaddr $i | sed 3q | sed '$!d' |awk '{print $4}' ; done;
構成要素は、virsh list
すべての VM のリストを取得する virsh コマンドと、domifaddr <VM NAME>
その IP アドレスを取得する for ループ呼び出しです。残りはすべて、テキストを 1 行につき 1 つの IP アドレスのみにフィルタリングします。私はこれを Ubuntu KVM サーバー 15.10 で作成/実行しました。
答え4
virt-cat コマンドを使用すると、VM 上のすべてのファイルを照会できます。たとえば、dhcp リース ファイルは次のようになります。
virt-cat -d your_domain /var/lib/dhcp/dhclient.eth0.leases