Как мигрировать виртуальные машины между хостами: миграция работающих ВМ в KVM
Миграция виртуальных машин между хостами – критически важная операция для обеспечения высокой доступности, балансировки нагрузки и обслуживания инфраструктуры. В этой статье мы подробно рассмотрим миграцию работающих виртуальных машин (live migration) в среде KVM (Kernel-based Virtual Machine). Мы изучим необходимые условия, инструменты и пошаговые инструкции, чтобы вы могли безопасно и эффективно переносить виртуальные машины между вашими хостами без прерывания их работы. Вы узнаете, как настроить сеть, проверить совместимость и выполнить миграцию с помощью командной строки и графических инструментов.
Содержание:
- Подготовка к миграции
- Настройка сети для миграции
- Проверка совместимости хостов
- Выполнение миграции с помощью virsh
- Диагностика и устранение проблем
Подготовка к миграции

Прежде чем приступить к миграции виртуальной машины, необходимо выполнить ряд подготовительных шагов, чтобы обеспечить успешное и бесперебойное перемещение. Ключевые аспекты подготовки включают проверку ресурсов, настройку общего хранилища (если необходимо) и настройку прав доступа. Правильная подготовка минимизирует риск возникновения проблем во время миграции и обеспечивает минимальное время простоя для вашей виртуальной машины.
Проверка доступности ресурсов
Убедитесь, что целевой хост имеет достаточно ресурсов (CPU, RAM, дисковое пространство) для размещения виртуальной машины. Недостаток ресурсов может привести к проблемам с производительностью или даже к сбою миграции. Проверьте загрузку CPU, использование памяти и свободное место на диске на обоих хостах.
Пример: Проверка использования ресурсов с помощью командыtop
top -b -n 1 | head -n 5
Эта команда отображает первые 5 строк вывода top
, показывая общую загрузку CPU, использование памяти и другие важные показатели. Параметр `-b` запускает top
в пакетном режиме, а `-n 1` указывает, что нужно выполнить только одну итерацию. Это удобно для автоматизации и скриптов.
df
df -h /var/lib/libvirt/images
Эта команда показывает использование дискового пространства для каталога `/var/lib/libvirt/images`, где обычно хранятся образы виртуальных машин. Опция `-h` делает вывод более читабельным, показывая размеры в человеко-понятном формате (например, GB, MB). Убедитесь, что на целевом хосте достаточно свободного места для хранения дисков виртуальной машины.
Настройка общего хранилища (если необходимо)
Если вы используете общее хранилище (например, NFS, iSCSI), убедитесь, что оно доступно и правильно настроено на обоих хостах. Общее хранилище упрощает миграцию, так как виртуальная машина продолжает использовать одни и те же диски, независимо от того, на каком хосте она запущена.
Пример: Монтирование NFS-шарыmount -t nfs 192.168.1.10:/exports/vm_images /var/lib/libvirt/images
Эта команда монтирует NFS-шару с IP-адресом 192.168.1.10 и путем `/exports/vm_images` в каталог `/var/lib/libvirt/images` на локальном хосте. Чтобы сделать монтирование постоянным, добавьте соответствующую запись в файл `/etc/fstab`.
Пример: Добавление записи в /etc/fstabecho "192.168.1.10:/exports/vm_images /var/lib/libvirt/images nfs defaults 0 0" >> /etc/fstab
Эта команда добавляет строку в файл `/etc/fstab`, которая указывает, как монтировать NFS-шару при загрузке системы. Опция `defaults` использует стандартные параметры монтирования, а `0 0` отключает резервное копирование и проверку файловой системы.
Настройка прав доступа
Убедитесь, что пользователь, от имени которого выполняется миграция, имеет необходимые права доступа на обоих хостах. Обычно это пользователь root или пользователь, входящий в группу libvirt. Недостаточные права доступа могут привести к ошибкам при попытке подключения к хосту или управлении виртуальными машинами.
Пример: Добавление пользователя в группу libvirtusermod -a -G libvirt your_username
Эта команда добавляет пользователя `your_username` в группу `libvirt`. После выполнения команды необходимо выйти из системы и снова войти, чтобы изменения вступили в силу.
Пример: Проверка членства в группеgroups your_username
Эта команда показывает список групп, в которых состоит пользователь `your_username`. Убедитесь, что в списке присутствует группа `libvirt`.
Настройка сети для миграции

