AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 101982
Accepted
rascher
rascher
Asked: 2010-01-13 09:25:44 +0800 CST2010-01-13 09:25:44 +0800 CST 2010-01-13 09:25:44 +0800 CST

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

  • 772

我有几个通过 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,并将其报告回主机操作系统?

virtualization kvm-virtualization libvirt
  • 8 8 个回答
  • 27886 Views

8 个回答

  • Voted
  1. Nehal J Wani
    2015-03-18T13:46:25+08:002015-03-18T13:46:25+08:00

    很久以前就要求此功能。现在 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/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
    
    • 11
  2. James
    2010-01-13T14:22:31+08:002010-01-13T14:22:31+08:00

    libvirt 使用 dnsmasq 为来宾提供 DHCP,因此您可以搜索 /var/log/daemon.log 或挖掘 /var/lib/libvirt 中的租约文件以获取 IP 到主机名的映射。

    • 5
  3. Best Answer
    rascher
    2010-01-24T19:37:44+08:002010-01-24T19:37:44+08:00

    因此,在对此进行调查时,我发现 libvirt 使用dnsmasq来为来宾操作系统执行 DHCP 和 DNS。

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

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

    send host-name "machine1"
    

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

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

    • 2
  4. user48801
    2010-07-21T02:51:01+08:002010-07-21T02:51:01+08:00

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

    #!/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
  5. don bright
    2014-07-13T20:09:44+08:002014-07-13T20:09:44+08:00

    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 启动和/或停止新 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 的机器管理器中的“域名”。

    • 2
  6. blq
    2014-09-30T07:05:19+08:002014-09-30T07:05:19+08:00

    那么我怎样才能得到一个清单,上面写着:

    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

    虽然这比你要求的多一点

    • 1
  7. pefu
    2013-03-08T23:56:16+08:002013-03-08T23:56:16+08:00

    在 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 回复。

    • 0
  8. coanor
    2016-12-02T08:46:20+08:002016-12-02T08:46:20+08:00

    您可以更改default网络定义,将 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
    

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

    • 0

相关问题

  • 哪些 939 插槽芯片支持 AMD-V?

  • Windows Server 2008 Hyper-V 虚拟化服务器的最佳 RAID 配置?

  • VirtualBox 上 Ubuntu 的访客优化技巧 [关闭]

  • 外部硬盘上的 virtualbox 虚拟硬盘驱动器(Vista 主机上的 ubuntu 客户机)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve