Отримати список клієнтів DHCP за допомогою KVM + libvirt?


11

У мене кілька віртуальних машин, що працюють на Ubuntu 9.10 через KVM + libvirt. Я хочу мати можливість дізнатися IP-адресу, призначену кожному хосту, не відкриваючи фізично "консоль" для кожної машини та не звертаючись до неї ifconfig.

Поміркуйте:

rascher @ localhost: ~ $ virsh -c qemu: /// список систем --all
Підключення до системи uri: qemu: ///
 Ідентифікаційний стан
----------------------------------
  1 машина1 працює
  2 машина2 працює
  - machine3 вимкнено

Моя мережна конфігурація виглядає так:

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

Тож як я можу отримати список, який говорить:

машина1 IP-адреса = 192.168.122.16
machine2 IP-адреса = 192.168.122.238
...

Я грав з arp:

rascher @ localhost: ~ $ arp
Адреса HWtype HWaddress прапор маски Iface
192.168.122.238 ефір 00: 16: 36: 00: 61: b0 C virbr0
192.168.122.16 ефір 00: 16: 36: 52: e8: 9c C virbr0
...

Але це не збігається з ідентифікатором віртуальної машини.

Чи є якийсь інструмент (за допомогою командного рядка virshчи virt-*), я можу з’ясувати цю інформацію? Або мені потрібно мати якийсь фантазійний скрипт, який працює на кожній окремій машині VM, перевіряє власний IP-адресу та повідомляє про нього в хост-операційній системі?

Відповіді:


10

Ця функція була запрошена давно. Тепер libvirt підтримує його, надаючи дві нові команди: 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

4

libvirt використовує dnsmasq для надання DHCP гостям, тож ви можете перейти /var/log/daemon.log або викопати файл оренди в / var / lib / libvirt, щоб отримати IP-адресу для відображення імені хоста.


2

Отже, досліджуючи це, я виявив, що libvirt використовує dnsmasq для того, щоб робити DHCP і DNS для гостьових ОС.

І dnsmasq встановить ім'я хоста в таблиці DNS хостів на основі того, яке ім'я хоста воно отримає від гостя.

Отже, згідно з цими інструкціями та великою кількістю googling, мені просто потрібно було створити та додати це до /etc/dhclient.conf:

send host-name "machine1"

Тепер, з моєї ОС хоста, я можу ping machine1.

Хтось знає, чому мені потрібно додати кінцевий "". щоб вирішити запис DNS? Як я можу це змінити?


1
Без кінцевої крапки ваш DNS-резолютор додасть свій список пошукових доменів до імені хоста під час пошуку. Натомість ви можете надіслати FQDN, наприклад machine1.example.com, а потім додати example.com до свого порядку пошуку DNS.
Джеймс

спасибі за це. однак пов’язані примітки говорять про те, щоб перейти на головну машину хосту та відредагувати /etc/resolv.conf та додати 192.168.122.1 як сервер першого імені (тобто додати libvirt dnsmasq як NS), що, звичайно, не працює на більшості сучасних Linux У наші дні існує декілька абстракцій мережі, які переписують /etc/resolv.conf. притулок ще не зрозумів.
нехай яскравий

2

У мене була така ж проблема, тому я створив такий сценарій:

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

Ларс Келлог-Стедман створив набір сценаріїв для автоматизації деяких з цього процесу. Він називає це 'virt-утиліти'.

Він описує це у своїй публікації в блозі тут: 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. Наприклад, на моїй машині у мене працює 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

Зауважте, це не ім'я хоста, яке використовує сам VM, але для великої кількості випадків використання це буде "досить добре" і вирішує проблему з необхідністю "ifconfig" зсередини кожного VM у dhcp.

Публікація в блозі Ларса також показує спосіб для цього "автоматичного оновлення" власного файлу / etc / hosts, коли запускається libvirt та / або зупиняється нові VM. Це дозволяє вам робити такі речі, як ssh myname @ fedora20vm або ssh myname @ debian6vm, не знаходячи вручну адреси 192.168.122.x.

Я додав декілька дуже незначних удосконалень, як-от сценарій, який виплюнув деякі параметри ~ / .ssh / config (дуже зручно для використання github у віртуальних машинах, через Agent Forwarding), ось тут:

https://github.com/donbright/virt-utils (здається, видалено?)

Я також хотів би зазначити, що метод редагування dhclient.conf для 'відправлення імені хоста xxxxx' працює лише в системах, які фактично використовують dhclient.conf у стандартному порядку. Наприклад, Mageia має незвичну настройку того, як працює dhclient, тому прості інструкції обов'язково не працюють. Однак, за допомогою методу Ларса, він спрацьовує повагою налаштування гостьової ОС'h dhcp, оскільки він не покладається на VM, щоб надіслати його ім'я хоста - він використовує 'доменні імена' у менеджера машини libvirt.


1

Тож як я можу отримати список, який говорить:

машина1 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

хоча це трохи більше, ніж ви просили


0

У Ubuntu dnsmasq використовується для надання послуг DNS та DHCP для VM. Процеси 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

Цікаві вам поля - третій та четвертий стовпці: третє поле містить IPv4 адресу VM, а четверте поле або містить зірочку або ім'я хоста VM. Це залежить від відповіді DHCP, надісланої гостем до процесу обслуговування dnsmasq.


спасибі за це. на моїй машині ubuntu файл /var/lib/libvirt/dnsmasq/default.leases з набором файлу dhclient.conf для надсилання імені хоста "myvirtmachine"; як зазначено вище
нехай яскравий

0

Ви можете змінити defaultвизначення мережі, зіставити MAC на IP в межах 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)

Після запуску гостя ви можете перелічити MAC-адресу всіх гостей через

# virsh list --all --mac

Відповідно до останнього байту MAC-адреси, ви можете зробити IP-адресу гостя.


для якої версії вирша це має працювати? virsh list --all --macне працює у версії 3.0.0
reox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.