2013-09-27 82 views
12

我正在尋找一種解決方案來獲取在libvirt上運行在qemu/kvm上的VM的ipv4地址或其他元數據?我還查看了ovirt guest代理和qemu guest代理,但我想知道是否有更好/更簡單的方法來獲取此數據?libvirt:從客戶獲取ipv4地址

基本上我有幾臺主機運行KVM,每個特定的私有IP地址我需要能夠知道哪個虛擬機正在運行該IP地址(由DHCP服務器提供)。

回答

28

我在每個虛擬機上安裝avahi,所以他們會宣傳自己的地址。但是,這不是唯一可用的選項(特別是如果您的VM包含與Linux不同的東西)。所以進入virsh選項的魔法世界!

*)首先,你需要讓你的虛擬機網卡的MAC地址:

[[email protected] ~]# virsh domiflist b2bua 
Interface Type  Source  Model  MAC 
------------------------------------------------------- 
vnet0  network default virtio  52:54:00:aa:bb:cc 
vnet1  bridge  br1  virtio  52:54:00:dd:ee:ff 

[[email protected] ~]# 

*)現在讓我們來看看ARP表

[[email protected] ~]# arp -e 
Address     HWtype HWaddress   Flags Mask   Iface 
xx.xx.xx.xx    ether xx:xx:xx:xx:xx:xx C      br0 
192.168.122.14   ether 52:54:00:xx:xx:xx C      virbr0 
192.168.122.51   ether 52:54:00:aa:bb:cc C      virbr0 
[[email protected] ~]# 

*)現在,讓我們把所有的東西一起(並添加了一些外殼/正則表達式的魔力):

[[email protected] ~]# for mac in `virsh domiflist b2bua |grep -o -E "([0-9a-f]{2}:){5}([0-9a-f]{2})"` ; do arp -e |grep $mac |grep -o -P "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" ; done 
192.168.122.51 
[[email protected] ~]# 
+0

那是很好的解決方案,但難道不BusyBox中的'的virsh domiflist yoc6工作完全, --------> KVM#爲Mac | grep的-o -E「([0-9a- f] {2}:){5}([0-9a-f] {2}) 「';做arp -e | grep $ mac | grep -o -P「^ \ d {1,3} \。\ d {1,3} \。\ d {1,3} \。\ d {1,3} 「;完成 grep:無效選項 - 'P' arp:無效選項 - 'e' BusyBox v1.22.1(2015-11-04 15:02:18 PST)BusyBox v1.22.1(2015-11-04 15 :02:18 PST)多方通話二進制。 用法:grep [-HhnlLoqvsriwFE] [-m N] [-A/B/CN] PATTERN/-e PATTERN .../- f FILE [文件] ... –

+1

請記住,arp表可能是陳舊或缺少條目。您可能需要在調用arp命令之前ping通子網。 –

21

您可以閱讀租約文件:

# cat /var/lib/libvirt/dnsmasq/default.leases 
1381437666 52:54:00:98:75:eb 192.168.122.240 chat * 
1381437643 52:54:00:dc:ee:f8 192.168.122.112 burp * 

,或者甚至更好,從virsh使用net-dhcp-leases命令:

virsh # net-dhcp-leases nat --help 
    NAME 
    net-dhcp-leases - print lease info for a given network 

    SYNOPSIS 
    net-dhcp-leases <network> [<mac>] 

    DESCRIPTION 
    Print lease info for a given network 

    OPTIONS 
    [--network] <string> network name or uuid 
    [--mac] <string> MAC address 

或者在Python:

import libvirt 
conn = libvirt.open('qemu+ssh://[email protected]/system') 
for lease in conn.networkLookupByName("my_network").DHCPLeases(): 
    print(lease) 
+5

現在有一個新的補充:domifaddr(http://libvirt.org/git/?p=libvirt.git;a=commit;h=2f36e6944e6eb56a00e19fcd85ec8513461597c9) –

+0

最佳答案..謝謝... –

+0

Upvoted for Python示例 – Flippym

0

有,一般來說,有兩個選項:

  1. 在客人操作系統中安裝客人年齡NT爲您的虛擬機管理程序,並使用特定的虛擬機管理程序的API來查詢客戶機對IP
  2. 依靠信息提供本地網絡上 - 我使用ARP掃描爲

more specific info for VirtualBox or libvirt+QEMU

7

這適用於運行CentOS 7 guest的Ubuntu 16.04主機。

$ virsh list 
Id Name       State 
---------------------------------------------------- 
5  centos7.0      running 

$ virsh domifaddr centos7.0 
Name  MAC address   Protocol  Address 
------------------------------------------------------------------------------- 
vnet0  52:54:00:a1:28:e5 ipv4   192.168.122.15/24 
+0

當使用具有外部DHCP的網橋時,不會顯示任何地址。 – Xdg