我有几个通过 KVM+libvirt 在 Ubuntu 9.10 上运行的虚拟机。我希望能够找出已分配给每台主机的 IP 地址,而无需物理打开每台机器的物理“控制台”并调用ifconfig
.
考虑:
rascher@localhost:~$ virsh -c qemu:///system list --all 连接到 uri:qemu:///system Id 名称 状态 ---------------------------------- 1台机器1运行 2 机 2 运行 - machine3 关闭
我的网络配置如下:
<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。
是否有一些工具(通过命令行,virsh
或者virt-*
)我可以确定这些信息?或者我是否需要在每个单独的虚拟机上运行一些花哨的脚本,检查自己的 IP,并将其报告回主机操作系统?
很久以前就要求此功能。现在 libvirt 通过提供两个新命令来支持它:domifaddr和net-dhcp- leases
在不同的情况下:
libvirt 使用 dnsmasq 为来宾提供 DHCP,因此您可以搜索 /var/log/daemon.log 或挖掘 /var/lib/libvirt 中的租约文件以获取 IP 到主机名的映射。
因此,在对此进行调查时,我发现 libvirt 使用dnsmasq来为来宾操作系统执行 DHCP 和 DNS。
并且 dnsmasq 将根据它从来宾接收到的任何主机名在主机的 DNS 表中设置主机名。
因此,根据这些说明和大量谷歌搜索,我只需要创建并将其添加到 /etc/dhclient.conf:
现在,从我的主机操作系统,我可以
ping machine1.
有谁知道为什么我需要添加尾随“。” 为了解析DNS条目?我怎样才能改变这个?
我遇到了同样的问题,所以我创建了以下脚本:
Lars Kellogg-Stedman 创建了一组脚本来自动化其中的一些过程。他称之为“virt-utils”。
他在这里的博客文章中对此进行了描述:http: //blog.oddbit.com/2013/10/04/automatic-dns-entrie/
他还有一个 github,上面有他写的一些脚本,在这里:
https://github.com/larsks/virt-utils
你基本上可以运行这个:
您将通过 libvirt 的虚拟机管理器中的“域名”获得每个虚拟机的列表。例如,在我的机器上运行了 3 个虚拟机。
请注意,这不是 VM 本身使用的“主机名”,但对于大量用例来说,它“足够好”并解决了必须从 dhcp 领域的每个 VM 中进行“ifconfig”的问题。
Lars 的博客文章还展示了一种在 libvirt 启动和/或停止新 VM 时“自动更新”您自己的 /etc/hosts 文件的方法。这使您无需手动查找 192.168.122.x 地址即可执行 ssh myname@fedora20vm 或 ssh myname@debian6vm 之类的操作。
我添加了一些非常小的增强功能,比如一个用于输出一些 ~/.ssh/config 选项的脚本(通过代理转发在 VM 上使用 github 非常方便),这里:https://github.com/donbright/virt-utils(好像被删除了?)我还想指出,将 dhclient.conf 编辑为“发送主机名 xxxxx”的方法仅适用于以标准方式实际使用 dhclient.conf 的系统。例如,Mageia 对 dhclient 的工作方式进行了不同寻常的设置,因此简单的说明不一定有效。然而,使用 Lars 的方法,它可以不受客户操作系统的 dhcp 设置的影响,因为他不依赖虚拟机来发送它的主机名 - 他正在使用 libvirt 的机器管理器中的“域名”。
至少在 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
虽然这比你要求的多一点
在 Ubuntu 上,dnsmasq 用于为 VM 提供 DNS 和 DHCP 服务。主机上的 dnsmasq 进程将其租约存储在此文件中:
这是一个普通的文本文件,其中的行可能与此处类似:
您感兴趣的字段是第三和第四列:第三字段包含 VM 的 IPv4 地址,第四字段包含星号或 VM 的主机名。这取决于访客向 dnsmasq 服务进程发送的 DHCP 回复。
您可以更改
default
网络定义,将 MAC 映射到 xml 中的 IP:启动访客后,您可以通过以下方式列出所有访客的 MAC 地址
根据 MAC 地址的最后一个字节,可以推断出访客的 IP 地址。