如何在 KVM 上找到虚拟机的 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 中的虚拟机的 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 你的域名 /var/lib/dhcp/dhclient.eth0.leases