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

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

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

virsh edit vm1

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

3 ответа

Решение

Если вы не хотите выполнять какие-либо настройки в гостевой системе, тогда единственным вариантом является 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) упоминается этот неофициальный скрипт Perl, который автоматизирует весь процесс: https://gist.github.com/bendiken/032ea1bddb9ffafe98b4

Я сам не пробовал этот скрипт, потому что я понял, что файл hosts уже обновлен, и достаточно было просто отправить сигнал -HUP.

На хосте установлен Debian 7.8, а версии пакетов:

  • квм 1: 1.1.2 + dfsg-6 + deb7u8
  • qemu-kvm 1.1.2 + dfsg-6 + deb7u8
  • libvirt-bin 0.9.12.3-1 + deb7u1
Другие вопросы по тегам