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

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

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

考虑:

rascher@localhost:~$ virsh -c qemu:///系统列表 --all
连接到 uri:qemu:///system
 身份证 姓名 所在州
----------------------------------
  1 台机器 1 正在运行
  2 machine2 正在运行
  - 机器3关闭

我的网络配置如下:

<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>

那么我怎样才能获得一份包含以下内容的清单:

机器 1 的 IP 地址 = 192.168.122.16
机器2的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,并将其报告回主机操作系统?

答案1

很久以前就有人请求此功能。现在 libvirt 通过提供两个新命令来支持它:多米法地址网络 dhcp 租约

 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/A          N/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

答案2

libvirt 使用域名系统为客人提供 DHCP,因此您可以搜索 /var/log/daemon.log 或查阅 /var/lib/libvirt 中的租约文件以获取 IP 到主机名的映射。

service start dnsmasq
service enable dnsmasq

答案3

因此,在调查此事时,我发现 libvirt 使用域名系统以便为客户操作系统执行 DHCP 和 DNS。

并且 dnsmasq 将根据从客户机收到的主机名在主机的 DNS 表中设置主机名。

因此,按照这些说明和大量的谷歌搜索,我只需要创建并将其添加到 /etc/dhclient.conf:

send host-name "machine1"

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

有人知道为什么我需要添加结尾的“。”才能解析 DNS 条目吗?我该如何更改?

答案4

Lars Kellogg-Stedman 编写了一组脚本来自动化部分流程。他称之为“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 的虚拟机管理器中通过其“域名”获得每个虚拟机的列表。例如,在我的计算机上有 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

请注意,这不是 VM 本身使用的“主机名”,但对于大量用例来说,它“足够好”并解决了在 dhcp 领域中每个 VM 内部必须进行“ifconfig”的问题。

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

我添加了一些非常小的增强功能,例如用于输出一些 ~/.ssh/config 选项的脚本(通过代理转发在虚拟机上使用 github 非常方便),这里:

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

我还想指出,将 dhclient.conf 编辑为“发送主机名 xxxxx”的方法仅适用于以标准方式实际使用 dhclient.conf 的系统。例如,Mageia 的 dhclient 工作方式设置不同寻常,因此简单的说明不一定有效。但是,使用 Lars 的方法,无论客户操作系统的 dhcp 设置如何,它都可以工作,因为他不依赖虚拟机发送其主机名 - 他使用的是 libvirt 机器管理器中的“域名”。

相关内容