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

KVM / libvirt: как настроить статические гостевые IP-адреса на хосте виртуализации

Что я хотел бы сделать, так это установить конфигурацию сети для гостей (IP-адрес, подсеть, шлюз, широковещательный адрес) из хост-системы. Используемая сетевая настройка находится в bridge Режим. Как я могу настроить сеть с хоста, а не настраивать самого клиента на статическую конфигурацию сети?

Если я выполню:

virsh edit vm1

Eсть <network> block также, и я попытался настроить сетевой интерфейс оттуда, но, к сожалению, гостевая виртуальная машина, похоже, не использует его и, как таковая, отключена от сети (поскольку она использует только автоматическую конфигурацию сети) ... Гостевые виртуальные машины являются обеими , Linux и Windows. Любая помощь будет высоко ценится.

Если вы не хотите выполнять какие-либо настройки внутри гостя, то единственный вариант - это DHCP-сервер, который выдает статические IP-адреса. Если вы используете bridge режим, вероятно, это будет какой-то внешний DHCP-сервер. Обратитесь к его руководству, чтобы узнать, как обслуживать статическую аренду.

Но по крайней мере в форвардных режимах nat или route, вы можете использовать встроенный в libvirt dnsmasqd (Более свежие версии libvirtd поддерживают параметр dnsmasq "dhcp-hostsfile"). Вот как:

Сначала выясните 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-клиент, например ifdown eth0; ifup eth0)


Обновление: я вижу, что есть сообщения о том, что изменение может не вступить в силу после "virsh net-edit". В этом случае попробуйте это после редактирования:

virsh  net-destroy  $NETWORK_NAME  
virsh  net-start    $NETWORK_NAME  

... и перезапустите DHCP-клиент виртуальной машины.

Если это все еще не работает, возможно, вам придется

  • остановить службу libvirtd
  • убить все процессы dnsmasq, которые еще живы
  • запустить службу libvirtd

Примечание. Хост KVM не может заставить виртуальную машину с неизвестной ОС и неизвестной конфигурацией использовать определенную сетевую конфигурацию. Но если вы знаете, что виртуальная машина использует определенный протокол конфигурации сети, например 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