KVM + libvirtを使用してDHCPクライアントのリストを取得しますか?


11

Ubuntu 9.10でKVM + libvirtを介して複数のVMを実行しています。各マシンに物理的な「コンソール」を物理的に開き、を呼び出さずに、各ホストに割り当てられたIPアドレスを見つけたいと思いifconfigます。

考慮してください:

rascher @ localhost:〜$ virsh -c qemu:/// system list --all
uriへの接続:qemu:/// system
 Id Name State
----------------------------------
  1台のマシンが実行中
  2台のmachine2が実行中
  -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 Flags Mask Iface
192.168.122.238 ether 00:16:36:00:61:b0 C virbr0
192.168.122.16 ether 00:16:36:52:e8:9c C virbr0
...

ただし、これは仮想マシンのIDにはマッピングされません。

この情報を確認できるツールはありますか(コマンドライン経由、virshまたはvirt-*)。または、個々のVMで実行され、独自のIPをチェックし、ホストOSに報告する派手なスクリプトが必要ですか?

回答:


9

この機能はかなり前にリクエストされました。現在、libvirtは、domifaddrおよびnet-dhcp- leasesの 2つの新しいコマンドを提供することにより、これをサポートしています。

 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はゲストOSのDHCPとDNSを実行するためにdnsmasqを使用していることがわかりました。

また、dnsmasqは、ゲストから受信するホスト名に基づいて、ホストのDNSテーブルにホスト名を設定します。

したがって、これらの指示と多くのグーグルに従って、これを作成して/etc/dhclient.confに追加するだけでした:

send host-name "machine1"

これで、ホストOSから次のことができます。 ping machine1.

末尾に「。」を追加する必要がある理由を誰もが知っていますか。DNSエントリを解決するには?これを変更するにはどうすればよいですか?


1
末尾のドットがない場合、DNSリゾルバーは検索ドメインのリストを検索時にホスト名に追加します。代わりに、machine1.example.comなどのFQDNを送信し、DNS検索順序にexample.comを追加できます。
ジェームズ

これに感謝します。しかし、リンクされたノートはメインホストマシンに移動して/etc/resolv.confを編集し、192.168.122.1を最初のネームサーバーとして追加する(つまり、libvirt dnsmasqをNSとして追加する)と言うと、もちろんほとんどの最新のLinuxでは最近では、/ etc / resolv.confを書き換えるネットワークの抽象化が複数あります。haventは私のものをまだかなり理解していません。
明るい14

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つのVMが実行されています。

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 landの各VM内から「ifconfig」する必要があるという問題を解決します。

Larsのブログ投稿では、libvirtが新しいVMを開始または停止するときに、独自の/ etc / hostsファイルを「自動更新」する方法も示しています。これにより、手動で192.168.122.xアドレスを見つける必要なく、ssh myname @ fedora20vmやssh myname @ debian6vmのようなことができます。

〜/ .ssh / configオプションを吐き出すスクリプト(VMでgithubを使用する場合、Agent Forwardingを使用する場合に非常に便利です)など、いくつかの非常に小さな機能拡張を追加しました。

https://github.com/donbright/virt-utils(削除されたように見えますか?)

また、dhclient.confを編集して「host-name xxxxx」を送信する方法は、実際にdhclient.confを標準的な方法で使用するシステムでのみ機能することにも注意してください。たとえば、Mageiaにはdhclientがどのように機能するかという珍しい設定があるため、単純な指示は必ずしも機能しません。ただし、Larsの方法では、ゲストOSのdhcpセットアップのregarldessで動作します。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

関心のあるフィールドは3番目と4番目の列です。3番目のフィールドにはVMのIPv4アドレスが含まれ、4番目のフィールドにはVMのアスタリスクまたはホスト名が含まれます。これは、ゲストがdnsmasqサービスプロセスに送信するDHCP応答に依存します。


これに感謝します。私のubuntuマシンでは、ファイルは/var/lib/libvirt/dnsmasq/default.leasesであり、dhclient.confファイルはホスト名「myvirtmachine」を送信するように設定されています。上記のように
明るい14

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では動作しません
-reox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.