![使用 KVM+libvirt 获取 DHCP 客户端列表?](https://linux22.com/image/503022/%E4%BD%BF%E7%94%A8%20KVM%2Blibvirt%20%E8%8E%B7%E5%8F%96%20DHCP%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%88%97%E8%A1%A8%EF%BC%9F.png)
我有几个虚拟机通过 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。
是否有某种工具(通过命令行virsh
或virt-*
)可以确定此信息?或者我是否需要一些可以在每个单独的虚拟机上运行的花哨脚本,检查其自己的 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
答案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 机器管理器中的“域名”。