Правильная настройка сети является критически важной для успешной миграции. Рекомендуется использовать выделенную сеть для трафика миграции, чтобы избежать перегрузки основной сети и обеспечить стабильную и быструю передачу данных. В этом разделе мы рассмотрим настройку выделенной сети, настройку DNS и брандмауэра.
Настройка выделенной сети
Создайте отдельную виртуальную сеть (например, VLAN) или физическую сеть, предназначенную исключительно для трафика миграции. Назначьте каждому хосту IP-адреса в этой сети и убедитесь, что они могут связываться друг с другом. Использование выделенной сети повышает безопасность и производительность миграции.
Пример: Настройка IP-адресов на интерфейсах# Хост 1
ip addr add 192.168.10.1/24 dev eth1
ip link set eth1 up
# Хост 2
ip addr add 192.168.10.2/24 dev eth1
ip link set eth1 up
Эти команды назначают IP-адреса 192.168.10.1 и 192.168.10.2 интерфейсу eth1 на хостах 1 и 2 соответственно. Убедитесь, что интерфейс eth1 подключен к выделенной сети миграции. Команда `ip link set eth1 up` активирует интерфейс.
Пример: Проверка связи между хостамиping 192.168.10.2
Эта команда проверяет связь между хостом 1 и хостом 2 по выделенной сети. Убедитесь, что пинги проходят успешно.
Настройка DNS
Убедитесь, что имена хостов правильно разрешаются в IP-адреса выделенной сети. Это можно сделать, добавив записи в файл `/etc/hosts` на обоих хостах или настроив DNS-сервер. Правильное разрешение имен упрощает процесс миграции и делает его более надежным.
Пример: Добавление записей в /etc/hosts# Хост 1 и Хост 2
echo "192.168.10.1 host1.example.com host1" >> /etc/hosts
echo "192.168.10.2 host2.example.com host2" >> /etc/hosts
Эти команды добавляют записи в файл `/etc/hosts`, связывая IP-адреса выделенной сети с именами хостов. Замените `host1.example.com` и `host2.example.com` на полные доменные имена ваших хостов, а `host1` и `host2` на короткие имена хостов.
Пример: Проверка разрешения именping host2
Эта команда проверяет, правильно ли разрешается имя хоста `host2` в IP-адрес 192.168.10.2. Убедитесь, что пинги проходят успешно.
Настройка брандмауэра
Настройте брандмауэр на обоих хостах, чтобы разрешить трафик, необходимый для миграции. Обычно это порты, используемые libvirt (например, TCP 16509). Неправильно настроенный брандмауэр может блокировать трафик миграции и приводить к сбоям.
Пример: Разрешение трафика libvirt с помощью firewalld# Хост 1 и Хост 2
firewall-cmd --permanent --add-port=16509/tcp
firewall-cmd --reload
Эти команды добавляют правило в firewalld, разрешающее трафик TCP на порту 16509. Опция `—permanent` делает правило постоянным, а `—reload` перезагружает брандмауэр, чтобы применить изменения.
Пример: Проверка правил брандмауэраfirewall-cmd --list-all
Эта команда показывает список всех правил, настроенных в firewalld. Убедитесь, что в списке присутствует правило, разрешающее трафик TCP на порту 16509.
Проверка совместимости хостов
Для успешной миграции крайне важно, чтобы исходный и целевой хосты были совместимы. Это включает в себя проверку совместимости CPU, версий libvirt и QEMU. Несовместимость может привести к сбоям миграции или к нестабильной работе виртуальной машины после миграции. В этом разделе мы рассмотрим, как проверить совместимость с помощью virsh
и других инструментов.
Проверка совместимости CPU
Разные модели CPU могут иметь разные наборы инструкций, что может привести к проблемам при миграции. Используйте virsh capabilities
для сравнения возможностей CPU исходного и целевого хостов. Если CPU несовместимы, можно использовать опцию --cpu-model
при миграции, чтобы указать общую модель CPU, поддерживаемую обоими хостами.
virsh capabilities | grep -A 20 'cpu>'
Эта команда отображает информацию о CPU с помощью команды `virsh capabilities` и фильтрует вывод, чтобы показать только секцию, начинающуюся с тега `
virsh migrate --live vm1 qemu+ssh://host2.example.com/system --cpu-model core2duo
Эта команда выполняет живую миграцию виртуальной машины `vm1` на хост `host2.example.com` и указывает, что нужно использовать модель CPU `core2duo`. Эта опция может быть необходима, если CPU исходного и целевого хостов не полностью совместимы. Замените `core2duo` на модель CPU, поддерживаемую обоими хостами.
Проверка версий libvirt и QEMU
Убедитесь, что версии libvirt и QEMU на исходном и целевом хостах совместимы. Использование разных версий может привести к проблемам с управлением виртуальными машинами и сбоям миграции. Рекомендуется использовать одинаковые или близкие версии libvirt и QEMU на всех хостах.
Пример: Проверка версии libvirtvirsh version
Эта команда отображает информацию о версии libvirt и используемом гипервизоре (например, QEMU). Проверьте версию libvirt на обоих хостах и убедитесь, что они совместимы.
Пример: Проверка версии QEMUqemu-system-x86_64 --version
Эта команда отображает информацию о версии QEMU. Проверьте версию QEMU на обоих хостах и убедитесь, что они совместимы.
Проверка конфигурации виртуальной машины
Проверьте конфигурацию виртуальной машины (например, количество vCPU, объем памяти, сетевые интерфейсы), чтобы убедиться, что целевой хост поддерживает ее. Несовместимость в конфигурации может привести к проблемам с запуском виртуальной машины после миграции.
Пример: Получение информации о виртуальной машине с помощью virshvirsh dominfo vm1
Эта команда отображает информацию о виртуальной машине `vm1`, включая ID, имя, состояние, количество vCPU, объем памяти и другие параметры. Сравните эту информацию с ресурсами целевого хоста.
Пример: Получение XML-конфигурации виртуальной машиныvirsh dumpxml vm1
Эта команда отображает XML-конфигурацию виртуальной машины `vm1`. Вы можете использовать эту информацию для более детального анализа конфигурации и проверки совместимости с целевым хостом.
Выполнение миграции с помощью virsh
virsh
– это мощный инструмент командной строки для управления виртуальными машинами в среде KVM. Он предоставляет широкие возможности для миграции, включая живую миграцию, которая позволяет перемещать виртуальные машины между хостами без прерывания их работы. В этом разделе мы подробно рассмотрим, как выполнить миграцию с помощью virsh
, а также рассмотрим различные опции и примеры.
Основные команды для миграции
Основная команда для миграции виртуальных машин с помощью virsh
– это virsh migrate
. Она принимает различные опции, которые позволяют настроить процесс миграции в соответствии с вашими потребностями. Ниже приведены основные опции:
--live
: Выполняет живую миграцию, то есть перемещает виртуальную машину без прерывания ее работы.--copy-storage
: Копирует хранилище виртуальной машины на целевой хост.--persistent
: Делает конфигурацию виртуальной машины постоянной на целевом хосте.--auto-converge
: Включает автоматическую конвергенцию, чтобы уменьшить время простоя.--cpu-model
: Указывает модель CPU для использования на целевом хосте (см. предыдущий раздел).
virsh migrate --live vm1 qemu+ssh://host2.example.com/system
Эта команда выполняет живую миграцию виртуальной машины `vm1` на хост `host2.example.com`. Она использует протокол SSH для подключения к целевому хосту. Убедитесь, что у пользователя, выполняющего команду, есть права доступа на целевом хосте.
Миграция с общим хранилищем
Если виртуальная машина использует общее хранилище, миграция становится проще, так как не требуется копировать диски виртуальной машины. В этом случае, команда миграции может быть упрощена.
Пример: Живая миграция с общим хранилищемvirsh migrate --live vm1 qemu+ssh://host2.example.com/system
Эта команда выполняет живую миграцию виртуальной машины `vm1` на хост `host2.example.com`. Так как используется общее хранилище, опция `—copy-storage` не требуется.
Миграция без общего хранилища
Если виртуальная машина не использует общее хранилище, необходимо скопировать диски виртуальной машины на целевой хост. Это можно сделать с помощью опции `—copy-storage` или с помощью других методов, таких как rsync
.
virsh migrate --live --copy-storage vm1 qemu+ssh://host2.example.com/system
Эта команда выполняет живую миграцию виртуальной машины `vm1` на хост `host2.example.com` и копирует хранилище виртуальной машины на целевой хост. Этот процесс может занять некоторое время, в зависимости от размера дисков виртуальной машины.
Пример: Миграция с использованием rsync (альтернативный метод)# На исходном хосте
rsync -avz /var/lib/libvirt/images/vm1.img host2.example.com:/var/lib/libvirt/images/
# После завершения rsync, выполнить миграцию
virsh migrate --live vm1 qemu+ssh://host2.example.com/system
Этот пример показывает, как скопировать диск виртуальной машины `vm1.img` на целевой хост с помощью rsync
перед выполнением миграции. Опция `-avz` обеспечивает архивирование, рекурсивное копирование и сжатие данных. После завершения копирования, выполните команду virsh migrate
без опции `—copy-storage`.
Диагностика и устранение проблем
Миграция виртуальных машин, особенно живая миграция, может столкнуться с различными проблемами. Важно уметь диагностировать и устранять эти проблемы, чтобы обеспечить успешное перемещение виртуальных машин и избежать простоя. В этом разделе мы рассмотрим наиболее распространенные проблемы и методы их решения.
Проблемы с подключением
Одной из самых распространенных проблем является невозможность установить соединение между исходным и целевым хостами. Это может быть связано с проблемами с сетью, брандмауэром или настройками DNS.
Пример: Проверка связи с помощью pingping host2.example.com
Убедитесь, что хосты могут связываться друг с другом по сети. Если пинги не проходят, проверьте настройки сети, брандмауэр и DNS.
Пример: Проверка правил брандмауэраfirewall-cmd --list-all
Убедитесь, что брандмауэр не блокирует трафик, необходимый для миграции (например, порт 16509 для libvirt). Добавьте необходимые правила и перезагрузите брандмауэр.
Проблемы с ресурсами
Недостаток ресурсов на целевом хосте может привести к сбою миграции. Убедитесь, что на целевом хосте достаточно CPU, памяти и дискового пространства для размещения виртуальной машины.
Пример: Проверка использования ресурсов с помощью toptop
Проверьте загрузку CPU и использование памяти на целевом хосте. Если ресурсы сильно загружены, освободите их или перенесите часть нагрузки на другой хост.
Пример: Проверка свободного места на диске с помощью dfdf -h
Убедитесь, что на целевом хосте достаточно свободного места для хранения дисков виртуальной машины. Если места недостаточно, увеличьте размер раздела или перенесите диски на другое хранилище.
Проблемы с совместимостью CPU
Несовместимость CPU между исходным и целевым хостами может привести к сбою миграции или к нестабильной работе виртуальной машины после миграции. Используйте опцию --cpu-model
при миграции, чтобы указать общую модель CPU, поддерживаемую обоими хостами.
virsh migrate --live vm1 qemu+ssh://host2.example.com/system --cpu-model core2duo
Укажите модель CPU, поддерживаемую обоими хостами. Если вы не знаете, какую модель использовать, попробуйте host
или kvm64
.
Просмотр логов
Если миграция завершилась неудачей, просмотрите логи libvirt и QEMU для получения дополнительной информации об ошибке. Логи могут содержать подсказки о причине проблемы и помочь в ее устранении.
Пример: Просмотр логов libvirttail -f /var/log/libvirt/libvirtd.log
Эта команда отображает последние строки файла логов libvirt в режиме реального времени. Ищите сообщения об ошибках или предупреждениях, связанные с миграцией.
Пример: Просмотр логов QEMUtail -f /var/log/libvirt/qemu/vm1.log
Эта команда отображает последние строки файла логов QEMU для виртуальной машины `vm1` в режиме реального времени. Ищите сообщения об ошибках или предупреждениях, связанные с запуском или миграцией виртуальной машины.