2013-09-27 8 views
12

からのIPv4アドレスを取得し、私は、IPv4アドレスまたはlibvirtのでQEMU/KVM上で実行されているVMの他のメタデータをフェッチするためのソリューションを探していますか?私はovirtゲストエージェントとqemuゲストエージェントも調べましたが、このデータを取得する方が簡単かどうかは疑問でした。のlibvirt:ゲスト

基本的に私は、KVMを実行するホストのカップルを持っており、それぞれ固有のプライベートIPアドレスのために私はVMは(DHCPサーバーによって提供される)、そのIPアドレスを使用して実行されているかを知ることができるようにする必要があります。

答えて

28

私は、各VM上のavahiをインストールしていますので、彼らは自分のアドレスをアドバタイズします。しかし、これは唯一の選択肢ではありません(VMにLinuxとは異なるものがあれば特にそうです)。だから、virshのオプションの魔法の世界に入ってください!

*)まず、あなたのVMのNICの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

素敵なソリューションのthatsが、busyboxの中で正確に動作しwouldntの、 --------> virshをdomiflist yoc6 'でMac用 のkvm#|はgrep -o -E「([0-9a- f] {2}:){5}([0-9a-f] {2}) "; DO ARP -e | grepの$マック|は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月4日午前15時02分18秒PST)BusyBoxのをv1.22.1(2015年11月4日15 :02:18 PST)マルチコールバイナリ。 使用法:grep [-HhnlLoqvsriwFE] [-m N] [-A/B/CN]パターン/ -eパターン.../-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

Pythonの例のためにUpvotedの例 – Flippym

0

二つのオプションは、一般的には、があります。

  1. ゲストOSにゲスト時代をインストールするあなたのハイパーバイザー用とIP
  2. ためにゲストマシンを照会するハイパーバイザー固有のAPIを使用して、NTローカルネットワーク上で入手可能な情報に依存している - 私はその

more specific info for VirtualBox or libvirt+QEMU

7

のARPスキャンを使用していますこれは私のために走っているCentOS 7ゲストを持つ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

関連する問題