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に報告する豪華なスクリプトが必要ですか?
そのため、これを調査したところ、libvirtはゲストOSのDHCPおよびDNSを実行するために dnsmasq を使用していることがわかりました。
そして、dnsmasqは、ゲストから受け取ったホスト名に基づいて、ホストのDNSテーブルにホスト名を設定します。
したがって、 these の指示と多くのグーグルに従って、これを作成して/etc/dhclient.confに追加するだけで済みました。
send Host-name "machine1"
これで、ホストOSからping machine1.
末尾に「。」を追加する必要がある理由を誰かが知っていますか? DNSエントリが解決するために?どうすれば変更できますか?
この機能はずっと前にリクエストされました。 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
libvirtはdnsmasqを使用してゲストにDHCPを提供するため、/ var/lib/libvirtのリースファイルを介して/var/log/daemon.logまたはDigをトロールして、IPからホスト名へのマッピングを取得できます。
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のマシンマネージャー。
同じ問題が発生したため、次のスクリプトを作成しました。
#!/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
だから私はどのように言うリストを得ることができます:
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
それはあなたが求めたよりも少し多いですが
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応答。
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アドレスを推測できます。