KVM + libvirt ile DHCP istemcilerinin listesi alınsın mı?


11

KVM + libvirt aracılığıyla Ubuntu 9.10 üzerinde çalışan birkaç sanal makinem var. Her bir makineye fiziksel bir "konsol" açmadan ve çağırmadan, her ana bilgisayara atanan IP adresini bulmak istiyorum ifconfig.

Düşünmek:

rascher @ localhost: ~ $ virsh -c qemu: /// sistem listesi - tüm
Uri: qemu: /// sistemine bağlanma
 Kimlik Adı Durumu
----------------------------------
  1 makine1 koşu
  2 makine2 koşu
  - makine3 kapatıldı

Ağ yapılandırmam şöyle görünüyor:

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

Peki şöyle bir liste nasıl alabilirim:

makine1 IP adresi = 192.168.122.16
makine2 IP adresi = 192.168.122.238
...

Şununla oynadım arp:

rascher @ localhost: ~ $ arp
Adres HWtype HWaddress Bayrakları Iface Maskesi
192.168.122.238 eter 00: 16: 36: 00: 61: b0 C virbr0
192.168.122.16 eter 00: 16: 36: 52: e8: 9c C virbr0
...

Ancak bu, sanal bir makinenin kimliğiyle eşleşmez.

Bazı komutlar var mı (komut satırı üzerinden virshveya virt-*) Bu bilgiyi tespit edebilir miyim? Yoksa her bir VM'de çalışan, kendi IP'sini kontrol eden ve ana bilgisayar işletim sistemine rapor eden bazı süslü komut dosyalarına mı ihtiyacım var?

Yanıtlar:


10

Bu özellik uzun zaman önce istendi. Şimdi libvirt iki yeni komut sağlayarak destekliyor: domifaddr ve 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

Farklı bir senaryoda:

 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, misafirlere DHCP sağlamak için dnsmasq kullanır, böylece /var / log/daemon.log dosyasını trol edebilir veya / var / lib / libvirt dosyasındaki kiralamalar dosyasını kullanarak ana makine ad eşlemesine bir IP alabilirsiniz.


2

Bu yüzden, bunu araştırırken libvirt'in misafir işletim sistemleri için DHCP ve DNS yapmak için dnsmasq kullandığını buldum .

Ve dnsmasq ana bilgisayar adını, konuktan aldığı ana bilgisayar adına bağlı olarak ana bilgisayarın DNS tablosunda ayarlar.

Bu talimatlar ve çok fazla googling uyarınca , bunu sadece /etc/dhclient.conf dosyasına eklemem ve eklemem gerekiyordu:

send host-name "machine1"

Şimdi, ana bilgisayar işletim sistemimden ping machine1.

Herkes neden sondaki "." DNS girişinin çözülmesi için? Bunu nasıl değiştirebilirim?


1
Sondaki nokta olmadan, DNS çözümleyiciniz arama yaparken ana makine adına arama etki alanları listesini ekler. Bunun yerine bir FQDN gönderebilirsiniz, örneğin makine1.example.com ve ardından DNS arama siparişinize example.com ekleyebilirsiniz.
James

Bunun için teşekkürler. ancak bağlantılı notlar ana ana makineye gitmeyi ve /etc/resolv.conf dosyasını düzenlemeyi ve 192.168.122.1'i Birinci ad sunucusu olarak eklemeyi söyler (yani libvirt dnsmasq'ı NS olarak ekleyin); Günümüzde ağın /etc/resolv.conf dosyasını yeniden yazan birden fazla soyutlama vardır. Henüz benim çok iyi anladım.
don parlak

2

Ben aynı sorunu vardı bu yüzden aşağıdaki komut dosyası yarattı:

#!/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 bu sürecin bazılarını otomatikleştirmek için bir dizi senaryo hazırladı. Buna 'virt-utils' diyor.

Bunu blog yazısında şöyle anlatıyor: http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/

Ayrıca burada yazdığı bazı senaryolarla bir github var:

https://github.com/larsks/virt-utils

Temel olarak şunu çalıştırabilirsiniz:

