如何在 KVM 上找到 VM 的 IP(使用 Nmap)?如果沒有,Libvirt 中有沒有函數可以做到這一點?
答案1
Centos 63 x86_64 上 KVM 的快速但骯髒的範例。在背景對虛擬機器在此網段中可能擁有的所有可能的 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 提取虛擬機器的名稱和 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,所以我在.xml檔中查詢了MAC位址)。
- 然後使用 arp -a 並獲取所有 MAC 位址和介面位址並將其儲存在檔案中
- 在文件中查詢步驟 1 中 VM 的 MAC 位址。
答案3
我編寫了一個 bash 腳本來執行此操作,但也過濾其中名稱為“swarm”的機器。您可以根據需要刪除或更換過濾器。 (刪除| grep "swarm"
)您可以使用它作為完整的腳本或複製貼上其中的一行:
#!/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 命令,virsh list
用於取得所有 VM 的列表,然後在 for 循環中呼叫domifaddr <VM NAME>
以取得其 ip 位址。剩下的就是將文字過濾為每行一個 IP 位址。我在 Ubuntu KVM 伺服器 15.10 中編寫/運行了這個
答案4
使用virt-cat指令可以查詢虛擬機器上的所有檔案。例如,dhcp 租約文件:
virt-cat -d your_domain /var/lib/dhcp/dhclient.eth0.leases