Uzyskaj listę klientów DHCP z KVM + libvirt?


11

Mam kilka maszyn wirtualnych działających na Ubuntu 9.10 za pośrednictwem KVM + libvirt. Chcę móc znaleźć adres IP przypisany do każdego hosta bez fizycznego otwierania fizycznej „konsoli” na każdym komputerze i wywoływania ifconfig.

Rozważać:

rascher @ localhost: ~ $ virsh -c qemu: /// lista systemowa --all
Łączenie z systemem uri: qemu: ///
 Stan nazwy identyfikatora
----------------------------------
  1 maszyna 1 pracuje
  2 maszyna 2 działa
  - maszyna3 wyłączona

Moja konfiguracja sieci wygląda następująco:

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

Jak mogę uzyskać listę, która mówi:

adres IP maszyny1 = 192.168.122.16
adres IP maszyny2 = 192.168.122.238
...

Grałem z arp:

rascher @ localhost: ~ $ arp
Adres HWtype HWaddress Flags Mask Iface
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
...

Ale to nie jest mapowane na identyfikator maszyny wirtualnej.

Czy jest jakieś narzędzie (za pomocą wiersza polecenia virshlub virt-*) Mogę ustalić te informacje? Czy też muszę mieć jakiś fantazyjny skrypt, który działa na każdej maszynie wirtualnej, sprawdza swój adres IP i zgłasza go z powrotem do systemu operacyjnego hosta?

Odpowiedzi:


10

Ta funkcja była wymagana od dawna. Teraz libvirt obsługuje go, udostępniając dwa nowe polecenia: domifaddr i net-dhcp-leasing

 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

W innym scenariuszu:

 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 używa dnsmasq do dostarczania DHCP gościom, dzięki czemu można przeszukiwać /var/log/daemon.log lub przeglądać plik dzierżawy w / var / lib / libvirt, aby uzyskać mapowanie adresu IP na nazwę hosta.


2

Tak więc, badając to, odkryłem, że libvirt używa dnsmasq do wykonywania DHCP i DNS dla systemów-gości.

I dnsmasq ustawi nazwę hosta w tabeli DNS hostów na podstawie dowolnej nazwy hosta otrzymanej od gościa.

Więc zgodnie z tymi instrukcjami i dużą ilością googlingów, po prostu musiałem stworzyć i dodać to do /etc/dhclient.conf:

send host-name "machine1"

Teraz z mojego hosta mogę ping machine1.

Czy ktoś wie, dlaczego muszę dodać końcowe „”. aby rozwiązać wpis DNS? Jak mogę to zmienić?


1
Bez kropki końcowej Twój program rozpoznawania nazw DNS dołącza swoją listę domen wyszukiwania do nazwy hosta podczas wyszukiwania. Zamiast tego możesz wysłać nazwę FQDN, np. Machine1.przyklad.com, a następnie dodać example.com do zamówienia wyszukiwania DNS.
James

dzięki za to. jednak połączone notatki mówią, aby przejść na główną maszynę hosta i edytować /etc/resolv.conf i dodać 192.168.122.1 jako pierwszy serwer nazw (tj. dodać libvirt dnsmasq jako NS), co oczywiście nie działa na większości współczesnych linuxów jako istnieje wiele abstrakcji współczesnych sieci, które przepisują /etc/resolv.conf. nie odkryłem jeszcze mojego.
don jasny

2

Miałem ten sam problem, więc utworzyłem następujący skrypt:

#!/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 stworzył zestaw skryptów automatyzujących część tego procesu. Nazywa to „virt-utils”.

Opisuje to w swoim blogu tutaj: http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/

Ma także github z kilkoma skryptami, które napisał tutaj:

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

Możesz po prostu uruchomić to:

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

a otrzymasz listę każdej maszyny wirtualnej według jej „nazwy domeny” w menedżerze maszyn wirtualnych libvirt. Na przykład na moim komputerze mam uruchomione 3 vms.

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

Zauważ, że nie jest to „nazwa hosta”, z której korzysta sama maszyna wirtualna, ale w przypadku dużej liczby przypadków użycia będzie „wystarczająco dobra” i rozwiązuje problem konieczności „ifconfig” z każdej maszyny wirtualnej na ziemi dhcp.

Publikowanie na blogu Larsa pokazuje również sposób na „automatyczną aktualizację” własnego pliku / etc / hosts, gdy libvirt uruchamia i / lub zatrzymuje nowe maszyny wirtualne. Umożliwia to wykonywanie takich czynności, jak ssh moja nazwa @ fedora20vm lub ssh moja nazwa @ debian6vm bez konieczności ręcznego wyszukiwania adresów 192.168.122.x.

Dodałem kilka bardzo drobnych usprawnień, takich jak skrypt wypluwający niektóre opcje ~ / .ssh / config (bardzo przydatne przy używaniu github na maszynach wirtualnych za pośrednictwem przekazywania agentów), tutaj:

https://github.com/donbright/virt-utils (wydaje się być usunięty?)

Chciałbym również zauważyć, że metoda edycji pliku dhclient.conf w celu wysłania nazwy hosta xxxxx działa tylko w systemach, które faktycznie używają pliku dhclient.conf w standardowy sposób. Na przykład Mageia ma nietypową konfigurację tego, jak działa dhclient, więc proste instrukcje niekoniecznie będą działać. Jednak dzięki metodzie Larsa działa ona ponownie w konfiguracji dhcp systemu operacyjnego gościa, ponieważ nie polega on na maszynie wirtualnej, aby wysłać jej nazwę hosta - używa „nazw domen” w menedżerze maszyn libvirt.


1

Jak mogę uzyskać listę, która mówi:

adres IP maszyny1 = 192.168.122.16

adres IP maszyny2 = 192.168.122.238

przynajmniej na fedorze możesz uzyskać te informacje w ten sposób:

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

ma wyjście podobne do:

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

chociaż to trochę więcej, niż prosiłeś


0

Na Ubuntu dnsmasq służy do dostarczania usług DNS i DHCP dla maszyn wirtualnych. Procesy dnsmasq na hoście przechowują swoje dzierżawy w tym pliku:

/var/lib/misc/dnsmasq.leases

To jest normalny plik tekstowy, a linie w nim mogą wyglądać podobnie do tego tutaj:

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

Pola zainteresowań to trzecia i czwarta kolumna: trzecie pole zawiera adres IPv4 maszyny wirtualnej, a czwarte pole zawiera gwiazdkę lub nazwę hosta maszyny wirtualnej. Zależy to od odpowiedzi DHCP wysłanej przez gościa do procesu usługi dnsmasq.


dzięki za to. na moim komputerze Ubuntu plik to /var/lib/libvirt/dnsmasq/default.leases z zestawem plików dhclient.conf do wysyłania nazwy hosta „myvirtmachine”; jak wymieniono powyżej
don jasny

0

Możesz zmienić defaultdefinicję sieci, mapować MAC na IP w xml:

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

Po uruchomieniu gościa możesz wyświetlić adres MAC wszystkich gości za pośrednictwem

# virsh list --all --mac

Zgodnie z ostatnim bajtem adresu MAC można wywnioskować adres IP gościa.


dla jakiej wersji Virsh to powinno działać? virsh list --all --macnie działa w wersji 3.0.0
reox
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.