web-dev-qa-db-ja.com

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

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

考慮してください:

 rascher @ localhost:〜$ virsh -c qemu:/// system list --all 
 uriへの接続:qemu:/// system 
 Id Name State 
 ---------------------------------- 
 1 machine1 running 
 2 machine2 running 
-machine3 shut off 

私のネットワーク構成は次のようになります:

<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 
 Address 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に報告する豪華なスクリプトが必要ですか?

11
rascher

そのため、これを調査したところ、libvirtはゲストOSのDHCPおよびDNSを実行するために dnsmasq を使用していることがわかりました。

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

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

send Host-name "machine1"

これで、ホストOSからping machine1.

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

2
rascher

この機能はずっと前にリクエストされました。 libvirtは2つの新しいコマンド 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
10
Nehal J Wani

libvirtはdnsmasqを使用してゲストにDHCPを提供するため、/ var/lib/libvirtのリースファイルを介して/var/log/daemon.logまたはDigをトロールして、IPからホスト名へのマッピングを取得できます。

4
James

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自体が使用していますが、多数のユースケースでは「十分」であり、「ifconfig」を実行する必要があるという問題を解決します'dhcpランドの各VM内から。

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の方法では、ゲストOSのdhcpセットアップのVMに依存していないため、ホスト名の送信に依存していません。 libvirtのマシンマネージャー。

2
don bright

同じ問題が発生したため、次のスクリプトを作成しました。

#!/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
user48801

だから私はどのように言うリストを得ることができます:

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
blq

Ubuntuでは、DNSとDHCPサービスをVMに提供するためにdnsmasqが使用されます。ホスト上の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応答。

0
pefu

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アドレスを推測できます。

0
coanor