Вопрос или проблема
Я хотел бы настроить конфигурацию сети для гостей (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
-
Определение MAC-адресов виртуальных машин:
Используйте следующую команду, чтобы извлечь MAC-адрес интересующей вас ВМ:virsh dumpxml vm1 | grep 'mac address'
Это необходимо для создания записей в конфигурации DHCP.
-
Редактирование сетевого интерфейса:
- Выведите список сетей:
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>
- Выведите список сетей:
-
Применение изменений:
После изменения конфигурации сети, выполните следующие команды для перезапуска сети:virsh net-destroy default virsh net-start default
Это необходимо для активации новых настроек DHCP.
-
Перезапуск гостевых систем:
Перезагрузите виртуальные машины или перезапустите сервис 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 дистрибутива.