У меня есть несколько виртуальных машин, работающих на 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-адрес гостя.