使用KVM + libvirt获取DHCP客户端列表?

我有几个虚拟机通过KVM + libvirt在Ubuntu 9.10上运行。 我希望能够find已经分配给每个主机的IP地址,而不必为每台机器打开物理“控制台”并调用ifconfig

考虑:

 rascher @ localhost:〜$ virsh -c qemu:/// system list --all
连接到uri:qemu:/// system
  Id名称状态
 ----------------------------------
   1台machine1运行
   2 machine2运行
   -  machine3closures

我的networkingconfiguration如下所示:

 <network> <name>default</name> <uuid>1be...</uuid> <forward mode='route' dev="eth0"/> <bridge name='virbr0' stp='on' forwardDelay='0' /> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254' /> </dhcp> </ip> </network> 

那么我怎样才能得到一个说:

 machine1 IP地址= 192.168.122.16
 machine2 IP地址= 192.168.122.238
 ...

我玩了arp

 rascher @ localhost:〜$ arp
地址HWtype HWaddress标志掩码Iface
 192.168.122.238醚00:16:36:00:61:b0 C virbr0
 192.168.122.16醚00:16:36:52:e8:9c C virbr0
 ...

但是这并不映射到虚拟机的ID。

有没有一些工具(通过命令行, virshvirt-* )我可以确定这些信息? 还是需要在每个单独的虚拟机上运行一些奇特的脚本,检查自己的IP,并将其报告回主机操作系统?

这个function很久以前就被要求了。 现在libvirt通过提供两个新的命令来支持它: domifaddr和net-dhcp- leases

  Usage: domifaddr <domain> [interface] [--full] [--source lease|agent] Example outputs: virsh # domifaddr f20 --source agent Name MAC address Protocol Address ------------------------------------------------------------------------------- lo 00:00:00:00:00:00 ipv4 127.0.0.1/8 - - ipv6 ::1/128 eth0 52:54:00:2e:45:ce ipv4 10.1.33.188/24 - - ipv6 2001:db8:0:f101::2/64 - - ipv6 fe80::5054:ff:fe2e:45ce/64 eth1 52:54:00:b1:70:19 ipv4 192.168.105.201/16 - - ipv4 192.168.201.195/16 - - ipv6 2001:db8:ca2:2:1::bd/128 eth2 52:54:00:36:2a:e5 N/AN/A eth3 52:54:00:20:70:3d ipv4 192.168.105.240/16 - - ipv6 fe80::5054:ff:fe20:703d/64 virsh # domifaddr f20 --full Name MAC address Protocol Address ------------------------------------------------------------------------------- vnet0 52:54:00:2e:45:ce ipv6 2001:db8:0:f101::2/64 vnet1 52:54:00:b1:70:19 ipv4 192.168.105.201/16 vnet1 52:54:00:b1:70:19 ipv6 2001:db8:ca2:2:1::bd/128 vnet3 52:54:00:20:70:3d ipv4 192.168.105.240/16 virsh # domifaddr f20 eth0 --source agent --full Name MAC address Protocol Address ------------------------------------------------------------------------------- eth0 52:54:00:2e:45:ce ipv4 10.1.33.188/24 eth0 52:54:00:2e:45:ce ipv6 2001:db8:0:f101::2/128 eth0 52:54:00:2e:45:ce ipv6 fe80::5054:ff:fe2e:45ce/64 For eth0, ipv6 is managed by libvirt, but ipv4 is not. For eth1, the second IP is created using ip aliasing. For eth2, there is no IP configured as of yet. For eth3, only ipv4 has been configured. fd00::/8 are private ipv6 ranges. Hence not visible through --source lease 

在另一种情况下:

  Example Usage: net-dhcp-leases <network> [mac] virsh # net-dhcp-leases --network default6 Expiry Time MAC address Protocol IP address Hostname Client ID or DUID ------------------------------------------------------------------------------------------------------------------- 2014-06-16 03:40:14 52:54:00:85:90:e2 ipv4 192.168.150.231/24 fedora20-test 01:52:54:00:85:90:e2 2014-06-16 03:40:17 52:54:00:85:90:e2 ipv6 2001:db8:ca2:2:1::c0/64 fedora20-test 00:04:b1:d8:86:42:e1:6a:aa:cf:d5:86:94:23:6f:94:04:cd 2014-06-16 03:34:42 52:54:00:e8:73:eb ipv4 192.168.150.181/24 ubuntu14-vm - 2014-06-16 03:34:46 52:54:00:e8:73:eb ipv6 2001:db8:ca2:2:1::5b/64 - 00:01:00:01:1b:30:c6:aa:52:54:00:e8:73:eb 

libvirt使用dnsmasq为guest虚拟机提供DHCP,因此您可以浏览/var/log/daemon.log或通过/ var / lib / libvirt中的租借文件来获取IP到主机名的映射。

所以,在研究这个时候,我发现libvirt使用dnsmasq来为访客操作系统做DHCP和DNS。

而且dnsmasq会根据来自guest虚拟机的任何主机名来设置主机的DNS表中的主机名。

