Как я могу найти IP виртуальной машины на KVM(используя Nmap)? Если нет, есть ли в Libvirt какие-либо функции для этого?
6 ответов
Быстрый и грязный пример для KVM на Centos 63 x86_64. Короткий пинг в фоновом режиме для всех возможных IP-адресов, которые могут иметь виртуальные машины в этом сегменте
for i in {1..249}
do
ping -c 1 -n -q -r -t 1 -s 1 -W 1 192.168.100.$i > /dev/null &
done
Извлеките имена и MAC-адреса виртуальных машин через virsh и извлеките IP из таблицы ARP
for name in `virsh list | grep running | awk '{ print $2 }'`
do
printf "\n$name\n "
arp -e | grep "`virsh dumpxml $name | grep "mac address"|sed "s/.*'\(.*\)'.*/\1/g"`" |
awk '{ printf $1 ; printf " " ; printf $3 }'
done
После долгих часов грязных рук я наткнулся на эту эпическую ссылку.
- Получите MAC-адрес виртуальной машины из файла конфигурации виртуальной машины (поскольку я использую KVM, я запросил XML-файл для MAC-адреса).
- Затем используйте arp -a, получите все MAC-адреса и адреса интерфейсов и сохраните их в файле.
- Запросите файл для MAC-адреса виртуальной машины с шага 1.
Я написал сценарий bash для этого, но также отфильтровал машины с именем "swarm" на них. Вы можете удалить фильтр или изменить его при необходимости. (удалить | grep "swarm"
) Вы можете использовать это как полный скрипт или скопировать и вставить один вкладыш из него:
#!/usr/bin/env bash
# we make assumption that the VM's we want have the word swarm in their name. Edit for different name or to get all unfiltered names
for i in $(virsh list | grep "swarm" | awk '{print $2;}' ); do virsh domifaddr $i | sed 3q | sed '$!d' |awk '{print $4}' ; done;
Составными частями являются команды virsh, virsh list
для получения списка всех виртуальных машин , а затем в цикле for вызов domifaddr <VM NAME>
для получения его ip-адреса. Все остальное - отфильтровать текст по одному IP-адресу в строке. Я написал / запустил это на сервере Ubuntu KVM 15.10
При запуске с qemu-kvm
и опцией --nographic
вы можете использовать ctrl-a
c
чтобы получить монитор qemu (своего рода оболочка для мониторинга и управления виртуальными машинами).
Команда info network
выдаст информацию о сетевом подключении, включая MAC-адрес.
Команда info usernet
показывает информацию о мостах : например, как гостевой порт отображается на порт хоста. Эта информация часто включает в себя гостевой IP.
пример
Запустите vm с некоторой переадресацией порта tcp:
qemu-kvm -cpu host -m 1024 -hda ~/myvm.qcow -net user,hostfwd=tcp::10022-:22 -net nic -nographic
после ctrl-a
c
команды info network
и info usernet
дают
(qemu) info network
hub 0
\ hub0port1: e1000.0: index=0,type=nic,model=e1000,macaddr=58:44:00:22:11:
\ hub0port0: user.0: index=0,type=user,net=10.0.2.0,restrict=off
(qemu) info usernet
VLAN 0 (user.0):
Protocol[State] FD Source Address Port Dest. Address Port RecvQ S
TCP[HOST_FORWARD] 13 * 10022 10.0.2.15 22 0
Ссылка: QEMU-doc на wiki.qemu.org.
С помощью команды virt-cat вы можете запросить все файлы на виртуальной машине. Например, файл аренды dhcp:
virt-cat -d your_domain /var/lib/dhcp/dhclient.eth0.leases
Я написал скрипт get-vm-ip
(который вы можете скачать с https://github.com/earlruby/create-vm/blob/master/get-vm-ip), который использует его для получения IP:
HOSTNAME=[your vm name]
MAC=$(virsh domiflist $HOSTNAME | awk '{ print $5 }' | tail -2 | head -1)
arp -a | grep $MAC | awk '{ print $2 }' | sed 's/[()]//g'
Команда virsh получает MAC-адрес, последняя строка находит IP-адрес с помощью arp
.