Назад | Перейти на главную страницу

Получить список DHCP-клиентов с помощью KVM + libvirt?

У меня есть несколько виртуальных машин, работающих на Ubuntu 9.10 через KVM + libvirt. Я хочу иметь возможность узнать IP-адрес, назначенный каждому хосту, без физического открытия физической «консоли» для каждой машины и вызова ifconfig.

Рассматривать:

rascher@localhost:~$ virsh -c qemu:///system list --all
Connecting to 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 address = 192.168.122.16
machine2 IP address = 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
...

Но это не соответствует идентификатору виртуальной машины.

Есть ли какой-нибудь инструмент (через командную строку, virsh или virt-*) Я могу удостовериться в этой информации? Или мне нужен какой-то необычный скрипт, который запускается на каждой отдельной виртуальной машине, проверяет свой IP-адрес и отправляет его обратно в ОС хоста?

Эта функция была запрошена давно. Теперь 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

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

Итак, исследуя это, я обнаружил, что libvirt использует dnsmasq чтобы сделать DHCP и DNS для гостевых ОС.

И dnsmasq установит имя хоста в таблице DNS хостов на основе имени хоста, полученного от гостя.

Итак, в соответствии с эти инструкции и много поиска в Google, мне просто нужно было создать и добавить это в /etc/dhclient.conf:

send host-name "machine1"

Теперь в моей основной ОС я могу ping machine1.

Кто-нибудь знает, почему мне нужно добавить завершающий "." для разрешения записи DNS? Как я могу это изменить?

У меня была такая же проблема, поэтому я создал следующий сценарий:

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

Ларс Келлог-Стедман создал набор скриптов для автоматизации некоторых из этих процессов. Он называет это «virt-utils».

Он описывает это в своем блоге здесь: http://blog.oddbit.com/2013/10/04/automatic-dns-entrie/

У него также есть гитхаб с некоторыми из написанных им скриптов:

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

Вы можете просто запустить это:

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

и вы получите список каждой виртуальной машины по ее «доменному имени» в диспетчере виртуальных машин libvirt. Например, на моей машине работает 3 виртуальных сервера.

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

Обратите внимание, что это не «имя хоста», которое использует сама виртуальная машина, но для большого количества случаев использования оно будет «достаточно хорошим» и решит проблему необходимости «ifconfig» из каждой виртуальной машины в dhcp land.

Сообщение в блоге Ларса также показывает способ «автоматического обновления» вашего собственного файла / etc / hosts, когда libvirt запускает и / или останавливает новые виртуальные машины. Это позволяет вам делать такие вещи, как ssh myname @ fedora20vm или ssh myname @ debian6vm, без необходимости искать адреса 192.168.122.x вручную.

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

https://github.com/donbright/virt-utils (кажется, удален?)

Я также хотел бы отметить, что метод редактирования dhclient.conf для «отправки имени хоста xxxxx» работает только в системах, которые фактически используют dhclient.conf стандартным образом. Mageia, например, имеет необычную настройку того, как работает dhclient, поэтому простые инструкции не обязательно будут работать. Однако с методом Ларса он работает независимо от настройки dhcp гостевой ОС, потому что он не полагается на виртуальную машину для отправки имени хоста - он использует «доменные имена» в диспетчере машин libvirt.

Итак, как мне получить список, в котором говорится:

IP-адрес машины1 = 192.168.122.16

IP-адрес машины2 = 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 dnsmasq используется для предоставления виртуальным машинам служб DNS и DHCP. Процессы 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-адрес виртуальной машины, а четвертое поле содержит либо звездочку, либо имя хоста виртуальной машины. Это зависит от ответа DHCP, отправленного гостем процессу службы dnsmasq.

Вы можете изменить 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-адрес гостя.