所以按照这些说明和大量的Googlesearch,我只需要创build并添加到/etc/dhclient.conf:

 send host-name "machine1" 

现在,从我的主机操作系统,我可以ping machine1.

有谁知道为什么我需要添加尾随“。” 为了DNS条目解决? 我怎样才能改变这个?

我有同样的问题,所以我创build了以下脚本:

 #!/bin/bash function showMAC(){ virsh dumpxml ${1}|grep "mac address"|sed "s/.*'\(.*\)'.*/\1/g" } function showIP(){ for mac in $($0 -m $1); do grep $mac /var/log/daemon.log | tail -n 1 | awk '{print $7}' done } if test -z "${1}"; then echo "Usage: ${0} [-i | -m] <domain>" echo " -i Show IP address (the default)." echo " -m Show MAC address." exit fi addr_type="-i" if test ${1} = "-i" || test ${1} = "-m"; then addr_type=${1} shift fi domain=${1} test $addr_type = "-i" && showIP $domain || showMAC $domain 

Lars Kellogg-Stedman创build了一套脚本来自动执行这个过程。 他称之为“virt-utils”。

他在他的博客文章中这样描述: http : //blog.oddbit.com/2013/10/04/automatic-dns-entrie/

他还有一个github,他写了一些脚本,在这里:

https://github.com/larsks/virt-utils

你基本上可以运行这个:

 git clone https://github.com/larsks/virt-utils cd virt-utils sudo make install virt-hosts 

您将通过libvirt的虚拟机pipe理器中的“域名”获得每个虚拟机的列表。 例如,在我的机器上,我有3个虚拟机运行。

 don@serebryanya:~/src/virt-utils$ virt-hosts 192.168.122.23 mageia4.x64-net0.default.virt mageia4.x64.default.virt 192.168.122.197 debian7amd64-net0.default.virt debian7amd64.default.virt 192.168.122.15 freebsd10_amd64-net0.default.virt freebsd10_amd64.default.virt 

请注意,这不是虚拟机本身使用的“主机名”,但是对于大量的使用情况来说,这将是“足够好的”,并且解决了在dhcp land中的每个虚拟机内必须“ifconfig”的问题。

Lars的博客文章还显示了一种方法,可以在libvirt启动和/或停止新的虚拟机时自动更新自己的/ etc / hosts文件。 这使您可以执行诸如ssh myname @ fedora20vm或ssh myname @ debian6vm之类的操作,而无需手动查找192.168.122.x地址。

我已经添加了一些非常小的增强,如脚本吐出一些〜/ .ssh / config选项(在VM上通过代理转发使用github非常方便),在这里:

https://github.com/donbright/virt-utils (似乎被删除?)

我还想指出,将dhclient.conf编辑为“send host-name xxxxx”的方法仅适用于以标准方式实际使用dhclient.conf的系统。 例如,Mageia有一个不同寻常的方式来设置它的工作方式,所以简单的指令不一定能正常工作。 然而,用Lars的方法,它的作用是客户操作系统的dhcp设置,因为他不依赖于虚拟机发送它的主机名 – 他使用libvirt的机器pipe理器中的“域名”。

那么我怎样才能得到一个说:

machine1 IP地址= 192.168.122.16

machine2 IP地址= 192.168.122.238

至less在fedora上,你可以通过这种方式得到这些信息:

cat /var/lib/libvirt/dnsmasq/default.leases

有一个输出类似于:

1412006226 52:54:00:fe:b3:c0 192.168.122.117 coreos0 01:52:54:00:fe:b3:c0

尽pipe这比你要求的要多一点

在Ubuntu上,dnsmasq用于为虚拟机提供DNS和DHCP服务。 主机上的dnsmasq进程将其租约存储在此文件中:

 /var/lib/misc/dnsmasq.leases 

这是一个正常的文本文件,其中的行可能看起来类似于这里:

 1362729847 52:54:de:ad:be:ef 192.168.122.254 vm-win7 01:52:54:de:ad:be:ef 

您感兴趣的领域是第三和第四列:第三个字段包含虚拟机的IPv4地址,第四个字段包含星号或虚拟机的主机名。 这取决于来宾发送到dnsmasq服务进程的DHCP应答。

您可以更改defaultnetworking定义,将MAC映射到xml中的IP:

 # virsh net-edit default ... <range start='192.168.122.2' end='192.168.122.254' /> <host mac='52:54:00:6c:3c:02' ip='192.168.122.2' /> <host mac='52:54:00:6c:3c:03' ip='192.168.122.3' /> ... <host mac='52:54:00:6c:3c:fe' ip='192.168.122.254' /> # /etc/init.d/libvirtd restart (restart libvirt service) # virsh net-destroy default (remove old settings) # virsh net-start default (make changes working) 

一旦你开始一个客人,你可以通过列出所有客人的MAC地址

 # virsh list --all --mac 

根据MAC地址的最后一个字节,可以推断出访客的IP地址。