git clone https://github.com/larsks/virt-utils 
cd virt-utils 
sudo make install 
virt-hosts

ve her sanal makinenin bir listesini libvirt'in sanal makine yöneticisinin içindeki "alan adı" ile alacaksınız. Örneğin, makinemde 3 vms çalışıyor.

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

Bu, VM'nin kendisinin kullandığı 'ana bilgisayar adı' değildir, ancak çok sayıda kullanım örneği için 'yeterince iyi' olacaktır ve dhcp arazisindeki her VM'den 'ifconfig' yapma sorununu çözer.

Lars'ın blog yazısı ayrıca libvirt yeni VM'leri başlatırken ve / veya durdururken kendi / etc / hosts dosyanızı 'otomatik güncellemenin' bir yolunu gösterir. Bu, 192.168.122.x adreslerini elle bulmak zorunda kalmadan ssh myname @ fedora20vm veya ssh myname @ debian6vm gibi şeyleri yapmanızı sağlar.

Bazı ~ / .ssh / config seçenekleri (Ajan Yönlendirme aracılığıyla VM'lerde github kullanmak için çok kullanışlı) tükürmek için bir komut dosyası gibi birkaç çok küçük geliştirmeler ekledim:

https://github.com/donbright/virt-utils (silinmiş gibi görünüyor mu?)

Ayrıca 'host-name xxxxx' göndermek için dhclient.conf düzenleme yönteminin sadece aslında standart olarak dhclient.conf kullanan sistemlerde çalıştığını belirtmek isterim. Örneğin Mageia, dhclient'in nasıl çalıştığına dair alışılmadık bir düzene sahiptir, bu nedenle basit talimatlar mutlaka çalışmaz. Bununla birlikte, Lars'ın yöntemiyle, konuk işletim sisteminin dhcp kurulumunun yeniden düzenlenmesi çalışır, çünkü ana bilgisayar adını göndermek için VM'ye güvenmiyor - libvirt'in makine yöneticisinde 'alan adlarını' kullanıyor.


1

Peki şöyle bir liste nasıl alabilirim:

makine1 IP adresi = 192.168.122.16

makine2 IP adresi = 192.168.122.238

en azından fedora'da bu bilgileri şu şekilde alabilirsiniz:

cat /var/lib/libvirt/dnsmasq/default.leases

aşağıdakine benzer bir çıktıya sahiptir:

1412006226 52:54:00:fe:b3:c0 192.168.122.117 coreos0 01:52:54:00:fe:b3:c0

bu senin istediğinden biraz daha fazla olmasına rağmen


0

Ubuntu'da dnsmasq, VM'lere DNS ve DHCP hizmetleri sağlamak için kullanılır. Ana bilgisayardaki dnsmasq işlemleri kiralarını bu dosyada saklar:

/var/lib/misc/dnsmasq.leases

Bu normal bir metin dosyasıdır ve içindeki satırlar şuna benzer görünebilir:

1362729847 52:54:de:ad:be:ef 192.168.122.254 vm-win7 01:52:54:de:ad:be:ef

İlgilendiğiniz alanlar üçüncü ve dördüncü sütundur: üçüncü alan VM'nin IPv4 adresini ve dördüncü alan ya yıldız işareti ya da VM'nin ana bilgisayar adını içerir. Bu, misafir tarafından dnsmasq hizmet sürecine gönderilen DHCP yanıtına bağlıdır.


Bunun için teşekkürler. ubuntu makinemde /var/lib/libvirt/dnsmasq/default.leases ana bilgisayar adı "myvirtmachine" göndermek için ayarlanmış dhclient.conf dosyası ile; yukarıda listelendiği gibi
don parlak

0

defaultAğ tanımını değiştirebilir, MAC içinde xml ile IP'yi eşleyebilirsiniz:

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

Bir konuğa başladıktan sonra tüm konuğun MAC adresini şu yolla listeleyebilirsiniz:

# virsh list --all --mac

Bir MAC adresinin son baytına göre, bir konuğun IP adresini çıkarabilirsiniz.


hangi virsh sürümü için bu işe yarıyor? virsh list --all --mac3.0.0 sürümünde çalışmıyor
reox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.