KVM /libvirt: как настроить статические гостевые IP-адреса на хосте виртуализации
Что я хотел бы сделать, так это настроить конфигурацию гостевой сети (IP-адрес, подсеть, шлюз, широковещательный адрес) из хост-системы. Используемая настройка сети находится в режиме bridge
. Как настроить сеть с хоста, а не настраивать сам клиент на статическую конфигурацию сети?
Если я выполняю:
virsh edit vm1
есть блок <network>
, и я попытался настроить сетевой интерфейс оттуда, но, к сожалению, гостевая VM не похоже, использует его и как таковой не подключен к сети (поскольку он использует только автоматическую настройку сети) ... Гостевые виртуальные машины - это как Linux, так и Windows. Любая помощь будет высоко оценена.
3 ответа
Если вы не хотите выполнять какую-либо конфигурацию внутри гостевой системы, единственным вариантом является DHCP-сервер, который передает статические IP-адреса. Если вы используете режим bridge
, вероятно, будет какой-то внешний DHCP-сервер. Проконсультируйтесь с его руководством, чтобы узнать, как обслуживать статическую аренду.
Но, по крайней мере, в режимах прямого доступа nat
или route
, вы можете использовать встроенный «dnsmasq» libvirt (более поздние версии libvirtd поддерживают параметр dhcp-hostsfile dnsmasq). Вот как:
Сначала найдите MAC-адреса виртуальных машин, которые вы хотите назначить статическим IP-адресам:
virsh dumpxml $VM_NAME | grep 'mac address'
Затем отредактируйте сеть
virsh net-list
virsh net-edit $NETWORK_NAME # Probably "default"
Найдите раздел <dhcp>
, ограничьте динамический диапазон и добавьте записи хоста для своих виртуальных машин
<dhcp>
<range start='192.168.122.100' end='192.168.122.254'/>
<host mac='52:54:00:6c:3c:01' name='vm1' ip='192.168.122.11'/>
<host mac='52:54:00:6c:3c:02' name='vm2' ip='192.168.122.12'/>
<host mac='52:54:00:6c:3c:03' name='vm3' ip='192.168.122.12'/>
</dhcp>
Затем перезагрузите свою виртуальную машину (или перезапустите свой DHCP-клиент, например ipdown eth0; ifup eth0
)
Обновление: я вижу, что есть сообщения о том, что изменение может не вступить в силу после «virsh net-edit». В этом случае попробуйте это после редактирования:
virsh net-destroy $NETWORK_NAME
virsh net-start $NETWORK_NAME
... и перезагрузите DHCP-клиент VM.
Если это все еще не работает, возможно, вам придется
- остановить службу libvirtd
- убить любые процессы dnsmasq, которые все еще живы
- запустите службу libvirtd
Примечание. Хост KVM не может заставить виртуальную машину с неизвестной ОС и неизвестной конфигурацией использовать определенную сетевую конфигурацию. Но если знаете, что VM использует определенный сетевой протокол конфигурации - скажем, DHCP - вы можете это использовать. Это то, что предполагает этот пост.
Некоторая ОС (например, некоторые дистрибутивы Linux) также позволяет передавать сетевые параметры конфигурации в гостевой, например. через командную строку ядра. Но это очень специфично для ОС, и я не вижу преимуществ по сравнению с методом DHCP.
virsh net-update
- хорошая команда для вас (вам не нужно перезапускать /уничтожать сеть и т. д.)
видеть:
https://www.redhat.com/archives/libvir-list /2012-September/msg01380.html
Я смог сделать dnsmasq
'видеть' вновь добавленное сопоставление IP-MAC, просто отправив -HUP
для процесса dnsmasq
. После этого перезагрузка нового гостя была достаточной, чтобы иметь правильный IP-адрес, без необходимости перезапускать libvirtd
, а также сама сеть.
Официальная документация libvirt ( http://wiki.libvirt.org/page/Networking# Applying_modifications_to_the_network ) упоминает этот неофициальный скрипт Perl, который автоматизирует весь процесс: https://gist.github.com/bendiken/032ea1bddb9ffafe98b4
Я сам не пробовал этот сценарий, потому что понял, что файл hosts уже был обновлен, и достаточно просто отправить сигнал -HUP.
В хосте используется Debian 7.8 и версии пакетов:
- kvm 1: 1.1.2 + dfsg-6 + deb7u8
- qemu-kvm 1.1.2 + dfsg-6 + deb7u8
- libvirt-bin 0.9.12.3-1 + deb7u1