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

Вопрос или проблема

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

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

virsh edit vm1

существует также блок <network>, и я пытался настроить сетевой интерфейс оттуда, но, к сожалению, гостевая ВМ, похоже, его не использует и, таким образом, остается офлайн для сети (так как она использует только автоматическую настройку сети)… Гостевые ВМ основаны как на 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    # Вероятно, "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.13"/>
</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
virsh net-update default add ip-dhcp-host '<host mac="52:54:00:6c:3c:01" name="guestname" ip="192.168.122.4"/>'

Если вы используете GUI Virt Virtual Machine Manager, тогда вам возможно потребуется также указать URI подключения.

virsh -c qemu:///system net-update default add ip-dhcp-host '<host mac="52:54:00:6c:3c:01" name="guestname" ip="192.168.122.4"/>'

Изменения обычно происходят сразу. См. manpage virsh для получения более подробной информации о net-update. Пожалуйста, проголосуйте за.

.

Ответ или решение

Для решения задачи конфигурации статических IP-адресов для виртуальных машин под управлением KVM/libvirt, при использовании сетевого режима "мост", необходимо применить подход на основе DHCP-сервера. Рассмотрим подробно, как это сделать без изменений внутри самих гостевых систем, будь то Linux или Windows.

Шаги по настройке статического IP через DHCP

  1. Определение MAC-адресов виртуальных машин:
    Используйте следующую команду, чтобы извлечь MAC-адрес интересующей вас ВМ:

    virsh dumpxml vm1 | grep 'mac address'

    Это необходимо для создания записей в конфигурации DHCP.

  2. Редактирование сетевого интерфейса:

    • Выведите список сетей:
      virsh net-list
    • Отредактируйте нужную сеть (чаще всего это "default"):
      virsh net-edit default

      Внесите изменения в секцию <dhcp>, чтобы назначить статический IP-адрес, сопоставленный с MAC-адресом нужной ВМ. Пример:

      <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"/>
      </dhcp>
  3. Применение изменений:
    После изменения конфигурации сети, выполните следующие команды для перезапуска сети:

    virsh net-destroy default  
    virsh net-start default  

    Это необходимо для активации новых настроек DHCP.

  4. Перезапуск гостевых систем:
    Перезагрузите виртуальные машины или перезапустите сервис DHCP внутри них. Возможный пример для Linux:

    ifdown eth0 && ifup eth0

Альтернативные методы и советы

  • Использование virsh net-update: Этот инструмент позволяет вносить изменения в DHCP-конфигурацию без перезапуска сети.
    virsh net-update default add ip-dhcp-host '<host mac="52:54:00:6c:3c:01" name="vm1" ip="192.168.122.11"/>'
  • Использование сигнала -HUP для dnsmasq: В некоторых ситуациях можно отправить сигнал -HUP процессу dnsmasq, чтобы изменения вступили в силу без перезапуска libvirtd.

Заключение

Использование привязки статических IP-адресов через DHCP на хосте является надежным способом управлять сетевой конфигурацией виртуальных машин, не вмешиваясь непосредственно в их внутренние настройки. Это особенно полезно, если на хосте используются различные операционные системы с предопределенной сетевой конфигурацией. Этот подход значительно упрощает централизованное управление сетью в виртуализированной среде.

Помните, что точные команды и файлы конфигурации могут немного отличаться в зависимости от используемой версии программного обеспечения и GNU/Linux дистрибутива.

Оцените материал
Добавить комментарий

Капча загружается...