Dapatkan daftar klien DHCP dengan KVM + libvirt?


11

Saya memiliki beberapa VM yang berjalan di Ubuntu 9,10 melalui KVM + libvirt. Saya ingin dapat mengetahui alamat IP yang telah ditetapkan untuk setiap host tanpa secara fisik membuka "konsol" fisik untuk setiap mesin dan memohon ifconfig.

Mempertimbangkan:

rascher @ localhost: ~ $ virsh -c qemu: /// daftar sistem --all
Menghubungkan ke uri: qemu: /// system
 Status Nama Id
----------------------------------
  1 mesin1 berjalan
  2 mesin2 berjalan
  - machine3 dimatikan

Konfigurasi jaringan saya terlihat seperti:

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

Jadi bagaimana saya bisa mendapatkan daftar yang mengatakan:

machine1 alamat IP = 192.168.122.16
alamat IP machine2 = 192.168.122.238
...

Saya bermain dengan arp:

rascher @ localhost: ~ $ arp
Alamat 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
...

Tapi ini tidak memetakan ke ID mesin virtual.

Apakah ada alat (melalui baris perintah, virshatau virt-*) saya dapat memastikan informasi ini? Atau apakah saya perlu memiliki beberapa skrip mewah yang berjalan pada masing-masing VM, memeriksa IP sendiri, dan melaporkannya kembali ke host OS?

Jawaban:


10

Fitur ini sudah lama diminta. Sekarang libvirt mendukungnya dengan memberikan dua perintah baru: domifaddr dan 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

Dalam skenario yang berbeda:

 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 menggunakan dnsmasq untuk menyediakan DHCP kepada para tamu, sehingga Anda dapat menjaring / var / log /daemon.log atau menggali melalui file sewa di / var / lib / libvirt untuk mendapatkan IP untuk pemetaan nama host.


2

Jadi, ketika menyelidiki ini, saya menemukan bahwa libvirt menggunakan dnsmasq untuk melakukan DHCP dan DNS untuk OS tamu.

Dan dnsmasq akan mengatur nama host di tabel DNS host berdasarkan pada nama host apa pun yang diterimanya dari tamu.

Jadi sesuai dengan instruksi ini dan banyak googling, saya hanya perlu membuat dan menambahkan ini ke /etc/dhclient.conf:

send host-name "machine1"

Sekarang, dari OS host saya, saya bisa ping machine1.

Adakah yang tahu mengapa saya perlu menambahkan jejak "." agar entri DNS dapat diselesaikan? Bagaimana saya bisa mengubahnya?


1
Tanpa trailing dot, resolver DNS Anda akan menambahkan daftar domain pencarian itu ke nama host ketika pencarian dilakukan. Anda bisa mengirim FQDN sebagai gantinya, mis. Machine1.example.com dan kemudian menambahkan example.com ke pesanan pencarian DNS Anda.
James

Terima kasih untuk ini. namun catatan yang terhubung mengatakan untuk masuk ke mesin host utama dan mengedit /etc/resolv.conf dan menambahkan 192.168.122.1 sebagai server nama pertama (yaitu menambahkan libvirt dnsmasq sebagai NS), yang tentu saja tidak bekerja pada kebanyakan linux modern seperti ada beberapa abstraksi saat ini dari jaringan yang menulis ulang /etc/resolv.conf. Belum punya milikku cukup tahu.
don bright

2

Saya memiliki masalah yang sama sehingga saya membuat skrip berikut:

#!/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 telah membuat satu set skrip untuk mengotomatisasi beberapa proses ini. Dia menyebutnya 'kebajikan'.

Dia menjelaskannya di posting blognya di sini: http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/

Dia juga memiliki github dengan beberapa skrip yang ditulisnya, di sini:

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

Anda pada dasarnya dapat menjalankan ini:

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

dan Anda akan mendapatkan daftar setiap mesin virtual dengan "nama domain" di dalam virtual-machine-manager libvirt. Sebagai contoh, pada mesin saya, saya memiliki 3 vms berjalan.

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

Catatan, ini bukan 'hostname' yang digunakan oleh VM itu sendiri, tetapi untuk sejumlah besar kasus penggunaan, ini akan menjadi 'cukup baik' dan memecahkan masalah karena harus 'ifconfig' dari dalam setiap VM di lahan dhcp.

Posting blog Lars juga menunjukkan cara ini untuk 'memperbarui secara otomatis' file Anda sendiri / etc / hosts ketika libvirt memulai dan / atau menghentikan VM baru. Ini memungkinkan Anda melakukan hal-hal seperti ssh myname @ fedora20vm atau ssh myname @ debian6vm tanpa harus menemukan alamat 192.168.122.x dengan tangan.

Saya telah menambahkan beberapa perangkat tambahan yang sangat kecil, seperti skrip untuk meludahkan beberapa opsi ~ / .ssh / config (sangat berguna untuk menggunakan github di VM, melalui Agen Forwarding), di sini:

https://github.com/donbright/virt-utils (tampaknya dihapus?)

Saya juga ingin mencatat bahwa metode pengeditan dhclient.conf untuk 'mengirim nama host xxxxx' hanya berfungsi pada sistem yang benar-benar menggunakan dhclient.conf dengan cara standar. Mageia, misalnya, memiliki pengaturan yang tidak biasa tentang cara kerjanya dhclient, jadi instruksi sederhana tidak selalu bekerja. Namun, dengan metode Lars, ia berfungsi dengan sangat baik dari pengaturan dhcp OS tamu, karena ia tidak mengandalkan VM untuk mengirim nama hostnya - ia menggunakan 'nama domain' di dalam manajer mesin libvirt.


1

Jadi bagaimana saya bisa mendapatkan daftar yang mengatakan:

machine1 alamat IP = 192.168.122.16

alamat IP machine2 = 192.168.122.238

setidaknya pada fedora Anda bisa mendapatkan informasi itu dengan cara ini:

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

memiliki output yang mirip dengan:

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

Meskipun itu sedikit lebih dari yang Anda minta


0

Di Ubuntu, dnsmasq digunakan untuk menyediakan layanan DNS dan DHCP ke para VM. Proses dnsmasq pada host menyimpan sewa mereka dalam file ini:

/var/lib/misc/dnsmasq.leases

Ini adalah file teks normal dan baris di dalamnya mungkin terlihat mirip dengan ini di sini:

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

Bidang yang menarik bagi Anda adalah kolom ketiga dan keempat: bidang ketiga berisi alamat IPv4 dari VM dan bidang keempat berisi asterisk atau nama host dari VM. Ini tergantung pada balasan DHCP yang dikirim oleh tamu ke proses layanan dnsmasq.


Terima kasih untuk ini. pada mesin ubuntu saya file tersebut adalah /var/lib/libvirt/dnsmasq/default.leases dengan file dhclient.conf diatur untuk mengirim nama host "myvirtmachine"; seperti yang tercantum di atas
jangan terang

0

Anda dapat mengubah defaultdefinisi jaringan, memetakan MAC ke IP dalam 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)

Setelah Anda memulai tamu, Anda dapat mendaftar semua alamat MAC tamu melalui

# virsh list --all --mac

Menurut byte terakhir dari alamat MAC, Anda dapat menyimpulkan alamat IP tamu.


untuk versi virsh apa ini bisa berfungsi? virsh list --all --mactidak bekerja dalam versi 3.0.0
reox
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.