web-dev-qa-db-ja.com

libvirt:ゲストからIPv4アドレスを取得

VM libvirtを使用してqemu/kvmで実行中のipv4アドレスまたは他のメタデータを取得するソリューションを探していますか?ovirtゲストエージェントとqemuゲストエージェントも調べましたが、このデータを取得するためのより良い/より簡単な方法があるかどうか疑問に思っていましたか?

基本的に私はいくつかのホストを実行しているKVMであり、特定のプライベートIPアドレスごとに、そのVMがそのIPアドレスで実行されていることを知る必要があります。 DHCPサーバーによって提供されます)。

17
Jochen

各VMにavahiをインストールしているので、VMは自分のアドレスをアドバタイズします。ただし、利用できるオプションはこれだけではありません(特にVMにLinuxとは異なるものが含まれている場合)。だから、virshオプションの魔法の世界に入りましょう!

*)最初に、VMのNICのMACアドレスを取得する必要があります。

[root@5844 ~]# 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

[root@5844 ~]#

*)では、ARPテーブルを見てみましょう

[root@5844 ~]# 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
 [root@5844 ~]# 

*)次に、すべてを一緒に接着します(そして少しのシェル/正規表現の魔法を追加します):

[root@5844 ~]# 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
[root@5844 ~]# 
33
Peter Lemenkov

あなたはリースファイルを読むことができます:

# 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 *

または、さらに良いのは、net-dhcp-leasesvirshからのコマンド:

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://root@localhost/system')
for lease in conn.networkLookupByName("my_network").DHCPLeases():
    print(lease)
22
goneri

これは、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
9
Deepak Vilakkat

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

  1. ゲストOSにハイパーバイザーのゲストエージェントをインストールし、ハイパーバイザー固有のAPIを使用してゲストマシンにIPを照会する
  2. ローカルネットワークで利用可能な情報に依存-私はそのためにarp-scanを使用しています

VirtualBoxまたはlibvirt + QEMUの詳細情報

1
Rostislav Matl

私の場合、どの提案も機能しませんでした。ゲストIPを取得する方法は次のとおりです。

ネットワーク名を取得します。

$ virsh net-list

Name                 State      Autostart     Persistent
----------------------------------------------------------
default              active     yes           yes

次に:

$ virsh net-dhcp-leases default

Expiry Time          MAC address        Protocol  IP address                Hostname        Client ID or DUID
-------------------------------------------------------------------------------------------------------------
2018-11-06 15:47:33  52:54:00:1b:ee:f6  ipv4      192.168.122.6/24          vm1             -
2018-11-06 15:36:58  52:54:00:d7:1c:2e  ipv4      192.168.122.4/24          vm2             -
1
McMutton