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

11

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

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

rascher @ localhost: ~ $ virsh -c qemu: /// системный список - все
Подключение к системе uri: qemu: ///
 Id Name State
----------------------------------
  1 машина1 работает
  2 машины2 работает
  - машина3 отключена

Моя конфигурация сети выглядит так:

<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-адрес = 192.168.122.16
machine2 IP-адрес = 192.168.122.238
...

Я играл с arp:

rascher @ localhost: ~ $ arp
Адрес HWtype HWaddress Flags Mask 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-*), я могу узнать эту информацию? Или мне нужен какой-нибудь причудливый скрипт, который запускается на каждой отдельной виртуальной машине, проверяет ее собственный 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 хостов в зависимости от того, какое имя хоста получит от гостя.

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

send host-name "machine1"

Теперь, с моей операционной системы, я могу ping machine1.

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

Рашер
источник
1
Без конечной точки ваш DNS-распознаватель добавит свой список поисковых доменов к имени хоста при поиске. Вместо этого вы можете отправить полное доменное имя, например 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-utils».

Он описывает это в своем блоге здесь: 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

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

В блоге Lars также показан способ «автоматического обновления» вашего собственного файла / 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.

не яркий
источник
1

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

machine1 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

хотя это немного больше, чем вы просили

BLQ
источник
0

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

pefu
источник
Спасибо за это. на моей машине с 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-адрес гостя.

coanor
источник
для какой версии virsh это должно работать? virsh list --all --macне работает в версии 3.0.0
reox