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

31

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

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

virsh edit vm1

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

бета
источник
2
Разве передача IP-адресов через зарезервированную аренду DHCP невозможна?
MadHatter поддерживает Монику
Хм, наверное, но я бы хотел назначить ВМ № 1 для IP № 1, ВМ № 2 для IP № 2 и т. Д. (Вместо того, чтобы выдавать им случайный IP-адрес из моей аренды). Как вы думаете, было бы возможно настроить его так с DHCP? Если это так, я был бы рад попробовать этот подход.
бета
2
Я предлагаю переименовать вопрос в нечто вроде « KVM / libvirt: как настроить статические гостевые IP-адреса на хосте виртуализации »
Nils Toedtmann
1
Согласитесь с @NilsToedtmann, любая дополнительная информация об используемом гипервизоре, например, о базовой ОС и т. Д. Будет полезна. Могут быть дополнительные инструменты управления на основе ОС, чтобы помочь с настройкой сети для виртуализированных систем. На KVM и LXC есть отличные руководства для использования с операционными системами на основе SUSE, которые могут использовать YaST.
Мэтт

Ответы:

52

Если вы не хотите выполнять какие-либо настройки в гостевой системе, тогда единственным вариантом является 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.

Нильс Тёдтманн
источник
Спасибо, я попробую и сообщу, получу ли я так.
бета
Круто. Но вам придется изменить режим сети.
Нильс Тёдтманн
1
Я пришел сюда, потому что у меня есть аналогичная потребность, и я думаю, что могу объяснить преимущество по сравнению с использованием DHCP, по крайней мере, для моего случая использования. Ситуация по общему признанию необычна. У меня есть сервер, который перемещается между двумя сетями каждые две недели. Он имеет около 10 гостей. В одной из сетей есть DHCP-сервер (который мне сложно контролировать), в другой - нет. Это в значительной степени исключает использование DHCP. Я ищу способ изменить IP-адрес хоста и автоматически обновлять гостевые IP-адреса и т. Д. На основе этого (я использую chef для автоматизации, поэтому, как только IP-адреса настроены, я готов к работе).
Кевин Кин
2
Я могу подтвердить, что изменения не вступают в силу без разрушения и перезапуска сети. Я также обнаружил, что, как ни странно, мне пришлось завершить работу, а затем запустить ВМ. Просто перезагрузка оставила интерфейс в неисправном состоянии.
orodbhen
Перезапуск сети не возобновляет аренду DHCP. Для этого вам нужно удалить файл состояния сети в / var / lib / libvirtd / dnsmasq
orodbhen
3

Мне удалось 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, а версии пакетов:

  • квм 1: 1.1.2 + dfsg-6 + deb7u8
  • qemu-kvm 1.1.2 + dfsg-6 + deb7u8
  • libvirt-bin 0.9.12.3-1 + deb7u1
Стефано Раго
источник