获取具有KVM + libvirt的DHCP客户端列表?


11

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

考虑:

rascher @ localhost:〜$ virsh -c qemu:///系统列表--all
连接到uri:qemu:/// system
 ID名称状态
----------------------------------
  1台机器正在运行
  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
地址HW类型HW地址标志掩码Iface
192.168.122.238以太0​​0:16:36:00:61:b0 C virbr0
192.168.122.16以太00:16:36:52:e8:9c C virbr0
...

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

是否有一些工具(通过命令行virshvirt-*)可以确定此信息?还是我需要在每个单独的VM上运行一些精美的脚本,检查其自己的IP,并将其报告回主机OS?

Answers:


10

很久以前就要求使用此功能。现在,libvirt通过提供两个新命令来支持它:domifaddrnet-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/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

4

libvirt使用dnsmasq向来宾提供DHCP,因此您可以拖网/var/log/daemon.log或在/ var / lib / libvirt中的租约文件中进行挖掘以获得IP到主机名的映射。


2

因此,在调查此问题时,我发现libvirt使用dnsmasq来为来宾OS进行DHCP和DNS。

dnsmasq将根据其从来宾接收的任何主机名在主机的DNS表中设置主机名。

因此,根据这些说明和大量的搜索,我只需要创建此文件并将其添加到/etc/dhclient.conf中:

send host-name "machine1"

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

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


1
如果没有结尾点,DNS解析程序将在查找时将其搜索域列表附加到主机名上。您可以改为发送FQDN,例如machine1.example.com,然后将example.com添加到DNS搜索顺序中。
詹姆斯

谢谢你 但是链接的注释说要在主主机上并编辑/etc/resolv.conf并添加192.168.122.1作为“第一名称服务器”(即,将libvirt dnsmasq添加为NS),这当然不能在大多数现代linux上使用,如今,网络有多种抽象来重写/etc/resolv.conf。还没有找到我的呢。
唐明亮

2

我遇到了同样的问题,所以我创建了以下脚本:

#!/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

2

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的virtual-machine-manager中通过“域名”获得每个虚拟机的列表。例如,在我的计算机上,我正在运行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启动和/或停止新VM时“自动更新”自己的/ etc / hosts文件的方法。这使您可以执行ssh myname @ fedora20vm或ssh myname @ debian6vm之类的操作,而无需手动查找192.168.122.x地址。

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

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

我还想指出,将dhclient.conf编辑为“发送主机名xxxxx”的方法仅适用于以标准方式实际使用dhclient.conf的系统。例如,Mageia对dhclient的工作方式有一个不寻常的设置,因此简单的说明不一定会起作用。但是,使用Lars的方法,它可以运行来宾OS的dhcp设置,因为他不依赖VM发送主机名-他在libvirt的计算机管理器中使用“域名”。


1

那么我如何获得一个清单,上面写着:

machine1 IP地址= 192.168.122.16

machine2 IP地址= 192.168.122.238

至少在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

尽管那比您要求的要多


0

在Ubuntu上,dnsmasq用于向VM提供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

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


谢谢你 在我的ubuntu机器上,文件为/var/lib/libvirt/dnsmasq/default.leases,其中dhclient.conf文件设置为发送主机名“ myvirtmachine”;如上所列
Don

0

您可以更改default网络定义,在xml中将MAC映射到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地址。


此版本应适用于哪种版本的virsh?virsh list --all --mac在版本3.0.0中
不起作用
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.