Глава 7. Виртуальные машины: Установка, настройка и управление жизненным циклом
Содержание
В этой главе мы изучим различные способы установки и настройки Виртуальных
мащин (ВМ, VM) - из приглашения командной
строки и/ или Графического интерфейса пользователя
(GUI, graphical user interface). Мы глубже окунёмся в некоторые
инструменты и утилиты, которые мы уже применяли (virt-manager
,
virt-install
, oVirt
) и выстроим свои
знания, полученные в предыдущих главах. Затем мы пространно обсудим миграцию ВМ, одну из наиболее основательных сторон
виртуализации, поскольку практически невозможно представить себе применение виртуализации без вариантов миграции. Чтобы
быть способными настроить своё окружение под миграцию ВМ, мы также воспользуемся темами, обсуждавшимися в
Главе 4, Сетевая среда libvirt и в
Главе 5, Хранилище libvirt,
ибо для работы миграции имеются предварительные условия, которые должны быть выполнены.
В данной главе мы обсудим следующие темы:
-
Создание новой ВМ при помощи
virt-manager
и с применением командvirt
. -
Создание новой ВМ с использованием
oVirt
-
Настройку вашей ВМ
-
Добавление виртуального оборудования в вашу Вм и его удаление из неё
-
Миграцию ВМ
virt-manager
(инструмент с графическим интерфейсом для управления ВМ) и
virt-install
(утилита командной строки для управления ВМ) это две наиболее
широко применяемые утилиты в виртуализации KVM
(Kernel-based VM, Основанных на ядре ВМ). Применяя их,
мы способны делать со своими ВМ практически всё - создавать, запускать, удалять и многое иное. Нам уже выпадала в
предыдущих главах возможность поработать с этими двумя утилитами, но мы нуждаемся в более структурированном подходе к
этому предмету, поскольку они предлагают загрузку дополнительных вариантов, которые у нас пока не было возможности
обсуждать. Мы также добавим некоторые прочие утилиты, которые являются частью стека команд
virt-*
, которые весьма, весьма полезны.
Давайте начнём с virt-manager
и его знакомого GUI.
virt-manager
это ключевая утилита с графическим интерфейсом управления ВМ
KVM. Она чрезвычайно понятна и проста в применении, хотя слегка и обделена функциональностью, о чём мы расскажем
позднее. Вот основное окно virt-manager
:
Из данного снимка экрана мы можем видеть, что в данном сервере уже имеются установленными три виртуальные машины. Мы можем пользоваться меню верхнего уровня (File, Edit, View и Help)для дальнейшей настройки своего сервера и/ или ВМ, а также подключаться к прочим хостам KVM в своей сетевой среде, как вы можете это наблюдать на следующем снимке экрана:
После того как мы выбрали вариант Add Connection…,
нас поприветствует мастер подключения к внешнему хосту и нам потребуется лишь пробить некоторые основные сведения -
значение имени пользователя (он обязан быть пользователем, который обладает правами администратора) и названием
хоста или адресом Internet Protocol
(IP) этого удалённого сервера. Прежде чем мы сделаем это,
нам также потребуется настроить ключи Secure Shell
(SSH) в своей локальной машине и скопировать свой
ключ в эту удалённую машину, ибо это установленный по умолчанию метод идентификации для
virt-manager
. Этот процесс отображён на следующем снимке экрана:
На данном этапе вы можете приступить к бесплатной установке своей ВМ в этом удалённом хосте KVM, если вы решите это осуществить, щёлкните правой кнопкой по имени хоста и выберите New, как это отображено на следующем снимке экрана:
Поскольку данный мастер тот же самый что и для установки ВМ в вашем локальном сервере, мы рассмотрим обе эти ситуации за один проход. Самый первый шаг в нашем мастере New VM состоит в выборе того, где вы устанавливаете свою ВМ и откуда. Как вы можете обнаружить на приводимом ниже снимке экрана, существуют доступными четыре варианта:
Эти варианты таковы:
-
Когда у вас уже имеется доступным файл ISO (International Organization for Standardization) в вашей локальной машине (или в качестве физического устройства), выбирайте самый первый вариант.
-
Кли вы желаете выполнять установку из своей сетевой среды, выбирайте второй вариант.
-
Если вы обладаете в своей среде установкой запуска PXE (Preboot eXecution Environment) и вы способны запускать установку своей ВМ из имеющейся сетевой среды, выберите третий вариант.
-
Когда у вас уже имеется диск ВМ и вы просто желаете воспользоваться им в качестве основы для определяеиой ВМ, выбирайте четвёртый способ.
Обычно мы обсуждаем сетевые установки (второй вариант) или сетевые установки с PXE- запуском (третий вариант), поскольку это наиболее популярные варианты применения в промышленных случаях. Основная причина для этого очень проста - абсолютно нет нужды тратить впустую локальное дисковое пространство под файлы ISO, которые в наши дни достаточно велики. Например, файл ISO CentOS 8 v190 составляет в размере почти 8 гигабайт (ГБ). Если вам требуется способность установки множества операционных систем или даже множества версий этих операционных систем, вам лучше быть в состоянии с неким видом централизованного пространства хранения только под ISO файлы.
В основанных на VMware ESXi (ESX integrated) инфраструктурах люди обычно используют для такой функциональности хранилища данных или библиотеки содержимого ISO. В инфраструктурах на основе Microsof Hyper-V люди обычно применяют совместное хранилище файлов SMB (Server Message Block) с файлами ISO, необходимыми для установки ВМ. Было бы совершенно бессмысленно иметь копию ISO операционной системы для каждого хоста, поэтому какой-то общий подход намного удобнее и является хорошим механизмом экономии места.
Допустим, мы устанавливаем ВМ из сетевой среды (HTTP (HyperText Transfer Protocol), HTTPS (HyperText Transfer Protocol Secure) или FTP (File Transfer Protocol)). Для продолжения нам понадобится пара вещей, а именно:
-
Некий URL (Uniform Resource Locator), с которого мы можем завершить установку - в нашем примере мы намерены применять
http://mirror.linux.duke.edu/pub/centos
. По этой ссылке выберите самый последний каталог8.x.x
, а затем пройдите вBaseOS/x86_64/os
. -
Очевидно, работающее подключение к Интернету - как можно более быстрое, ибо мы намерены загружать все установочные пакеты со своего предыдущего адреса URL.
-
Как вариант, мы можем открыть треугольник URL options и воспользоваться дополнительными вариантами для строки ядра - чаще всего параметры запуска с точка (kickstart) с чем- то вроде следующего:
ks=http://kickstart_file_url/file.ks
Итак, давайте наберём это следующим образом:
Обратите внимание, что мы вручную выбрали
Red Hat Enterprise Linux 8.0, поскольку целевая гостевая
операционная система CentOS 8 (1905), которую не распознал virt-manager
из
предписанного нами URL. Если бы эта операционная система присутствовала в нашем перечне распознаваемых в данный момент
операционных систем, мы бы могли просто выбрать соответствующую флаговую кнопку
Automatically detect from installation media / source,
которую порой требуется перепроверить и отменить пометку пару раз пока она не сработает.
После того как вы кликните по кнопке Forward, мы столкнёмся с установками для этой ВМ памяти и ЦПУ (CPU, central processing unit). И снова, вы сможете здесь пойти двумя путями следующим образом:
-
Выбрать голый минимум ресурсов (например, 1 vCPU (virtual CPU) и 1 ГБ памяти, а затем добавлять если вам потребуется больше лошадиных сил ЦПУ и/ или больше памяти.
-
Выбрать пристойный объём ресурсов (скажем, 2 vCPU и 4 ГБ ОЗУ) имея в виду конкретное применение. Например, когда мы намерены применять эту ВМ в качестве файлового сервера, вы не получите жутко много мощности если вы добавите в неё 16 vCPU и 64 ГБ оперативной памяти, однако имеются и прочие варианты применения, когда это окажется подходящим.
Наш следующий шаг состоит в настройке хранилища ВМ. Имеются два возможных варианта, и можем обнаружить их на слвоём следующем снимке экрана:
Очень важно чтобы вы выбрали для своей ВМ надлежащее устройство хранения, поскольку если вы этого не сделаете, у вас могут быть в будущем проблемы разного сорта. Например, если вы поместите в промышленной среде свою ВМ на плохое устройство хранения, вам придётся выполнять миграцию хранилища этой ВМ в другое устройство хранения, что является утомительным и временеёмким процессом, который будет обладать воздействиями отвратительной силы если вам придётся загружать запущенные ВМ на устройстве хранения источника или получателя. Для того кто запускает это окажет существенное воздействие на его производительность. Далее, если у вас имеется в вашей среде некий механизм динамического управления рабочими нагрузками, это может включать в вашей инфраструктуре дополнительные ВМ или перемещения хранилищ ВМ. Такие функциональные возможности, как Distributed Resource Scheduler (DRS)/ Storage DRS VMware, оптимизация производительности и ресурсов Hyper-V (прт интеграции с System Center Operations Manager (SCOM) ), а также политики управления кластером oVirt/ Red Hat Enterprise Virtualization поступают именно так. Поэтому приспособление к стратегии подумай дважды, прежде чем сделать здесь может оказаться уместным подходом.
Если вы выберете первый вариант, Create a disk image for the
virtual machine, virt-manager
создаст жёсткий диск ВМ
в установленном по умолчанию местоположении, для Red Hat Enterprise Linux
(RHEL) и CentOS это каталог /var/lib/libvirt/images
.
Убедитесь что у вас имеется достаточно пространства под жёсткий диск вашей ВМ. Допустим, у вас имеется свободным
8 ГБ пространства, доступного в каталоге /var/lib/libvirt/images
и лежащих
в его основе разделах. Если вы оставите всё как есть из ситуации на нашем предыдущем снимке экрана, мы получим
сообщение об ошибке потому как пытаемся создать файл в 10 ГБ в имеющем лишь 8 ГБ локальном диске.
После того как мы кликнем снова по кнопке Forward,
мы окажемся на финальной стадии процесса создания своей ВМ (которая появится в
virt-manager
), персонализации самой конфигурации перед процессом её
установки и выбора того какую виртуальную сетевую среду будет применять эта ВМ. В этой главе мы слегка подробнее
рассмотрим индивидуализацию оборудования под свою ВМ. После того как мы нажимаем на
Finish, как то показано на идущем далее снимке
экрана, ваша ВМ будет готова к развёртыванию, а после того как мы установим необходимую операционную систему -
и к применению:
Применение virt-manager
для создания некой ВМ, определённо, не было
сложной задачей, однако в реальных промышленных средах вы не обязательно обнаружите установленном на сервере графический
интерфейс. Таким образом, нашей логичной следующей задачей будет узнать об утилитах командной строки для
управления ВМ, в особенности, о командах virt-*
. Давайте займёмся этим
далее.
Как уже упоминалось ранее, нам необходимо изучить некоторые новые команды для овладения необходимой задачей
базового администрирования ВМ. Для этой конкретной задачи у нас имеется стек команд
virt-*
. Давайте кратко пройдёмся по некоторым наиболее важным из них и
изучим как их применять.
virt-viewer
Мы уже интенсивно применяли команду virt-install
ранее (проверьте
Главу 3, Установка гипервизора KVM, libvirt и oVirt, в которой мы
установили достаточно ВМ при помощи этой команды), мы намерены рассмотреть оставшиеся команды.
Давайте начнём с virt-viewer
, поскольку мы уже пользовались этим приложением
ранее. всякий раз как мы дважды кликаем по некой ВМ в virt-viewer
, мы
открываем консоль ВМ и это происходит по той причине, что virt-viewer
выступает
в фоновом режиме этой процедуры. Но что если мы желаем применять virt-viewer
из оболочки - как это часто делают люди - нам требуются некие сведения относительно этого. Итак, давайте воспользуемся
парой примеров.
Прежде всего давайте подключимся к локальному KVM с названием MasteringKVM01
,
который располагается в том хосте, к которому мы в настоящий момент подключены от имени
root
, запустив следующую команду:
# virt-viewer --connect qemu:///system MasteringKVM01
К тому же мы желаем подключиться к своей ВМ в режиме kiosk
,
что означает, что virt-viewer
будет закрыт после того как мы выключим ту ВМ,
к которой мы подключены. Для этого нам бы следовало выполнить такую команду:
# virt-viewer --connect qemu:///system MasteringKVM01 --kiosk --kiosk-quit on-disconnect
Если нам требуется подключиться к удалённому хосту, мы также можем
воспользоваться virt-viewer
, однако нам потребуется пара дополнительных
параметров. Наиболее распространённый способ аутентификации в удалённой системе заключается в работе через SSH, а потому
мы можем поступить так:
# virt-viewer --connect qemu+ssh://username@remote-host/system VirtualMachineName
Когда мы настроим ключи SSH и скопируем их в username@remote-host
, наша
предыдущая команда не будет запрашивать у нас пароль. Но если мы не сделаем этого, она запросит у нас пароль дважды -
для установления подключения к гипервизору и для установления соединения с сеансом
Virtual Network Computing (VNC) этой ВМ.
virt-xml
Наша следующая утилита командной строки из списка virt-xml
. Мы можем
применять её вместе параметрами командной строки virt-virtinstall
для изменения
настроек своей ВМ. Давайте начнём с базового примера - давайте просто включим меню запуска для этой ВМ следующим
образом:
# virt-xml MasgteringKVM04 --edit --boot bootmenu=on
Затем давайте добавим в эту ВМ диск с динамическим выделением за три шага - прежде всего создадим сам такой диск, а затем подключим его своей ВМ и проверим что всё работает как надо. Получаемый вывод можно видеть на приводимом следом снимке экрана:
Рисунок 7-9
Добавление динамически выделяемого виртуального диска формата qcow2 (copy- on- write, копируемого записью) в ВМ
Как вы можете видеть, virt-xml
достаточно полезна. С её помощью мы добавили
ещё один диск к своей ВМ и это всего лишь одна простейшая вещь, которую мы могли сделать. Мы также можем применять её
для развёртывания любых дополнительных частей оборудования к имеющейся ВМ. Мы также можем применять её для изменения
настроек ВМ, что действительно удобно в средах больше́го размера, в особенности когда вам необходимо писать
сценарий для автоматизации таких процедур.
virt-clone
Давайте проверим virt-clone
при помощи пары примеров. Скажем, мы просто хотим
быстрый и простой способ клонирования некоторой имеющейся ВМ без каких бы то ни было дополнительных сложностей.
Мы можем сделать это следующим образом:
# virt-clone --original VirtualMachineName --auto-clone
В результате это произведёт ВМ с названием VirtualMachineName-clone
, которую
мы сразу начнём использовать. Давайте посмотрим на это в действии:
Давайте посмотрим как это можно слегка персонализировать. При помощи
virt-clone
мы собираемся создать ВМ с названием
MasteringKVM05
через клонирование ВМ, именуемой как
MasteringKVM04
, и мы собираемся также индивидуализировать и названия
виртуальных дисков, что проиллюстрировано на следующем снимке экрана:
Рисунок 7-11
Персонализированное создание ВМ: индивидуализация названий ВМ и имён файлов виртуальных жёстких дисков
В реальной практике имеются ситуации которые требуют от вас преобразования ВМ из одной технологии виртуализации
в иную. Груда подобной работы состоит в реальном преобразовании имеющегося формата диска ВМ из одного формата в
другой. Этому посвящена virt-convert
. Давайте изучим как она это выполняет.
qemu-img
Давайте посмотрим как мы преобразовываем виртуальный диск из одного формата в другой и как мы можем конвертировать
некий файл настроек из одного метода виртуализации в другой. В качестве
источника мы воспользуемся ВМ VMware и преобразуем её виртуальный диск vmdk
и
файл .vmx
в некий новый формат, что иллюстрируется приводимым ниже снимком экрана:
Когда мы сталкиваемся с проектами, в которые вовлечены перемещения и конвертации ВМ между этими платформами,
нам необходимо иметь уверенность, что применим такие утилиты, поскольку их просто использовать и понимать, и они
требуют всего лишь одного момента - немного времени. Например, когда у нас имеется виртуальный диск VMware в 1
терабайт
(ТБ,
VM Disk (VMDK) и плоский файл VMDK), для преобразования
в формат qcow2
могут понадобиться часы, а потому нам необходимо быть
терпеливыми.Кроме того, нам потребуется время от времени быть готовыми к изменению файлов настроек
vmx
, поскольку процесс преобразования из
vmx
в kvm
не на 100% гладок, как мы
могли бы ожидать. На протяжении прохождения этого процесса создаётся новый файл настроек. Каталог по умолчанию для
файлов настроек ВМ KVM /etc/libvirt/qemu
и мы можем просто просматривать
файлы Extensible Markup Language (XML) в этом каталоге -
это файлы настроек наших ВМ KVM. Названия файлов, представляют имена ВМ из списка вывода
virsh
.
В CentOS существуют также некоторые утилиты, которые упрощают для нас управление не только самим локальным сервером, но и виртуальными машинами. Одним из таких выступает веб интерфейс Cockpit - он обладает способностью выполнять базовое управление ВМ в неком локальном хосте KVM {Прим. пер.: и в удалённых также}. Всё что нам требуется, это просто подключиться к нему через веб браузер и мы упоминали об этом в Главе 3, Установка гипервизора KVM, libvirt и oVirt, когда обсуждали развёртывание приложений oVirt. {Прим. пер.: также рекомендуем наш перевод Дополнение A, Обзор веб интерфейса Cockpit CentOS 8 (Глава 7 Всего сущего CentOS 8)}. Итак, давайте ознакомимся с управлением ВМ при помощи Cockpit.
Чтобы воспользоваться Cockpit для управления нашим сервером и его ВМ, нам потребуется установить и запустить Cockpit и его дополнительные пакеты. Давайте начнём с этого следующим образом:
# dnf -y install cockpit*
# systemctl enable --now cockpit.socket
После этого мы можем запустить Firefox и указать ему https://kvm-host:9090/
,
так как это значение порта по умолчанию, по которому можно достигать Cockpit, а также зарегистрируемся в качестве
root
с его значением пароля, что предоставит нам следующий
интерфейс пользователя
(user interface (UI)):
На своём предыдущем шаге,когда мы устанвливали cockpit*
, мы также установили
и cockpit-machines
, который является подключаемым модулем для самой веб консоли
Cockpit и который позволяет нам управлять ВМ libvirt
в веб консоли Cockpit.
Итак, после того, как мы кликнем по VMs, мы запросто
сможем увидеть предварительно установленные ВМ и затем открыть их конфигурации, а также устанавливать новые ВМ
при помощи простого мастера, как это проиллюстрировано на снимке экрана ниже:
Этот мастер для установки ВМ действительно прост- нам всего лишь требуется установить базовые настройки для своей новой ВМ и мы можем запустить установку следующим образом:
Теперь, когда мы рассмотрели как мы можем устанавливать ВМ локально, то есть мы имеем в виду что без какого бы то ни было вида приложения централизованного управления, давайте вернёмся обратно и проверим как мы можем устанавливать ВМ через oVirt.
Когда мы добавили некий хост в oVirt при регистрации в нём, мы можем проследовать в Compute-VMs и начать развёртывание ВМ применяя некий простой мастер. Поэтому, после клика по кнопке New в этом меню, мы можем делать в точности это, и мы получим такой экран:
Имея в виду, что oVirt это некое решение централизованного управления для хостов KVM, нам приходится загружать дополнительные параметры по сравнению с установкой локальной ВМ в неком хосте KVM - мы можем выбрать некий кластер, который будет размещать эту ВМ; мы можем применять шаблон, настраивать оптимизацию и тип экземпляра, настраивать Высокую доступность (HA, high availability), выделение ресурсов, параметры запуска..., в целом, это то, что мы в шутку называем вариантом паралитика, хотя всё это для нашего удобства, поскольку централизованные решения всегда будут слегка отличаться от вида локального решения.
Как минимум, нам придётся настроить общие свойства ВМ - название, операционную систему, и сетевой интерфейс ВМ. Затем мы можем проследовать в закладку System, в которой мы настроим размер памяти и число виртуальных ЦПУ, что проиллюстрировано на следующем снимке экрана:
Несомненно мы пожелаем настроить варианты запуска - подключить CD/ ISO, добавить виртуальный жёсткий диск, а также настроить порядок запуска, как это иллюстрируется следующим снимком экрана:
Мы можем персонализировать свои действия после установки ВМпри помощи sysprep
или cloud-init
, что мы будем обсуждать в Главе 9, Персонализация ВМ при помощи cloud-init.
Вот как выглядит базовая конфигурация в oVirt:
На практике, когда вы управляете некой средой с более чем двумя или тремя хостами KVM, вы захотите для управления ими воспользоваться неким видом централизованной утилиты. oVirt действительно хороша для этого, поэтому не упускайте её.
Теперь, когда мы выполнили всю процедуру развёртывания во всём разнообразии различных способов, пришло время задуматься о настройке ВМ. Имейте в виду, что ВМ это некий объект, который обладает многими важными атрибутами - такими как значение числа виртуальных ЦПУ, объём памяти, виртуальные сетевые карты и тому подобное - очень важно чтобы вы изучили как персонализировать такие настройки ВМ. Итак, давайте выберем это нашей следующей темой.
Когда мы пользуемся virt-manager
, если вы прошли все шаги вплоть до самого
последнего, существует интересная возможность, которую вы могли бы выбрать, и это вариант
Customize confguration before install .
К тому же самому окну настроек мы можем получать доступ когда вы проверяете конфигурацию ВМ после установки. Итак,
каким бы способом вы не добрались сюда, вы столкнётесь с самым полным масштабом вариантов настроек для всех аппаратных
устройств ВМ, которые были выделены только что созданной нами ВМ, что можно видеть на снимке экрана, приводимом
ниже:
Например, если вы щёлкнете по варианту CPUs со стороны левой руки, вы обнаружите значение числа доступных ЦПУ (текущее и максимально выделяемое), а также вы обнаружите некоторые приятные возможности, такие как CPU topology (Sockets/Cores/Treads), что позволяет нам настраивать особенные варианты настройки NUMA (non-uniform memory access, неоднородного доступа к памяти). Вот как выглядит такое окно настроек:
Именно это является очень важной частью настройки ВМ, в особенности когда вы проектируете некую среду, в которой хосты загружают виртуальные серверы. Более того, это становится ещё более важным когда виртуальные серверы размещают приложения с интенсивными операциями ввода/ вывода (I/O), такими как базы данных. Если вы желаете узнать больше об этом, вы можете проверить ссылки в конце данной главы в разделе Дальнейшее чтение, поскольку они снабдят вас загрузкой дополнительных сведений относительно проектирования ВМ.
Далее, если мы откроем вариант Memory, мы можем
изменить выделение памяти и снова в плавающей терминологии (текущее и максимальное выделение). Мы обсудим слегка подробнее
эти варианты когда мы начнём работать с командами virt-*
. Вот как выглядит
вариант настроек Memory
virt-manager
:
Один из наиболее важных вариантов настроек, доступный в virt-manager
расположен в подменю Boot Options, которое отображено на
следующем снимке экрана:
Здесь вы можете сделать два следующих очень важных момента:
-
Выбрать эту ВМ как автоматически запускаемую в этом хосте
-
Разрешить меню запуска и выбрать устройство запуска и приоритеты устройств запуска
Что касается вариантов конфигурации, то, несомненно, наиболее богатым функционалом меню конфигураций для
virt-manager
выступает меню виртуального хранилища - в нашем случае,
VirtIO Disk 1. Когда мы кликнем по нему, мы намерены
получить такой выбор вариантов конфигурации;
Давайте рассмотрим что означают некоторые из этих вариантов конфигурации, а именно:
-
Disk bus - Здесь обычно имеется пять вариантов, причём значением по умолчанию выступает VirtIO (и он наилучший). В точности как и в случае Vmware, ESXi, а также Hyper-V, KVM, имеются доступными различные виртуальные контроллеры хранения. Например, VMware обладает BusLogic, LSI Logic, Paravirtual и прочими типами виртуальных контроллеров хранения, в то время как Hyper-V имеет контроллеры integrated drive electronics (IDE) и small computer system interface (SCSI). Данный параметр определяет тот контроллер хранения, который эта ВМ намерена наблюдать внутри своей гостевой операционной системы.
-
Storage format - имеются два формата:
qcow2
иraw
(формат типаdd
). Наиболее распространённым вариантом выступаетqcow2
, так как он представляет наиболее гибкое управление для ВМ - например, он поддерживает динамичное выделение и моментальные снимки. -
Режим
Cache
- Имеется шесть типов:writethrough
,writeback
,directsync
,unsafe
,none
иdefault
. Эти режимы поясняют как данные записываются из операций ввода/ вывода, которые возникают из этой ВМ в лежащее у её основе хранилище. Например, при использованииwritethrough
, весь ввод/ вывод кэшируется в самом хосте ВМ и также записывается и на диск этой ВМ. С другой стороны, когда мы пользуемсяnone
, в её хосте не происходит кэширование (за исключением кэшированияwriteback
самого диска), а данные записываются напрямую в диск этой ВМ. Различные режимы обладают различными за и против, но, как правило, наилучшим вариантом для управления ВМ выступаетnone
. Вы можете получить дополнительные сведения об этом в разделе Дальнейшее чтение. -
Режим
IO
- Существуют два режима:native
иthreads
. В зависимости от этих настроек ввод/ вывод ВМ будет записываться либо через асинхронный ввод/ вывод ядра, или же через пул потоков в пространстве пользователя (что также выступает в качестве установки по умолчанию). При работе с форматомqcow2
, обычно считается что режимthreads
лучше, ибо форматqcow2
сначала выделяет секторы, а затем производит в них запись, что бкдет пожирать выделенные этой ВМ vGPU и обладает прямым воздействием на производительность ввода/ вывода. -
Режим
Discard
- Здесь имеются два возможных режима, с названиямиignore
иunmap
. Если вы выберетеunmap
, когда вы удаляете файлы из своей ВМ (что транслируется в свободное пространство в вашем файлеqcow2
диска ВМ), соответствующий файл диска ВМqcow2
будет усекаться чтобы отражать вновь высвобожденную ёмкость. В зависимости от того какие именно дистрибутив Linux, ядро и исправления ядра вы применили и от версии используемого Quick Emulator (QEMU), эта функция может быть доступной только с шиной диса SCSI. Он поддерживается для версии QEMU 4.0+. -
Detect zeroes
- Доступными имеются три режима:off
,on
иunmap
. Когда вы выбираетеunmap
, запись нулей будет транслироваться как создающая отсутствие операции (как это было разъяснено в режимеDiscard
). Если установка выполнена вon
, нулевые операции записи операционной системы будут транслироваться в особые команды нулевой записи.
На протяжении жизни каждой определённой ВМ имеется значительная вероятность того, что вы будете её перенастраивать. Будет ли это означать добавление или удаление виртуального оборудования (естественно, как правило, это добавление), это будет важной стороной для жизненного цикла ВМ. А потому давайте изучим как справляться с этим.
Применяя свой экран настроек ВМ мы запросто можем добавлять дополнительное оборудование или также удалять аппаратные средства. Например, если мы кликнем по кнопке Add Hardware в нижнем левом углу, мы легко можем добавить устройство - скажем, виртуальную сетевую карту. Приводимый ниже снимок экрана иллюстрирует этот процесс:
Рисунок 7-26
После клика по Add Hardware мы можем выбрать мы можем выбрать какое устройство виртуального оборудования мы желаем добавить в вашу ВМ
С другой стороны,, если мы выберем некое виртуальное аппаратное устройство (допустим, Sound ich6) и нажмём на кнопку Remove, которая появляется вслед за этим, мы также можем и удалить это виртуальное аппаратное устройство, после подтверждения того, что мы желаем это осуществить, как это показано на следующем снимке экрана:
Как вы можете наблюдать, добавление и удаление оборудования ВМ просто как раз- два- три. Мы вы действительности изучили эту тему ранее, когда мы работали с виртуальными сетевыми средами и хранилищами (Главе 4, Сетевая среда libvirt), однако там мы применяли команды оболочки и определения файлов XML. Вернитесь к тем примерам, если вы желаете их вспомнить.
Виртуализация - это гибкость, а возможность размещать ВМ в любом приданном хосте в нашей среде - это гигантская часть этого. Имея это в виду, миграция ВМ это одна из функциональных возможностей виртуализации, которая может применяться в качестве рекламного плаката для виртуализации и её многочисленных преимуществ. Что представляет собой миграция ВМ? Именно с этим мы и собираемся разобраться далее.
Проще говоря, миграция позволяет вам перемещать вашу ВМ с одной физической машины на другую физическую машину, причём с очень малым временем простоя или без него вовсе. Мы также способны перемещать хранилище ВМ, что является ресурсо- прожорливой операцией, которая требует аккуратного планирования и - когда это возможно - выполнять во вне рабочее время с тем, чтобы он не оказывала воздействия на производительность прочих ВМ настолько сильно, насколько она способна..
Существуют различные типы миграции и они таковы:
-
Ofine (в отключённом состоянии - по- холодному)
-
Online (в рабочем состоянии - по- живому)
-
Миграция с приостановкой
Также имеются различные типы миграции в рабочем состоянии, в зависимости от того, что именно вы перемещаете, а именно:
-
Вычислительную часть ВМ (перемещение ВМ с одного хоста KVM на другой хост KVM)
-
Хранимую часть ВМ (перемещение файлов ВМ из одного пула хранения в другой пул хранения)
-
И то, и другое (перемещение ВМ с хоста хост, а также из пула хранения в пул хранения одновременно)
Существуют некоторые отличия в плане того какие сценарии миграции поддерживаются когда вы применяете просто обычные хосты в противоположность oVirt или Red Hat Enterprise Virtualization. Если вы желете выполнять миграцию работающего хранилища, вы не можете выполнять это в хосте KVM напрямую, но вы запросто можете сделать это когда такая ВМ остановлена. Если вам требуется миграция хранилища в реальном масштабе времени, вам придётся воспользоваться oVirt или Red Hat Enterprise Virtualization.
Мы также обсуждали single-root input-output virtualization (SR-IOV) Peripheral Component Interconnect (PCI), проброс устройства , virtual graphics processing units (vGPUs) и подобные им понятия (в Главе 2, KVM в качестве решения виртуализации и в Главе 4, Сетевая среда libvirt). В CentOS 8 вы не имеете возможности выполнять миграцию ВМ в реальном масштабе времени, когда любой из этих вариантов присутствует в запущенной ВМ.
Каким бы ни был вариант применения, нам требуется помнить, что миграцию необходимо выполнять либо от имени
пользователя root
, либо в качестве относящегося к группе
libvirt
пользователя (что Red Hat именует как системный, а не пользовательский
сеанс libvirt
).
Имеются различные причины, по которым миграция ВМ выступает ценным инструментом для обладания им в вашем арсенале. Некоторые из этих причин очевидны; другие менее. Давайте попробуем пояснить различные варианты использования миграции ВМ и их преимущества.
Перечислим наиболее важные преимущества миграции ВМ в реальном времени:
-
Увеличение рабочего времени и снижение времени простоя - Аккуратно спланированная среда виртуализации предоставит вам максимальное время работы для вашего приложения.
-
Энергосбережение и следование зелёным трендам - Вы запросто можете консолидировать свои ВМ на основе их нагрузки и применять меньшее число гипервизоров на протяжении часов с меньшей нагрузкой. Раз ваши ВМ мигрируют, вы можете отключать свои не используемые гипервизоры.
-
Простой процесс обновления оборудования/ программных средств при перемещении ваших ВМ между различными гипервизорами - Раз у вас имеется возможность свободно перемещать свои ВМ между различными физическими серверами, такие преимущества бессчётны.
Миграция Вм требует надлежащего планирования. Существуют некоторые базовые требования, которым надлежит следовать при миграции. Давайте рассмотрим их по одному.
Требования миграции для промышленных сред таковы:
-
Подлежащие миграции ВМ обязаны применять пул хранения, который создан в неком совместно используемом хранилище.
-
Значение имён самого пула хранения и пути к виртуальному диску обязаны оставаться теми же самыми в обоих гипервизорах (гипервизорах источника и назначения).
Чтобы освежить свои сведения о том как создавать пул хранения и применять разделяемое хранилище, обратитесь к Главе 4, Сетевая среда libvirt и Главе 5, Хранилище libvirt.
Как и всегда, имеются некоторые применимые здесь правила. Они достаточно просты, а потому нам требуется узнать их прежде чем мы начнём процессы миграции. Они таковы:
-
Имеет ся возможность осуществлять миграцию в реальном масштабе времени при помощи пула хранения, который создан в не разделяемом хранилище. Вам только требуется поддерживать те же самое название пула хранения и местоположение файла, но всё же рекомендуется в промышленных средах применять совместно используемое хранилище.
-
Когда имеется некий неуправляемый виртуальный диск, подключённый к ВМ, которая пользуется Fiber Channel (FC), Internet Small Computer Systems Interface (iSCSI), Logical Volume Manager (LVM) и тому подобным, в обоих гипервизорах обязано быть доступным одно и то же хранилище.
-
Используемые подлежащей миграции ВМ виртуальные сетевые среды должны быть доступными в обоих гипервизорах.
-
Мост, который настроен для сетевого взаимодействия должен быть доступным в обоих гипервизорах.
-
Миграция может закончиться отказом если основные версии
libvirt
иqemu-kvm
в гипервизорах отличаются, однако вы должны быть способны без проблем мигрировать те ВМ, которые обладают более низкой версиейlibvirt
илиqemu-kvm
в гипервизор, который имеет более высокие версии этих пакетов. -
Значение времени и в гипервизоре источника и в гипервизоре получателя обязаны быть синхронными. Настоятельно рекомендуется тобы вы выполняли синхронизацию своих гипервизоров при помощи тех же самых серверов Network Time Protocol (NTP) или Precision Time Protocol (PTP).
-
Важно что эти системы используют сервер Domain Name System (DNS) для разрешения имён. Добавление подробностей об имеющихся хостах в
/etc/hosts
не работает. Вы должны быть способны разрешать свои имена хостов при помощи командыhost
.
Существуют некоторые предварительные требования, которыми нам надлежит иметь в виду при планировании своей среды для миграции ВМ. По большей части эти предварительные требования в основном те же самые для всех решений виртуализации. Давайте далее обсудим эти предварительные требования и, в целом, как настраивать свою среду для миграции ВМ.
Давайте соберём необходимую среду для выполнения миграции ВМ - как миграцию в отключённом состоянии, так и миграцию в реальном режиме времени. Следующая схема рисует два стандартных хоста виртуализации KVM, запускающих ВМ ч некого совместного хранилища:
Мы начнём это с настройки совместного хранилища. В данном примере мы применяем для своего совместного хранилища
Network File System (NFS). Мы намерены применять NFS
по причине её простоты в настройке, что посодействует вам более простому следованию примерам миграции. В реальном
промышленном применении рекомендуется использовать пулы хранения на основе iSCSI или FC. NFS не лучший выбор когда ваши
файлы велики, а ваши ВМ выполняют интенсивные операции ввода/ вывода. Gluster является хорошей альтернативой NFS и мы
бы рекомендовали вам испробовать его. Gluster хорошо интегрирован в libvirt
.
Мы собираемся создать совместный ресурс NFS в сервере CentOS 8. Её мы намерены разместить в каталоге
/testvms
, который мы намерены экспортировать через NFS. Название этого сервера
nfs-01
(IP адресом nfs-01
выступает
192.168.159.134
).
-
Самый первый шаг состоит в создании и экспорте каталога
из/testvms
nfs-01
и настройки SELinux (проверьте в разделе Ceph как это сделать).# mkdir /testvms # echo '/testvms *(rw,sync,no_root_squash)' >> /etc/exports
-
Далее разрешите исполнение своей службе NFS в межсетевом экране следующим образом:
# firewall-cmd --get-active-zones public interfaces: ens33 # firewall-cmd --zone=public --add-service=nfs # firewall-cmd --zone=public --list-all
-
Запустите службу NFS так:
# systemctl start rpcbind nfs-server # systemctl enable rpcbind nfs-server # showmount -e
-
Убедитесь что ваш совместный ресурс доступен из обоих гипервизоров KVM. В нашем случае это
PacktPhy01
иPacktPhy02
. Выполните следующий код:# mount 192.168.159.134:/testvms /mnt
-
В случае отказа в монтировании, перенастройте настройки межсетевого экрана в своём сервере NFS и повторите проверку этого монтирования. Это можно выполнить при помощи таких команд:
firewall-cmd --permanent --zone=public --add-service=nfs firewall-cmd --permanent --zone=public --add-service=mountd firewall-cmd --permanent --zone=public --add-service=rpc-bind firewall-cmd -- reload
-
После того, как вы проверили точку монтирования в обоих гипервизорах, размонтируйте этот том следующим образом:
# umount /mnt
-
В
PacktPhy01
иPacktPhy02
создайте пул хранения с названиемtestvms
:# mkdir -p /var/lib/libvirt/images/testvms/ # virsh pool-define-as --name testvms --type netfs --source-host 192.168.159.134 --source-path /testvms --target /var/lib/libvirt/images/testvms/ # virsh pool-start testvms # virsh pool-autostart testvms
Пул хранения testvms
теперь создан и запущен в обоих гипервизорах.
В своём следующем примере мы намерены изолировать собственно миграцию и обмен ВМ. Настоятельно рекомендуется чтобы вы осуществили такую изоляцию в своей промышленной среде, в особенности когда вы выполняете большое число миграций, поскольку это разгрузит такой требовательный процесс в обособленный сетевой интерфейс, тем самым освобождая прочие перегруженные сетевые интерфейсы. Итак имеются две основные причины для этого, а именно:
-
Производительность сетевой среды: Сама миграция ВМ использует всю полосу пропускания сетевой среды целиком. Когла вы применяете ту же самую сетевую среду для сетевого обмена ВМ и собственно сетевой миграции, такая миграция задушит эту сетевую среду, тем самым воздействуя на способность служб своих ВМ. Вы можете контролировать значение полосы пропускания миграции, однако это увеличит величину времени миграции.
Во как мы создаём такую изоляцию:
PacktPhy01 -- ens36 (192.168.0.5) <--switch------gt; ens36 (192.168.0.6) -- PacktPhy02 ens37 -gt; br1 <-----switch------gt; ens37 -> br1
Интерфейсы
ens192
вPacktPhy01
иPacktPhy02
используются для миграции, а также для задач администрирования. Они обладают назначенными IP и подключением к некому сетевому коммутатору. Мостbr1
создан при помощиens224
и вPacktPhy01
, и вPacktPhy02
.br1
не обладает неким выделенным ему IP и применяется исключительно для обмена ВМ (восходящая ссылка для того коммутатора, к которому подключены сами ВМ). Он также подключён к (физическому) сетевому коммутатору. -
Причины безопасности: Всегда рекомендуется чтобы вы удерживали своё управление сетевой средой и виртуальной сетью изолированными также и по причинам безопасности. Вы не пожелаете чтобы ваши пользователи путались в вашей сети управления, в которой вы выполняете доступ к своим гипервизорам и осуществляете администрирование.
Мы обсудим три из наиболее важных сценариев - миграцию в отключённом режиме, миграцию без реального времени (с приостановкой), а также миграцию в реальном масштабе времени. Затем мы обсудим миграцию хранилища как отдельный сценарий, который требует дополнительные планирование и продуманность.
Как и подразумевает её название, в процессе миграции в отключённом состоянии значением состояния такой ВМ будет либо
полный останов, или приостановка. Эта ВМ затем возобновляется или запускается в назначенном ей хосте. При данной
модели миграции libvirt
буде просто копировать файл настроек XML этой ВМ с хоста
KVM источника в хост получателя. Это также предполагает, что вы также обладаете одним и тем же совместным пулом
хранения созданным и готовым для применения в получателе. В качестве самого первого шага в этом процессе миграции
вам потребуется настроить двухстороннюю аутентификацию SSH в гипервизорах KVM участников. В нашем примере они имеют
названия PacktPhy01
, и в PacktPhy02
.
Для нашего следующего упражнения временно отключите Security-Enhanced Linux (SELinux).
В /etc/sysconfig/selinux
для изменения следующей строки воспользуйтесь
предпочитаемым вами редактором:
SELINUX=enforcing
Её требуется изменить следующим образом:
SELINUX=permissive
Кроме того, в своей командной строке от имени root
нам требуется на время
установить режим SELinux в разрешительный следующим образом:
# setenforce 0
В PacktPhy01
от имени root
исполните следующую команду:
# ssh-keygen
# ssh-copy-id root@PacktPhy02
В PacktPhy02
от имени root
исполните следующую команду:
# ssh-keygen
# ssh-copy-id root@PacktPhy01
Теперь вы будете способны зарегистрироваться в обоих этих гипервизорах в качестве
root
без ввода пароля.
Давайте выполним миграцию MasteringKVM01
в отключённом состоянии, которая
уже установлена с PacktPhy01
в PacktPhy02
.
Общий формат команды миграции выглядит аналогично следующему:
# virsh migrate migration-type options name-of-the-vm-destination-uri
В PacktPhy01
выполните такой код:
[PacktPhy01] # virsh migrate --offline --verbose –-persistent MasteringKVM01 qemu+ssh://PacktPhy02/system
Migration: [100 %]
В PacktPhy02
запустите следующий код:
[PacktPhy02] # virsh list --all
# virsh list --all
Id Name State
----------------------------------------------------
- MasteringKVM01 shut off
[PacktPhy02] # virsh start MasteringKVM01
Domain MasteringKVM01 started
Когда ВМ располагается в совместном хранилище, а вы обладаете некой проблемой в одном из своих хостов, вы можете также вручную зарегистрировать ВМ в другом хосте. Это означает, что вы могли бы закончить с положением, при котором одна и та же ВМ зарегистрирована в двух гипервизорах, после чего вы можете устранить ту проблему, которую вы испытываете в своём хосте с первоначальной проблемой. Это то, что происходит когда вы вручную управляете KVM без централизованной платформы управления, такой как oVirt, которая не допускает подобного сценария. Итак, что произойдёт если вы окажетесь в подобной ситуации Давайте обсудим такой сценарий.
Что если я случайно запущу свою ВМ в обоих гипервизорах?
Случайный запуск вашей ВМ в обоих гипервизорах может превратиться в ночной кошмар системного администратора. Это
может повлечь к разрушения файловой системы ВМ, в особенности когда эта Вм не осведомлена о кластере. Разработчики
libvirt
подумали об этом и пришли к механизму блокировки. В действительности,
они предложили два механизма блокировок. Когда они включены, они препятствуют одновременному запуску ВМ в двух
гипервизорах.
Эти два механизма блокировки таковы:
-
lockd
:lockd
пользуется рекомендательной способностью блокировкиPOSIX fcntl()
. Она запускается демономvirtlockd
. Он требует некой совместно используемой файловоё системы (предпочтительно NFS), доступной всем тем хостам, которые совместно применяют один и тот же пул хранения. -
sanlock
: Он применяется проектами oVirt. Это использует алгоритмpaxos
для сопровождения непрерывно обновляемых овладений.
Для реализаций только с libvirt
мы предпочитаем
lockd
над sanlock
. Для oVirt лучше
применять sanlock
.
Включение lockd
Для пулов хранения на основе образа, которые совместимы с POSIX, вы можете разрешить
lockd
просто сняв комментарий со следующей команды в
/etc/libvirt/qemu.conf
или в обоих гипервизорах:
lock_manager = "lockd"
Теперь включите и запустите в обоих своих гипервизорах службу lockd
. Также
перезапустите в обоих своих гипервизорах libvirtd
следующим образом:
# systemctl enable virtlockd; systemctl start virtlockd
# systemctl restart libvirtd
# systemctl status virtlockd
Запустите MasteringKVM01
в PacktPhy02
как показано ниже:
[root@PacktPhy02] # virsh start MasteringKVM01
Domain MasteringKVM01 started
Запустите ту же самую MasteringKVM01
в PacktPhy01
следующим образом:
[root@PacktPhy01] # virsh start MasteringKVM01
error: Failed to start domain MasteringKVM01
error: resource busy: Lockspace resource '/var/lib/libvirt/
images/ testvms/MasteringKVM01.qcow2' is locked
Другой метод включения lockd
состоит в использовании некого хэша в пути
файла своего диска. Блокировки сохраняются в неком совместном каталоге, который экспортируется через NFS или
аналогичный совместный ресурс, в свои гипервизоры. Это очень полезно когда вы обладаете виртуальными дисками, которые
создаются и подключаются при помощи logical unit number
(LUN) со множеством путей. При таких ситуациях fcntl()
не
может применяться. Для включения такой блокировки мы рекомендуем чтобы вы применяли те методы, которые мы подробнее
поясним далее.
В своём сервере NFS исполните приводимый ниже код (вначале убедитесь что вы не запустили ни одну из ВМ с этого сервера NFS!):
# mkdir /flockd
# echo "/flockd *(rw,no_root_squash)" >> /etc/exports
# systemctl restart nfs-server
# showmount -e
Export list for :
/flockd *
/testvms *
В /etc/fstab
для обоих гипервизоров добавьте следующий код и наберите
остальные эти команды:
# echo "192.168.159.134:/flockd /var/lib/libvirt/lockd/flockd nfs rsize=8192,wsize=8192,timeo=14,intr,sync" >> /etc/fstab
# mkdir -p /var/lib/libvirt/lockd/flockd
# mount -a
# echo 'file_lockspace_dir = "/var/lib/libvirt/lockd/flockd"' >> /etc/libvirt/qemu-lockd.conf
Перезапустите оба гипервизора и, по окончанию их перезапуска, убедитесь что демоны
libvirtd
и virtlockd
правильно
запущены в обоих гипервизорах следующим образом:
[root@PacktPhy01 ~]# virsh start MasteringKVM01
Domain MasteringKVM01 started
[root@PacktPhy02 flockd]# ls
36b8377a5b0cc272a5b4e50929623191c027543c4facb1c6f3c35bacaa7455ef
51e3ed692fdf92ad54c6f234f742bb00d4787912a8a674fb5550b1b826343dd6
MasteringKVM01
обладает двумя виртуальными дисками, один создан из пула
хранения NFS, а другой создан непосредственно из некого LUN. Если вы попробуете его включить в своём хосте гипервизора
PacktPhy02
, MasteringKVM01
откажется
запускаться, что можно обнаружить из следующего фрагмента кодв:
root@PacktPhy02 ~]# virsh start MasteringKVM01
error: Failed to start domain MasteringKVM01
error: resource busy: Lockspace resource
'51e3ed692fdf92ad54c6f234f742bb00d4787912a8a674fb5550b1b826343dd6' is locked
При использовании томов LVM, которые могут видеться во множестве систем хостов, вместо их путей желательно
осуществлять блокировку на основе соответствующего universally unique
identifer (UUID), ассоциируемого с каждым томом. Настройка следующего пути заставит
libvirt
осуществить для LVM блокировку на основе UUID:
lvm_lockspace_dir = "/var/lib/libvirt/lockd/lvmvolumes"
Когда вы применяете тома SCSI, которые могут видеться во множестве систем хостов, вместо таких путей желательно
выполнять блокировку на основании значения UUID, ассоциируемого с каждым томом. Установка приводимого ниже пути заставит
libvirt
выполнить блокировку на основе UUID для SCSI:
scsi_lockspace_dir = "/var/lib/libvirt/lockd/scsivolumes"
Как и для file_lockspace_dir
, значения предыдущих каталогов также надлежит
применять совместно в используемых гипервизорах.
Замечание | |
---|---|
Если вы не способны запустить ВМ по причине ошибок блокирования, просто убедитесь что они не запущены где- то
ещё и затем удалите такие блокирующие файлы. Запустите эту ВМ снова. Мы слегка отклонились от темы миграции для
|
При этом типе миграции соответствующая ВМ мигрирует в установленный хост получателя в то время как она исполняется на своём хосте источника. Это процесс невидим её пользователям, который работают применяя такие ВМ. Они даже и не представляют что используемые ими ВМ переносятся на другой хост в то время как они работают с ними. Миграция в реальном масштабе времени это одна из основных функциональных возможностей, которая делает виртуализацию столь популярной.
Реализация миграции в KVM не требует никакой поддержки от самой ВМ. Это означает, что вы можете в реальном масштабе времени выполнять миграцию любой ВМ, причём независимо от той операционной системы, которую они применяют. Уникальной функциональной особенностью миграцией в реальном времени KVM является то, что она практически полностью аппаратно независима. В идеале вы будете иметь возможность выполнять миграцию в реальном масштабе времени некой ВМ, исполняемой в гипервизоре, который обладает процессором Advanced Micro Devices (AMD) в гипервизор на основе Intel.
Мы не говорим, что это будет работать в 100% случаев, или что мы как- то рекомендуем применять такой вид смешанных сред, однако в большинстве случаев это должно выполняться.
Прежде чем мы запустим этот процесс, давайте слегка глубже разберёмся в том, что происходит под капотом. Когда мы осуществляем миграцию в реальном масштабе времени, мы перемещаем запущенную ВМ в то время как к ней осуществляют доступ пользователи. Это означает, что пользователи не ощущают никакого нарушения в доступности ВМ при выполнении миграции вживую.
Миграция в реальном масштабе времени это сложный процесс из пяти этапов, сложный, даже несмотря на то что никакие
из этих процессов не выставляются своим системным администраторам. После того как активирована миграция такой ВМ,
всю необходимую работу выполняет libvirt
. Поясним в приводимом далее перечне
те этапы, через которые проходит миграция ВМ:
-
Подготовка получателя: После того как вы инициируете миграцию в реальном масштабе времени,
libvirt (SLibvirt)
вашего источника осуществит контакт сlibvirt (DLibvirt)
своего получателя на предмет подробностей той ВМ, которую мы намерены передавать в реальном времени.DLibvirt
передаст эти сведения лежащему в её основе QEMU, причём с надлежащими параметрами для разрешения миграции в реальном масштабе времени. QEMU запустит действительный процесс миграции вживую, стартуя соответствующую ВМ в режимеpause
и приступит к отслеживанию по порту Transmission Control Protocol (TCP) данных ВМ. После того как соответствующий получатель готов,DLibvirt
уведомитSLibvirt
, причём со всеми подробностями относительно QEMU. К этому времени QEMU, в качестве источника, уже готов переместить саму ВМ и подключиться к порту TCP получателя. -
Передача самой ВМ: Когда мы говорим о переносе ВМ, мы не передаём всю ВМ целиком; переносятся лишь те части, которые пропущены в её получателе - например, собственно память и значения состояний виртуальных устройств (состояние ВМ). Всё прочее помимо собственно памяти и значения состояния ВМ, всё иное виртуальное оборудование (виртуальная сеть, виртуальные диски и виртуальные устройства) доступны в самом получателе. Вот как QEMU перемещает собственно память в своего получателя:
-
Сама ВМ продолжает исполняться в своём источнике, а та же самая ВМ запускается в своём получателе в режиме
pause
. -
За один проход передаётся вся используемая этой ВМ память своему получателю. Значение скорости обмена зависит от полосы пропускания сетевой среды. Допустим, ваша ВМ занимает 10 gibibytes (GiB); это потребует того же самого времени, что и передача 10 GiB данных при помощи протокола ] Secure Copy Protocol (SCP) своему получателю. Именно по этой причине мы отделяем свою сетевую среду администрирования от сетевой среды обмена ВМ.
-
После того, как вся память находится в своём получателе, QEMU запускает обмен своими недействительными страницами (dirty pages, страницами, которые ещё пока не записаны на её диск). Когда эта ВМ занятая, значение числа недействительных страниц будет высоким и потребуется время для их перемещения. Помните, недействительные страницы присутствуют всегда, и не существует состояния с нулевым числом недействительных страниц в исполняющейся ВМ. Следовательно, QEMU прекратит передачу своих недействительных страниц когда он достигнет нижнего порога (50 или менее страниц).
QEMU также рассмотрит прочие факторы, такие как итерации, общее число выработанных недействительных страниц и тому подобное. Это также может быть определено в
migrate-setmaxdowntime
, которое задаётся в миллисекундах.
-
-
Останов этой ВИ в её хосте источника: После того как значение недействительных страниц достигнет оговоренного порогового значения, QEMU остановит эту ВМ в своём хосте источника. Он также выполнит синхронизацию своих виртуальных дисков.
-
Передача состояния ВМ: На этом этапе QEMU передаст значение состояния виртуальных устройств этой ВМ и оставшихся недействительных страниц своему получателю так ьыстро, как это только возможно. На данном этапе мы не имеем возможности ограничивать значение полосы пропускания.
-
Возобновление этой ВМ: В своём получателе эта ВМ будет продолжена из своего состояния паузы. Виртуальные network interface controllers (NICs) становятся активными, а соответствующий мост будет по своей инициативе рассылать Address Resolution Protocols (ARPs) для объявления о происшедших изменениях. После получения таких объявлений от соответствующего моста, задействованные сетевые коммутаторы обновят свои соответствующие кэши ARP и начнут отправлять все данные в ту ВМ, которая находится в своём новом гипервизоре.
Обратите внимание, что шаги 3,4 и 5 будут выполнены за миллисекунды. При возникновении каких бы то ни было ошибок QEMU прервёт данную миграцию и эта ВМ продолжит своё исполнение в гипервизоре источника. На протяжении всего этого процесса миграции службы libvirt обоих участвующих гипервизоров будут отслеживать этот процесс миграции.
Наша ВМ с названием MasteringKVM01 в данный момент безопасно запущена в PacktPhy01, причём lockd включён. Мы же намерены осуществить миграцию MasteringKVM01 в реальном масштабе времени в PacktPhy02.
Нам надлежит открыть все необходимые порты, применяемые для миграции. Вам потребуется выполнить это только на
стороне получателя, но хорошим практическим приёмом будет выполнить это раз за разом во всей вашей среде с тем, чтобы
вам не приходилось выполнять такое микро управление когда оно потребуется в будущем. В целом, вам придётся открыть
эти порты в всех участвующих гипервизорах при помощи идущих следом команд firewall-cmd
для установленной по умолчанию зоны (в нашем случае это зона public
):
# firewall-cmd --zone=public --add-port=49152-49216/tcp --permanent
Провеим разрешимость имён в обоих своих серверах следующим образом:
root@PacktPhy01 ~] # host PacktPhy01
PacktPhy01 has address 192.168.159.136
[root@PacktPhy01 ~] # host PacktPhy02
PacktPhy02 has address 192.168.159.135
[root@PacktPhy02 ~] # host PacktPhy01
PacktPhy01 has address 192.168.159.136
[root@PacktPhy02 ~] # host PacktPhy02
PacktPhy02 has address 192.168.159.135
Проверьте и убедитесь что все необходимые подключённые виртуальные диски доступны в вашем получателе, причём по тому же самому пути и с тем же самым названием пула хранения. Это применимо также и для подключённых неуправляемых (iSCSI и FC LUN, а также тому подобного) виртуальных дисков.
Проверьте и убедитесь что все необходимые сетевые мосты и виртуальные сетевые среды, применяемые этой ВМ, доступны в вашем получателе. После этого мы можем запустить сам процесс миграции, выполним следующий код:
# virsh migrate --live MasteringKVM01 qemu+ssh://PacktPhy02/system --verbose --persistent
Migration: [100 %]
Наша ВМ пользуется лишь 4 096 megabytes (MB)
памяти, а потому все пять этапов выполнены за пару секунд. Параметр --persistent
не является обязательным, но мы рекомендуем добавлять его.
Вот вывод ping
на протяжении нашего процесса миграции
(10.10.48.24
это значение IP адреса
MasteringKVM01
):
# ping 10.10.48.24
PING 10.10.48.24 (10.10.48.24) 56(84) bytes of data.
64 bytes from 10.10.48.24: icmp_seq=12 ttl=64 time=0.338 ms
64 bytes from 10.10.48.24: icmp_seq=13 ttl=64 time=3.10 ms
64 bytes from 10.10.48.24: icmp_seq=14 ttl=64 time=0.574 ms
64 bytes from 10.10.48.24: icmp_seq=15 ttl=64 time=2.73 ms
64 bytes from 10.10.48.24: icmp_seq=16 ttl=64 time=0.612 ms
--- 10.10.48.24 ping statistics ---
17 packets transmitted, 17 received, 0% packet loss, time
16003ms
rtt min/avg/max/mdev = 0.338/0.828/3.101/0.777 ms
Если вы получите приводимое ниже сообщение об ошибке, измените в своём подключённом виртуальном диске
cache
в none
:
# virsh migrate --live MasteringKVM01 qemu+ssh://PacktPhy02/system --verbose
error: Unsafe migration: Migration may lead to data corruption if disks use cache != none
# virt-xml MasteringKVM01 --edit --disk target=vda,cache=none
target
это значение диска для изменения значения кэширования. Вы можете
обнаружить это имя цели выполнив такую команду:
virsh dumpxml MasteringKVM01
Вы можете испробовать несколько дополнительных параметров при выполнении миграции в реальном масштабе времени, а именно:
-
--undefine domain
: Параметр применяется для удаления домена KVM из хоста KVM. -
--suspend domain
: Приостанавливает домен, а именно, ставит на паузу домен KVM до тех пор, пока мы не выведем его из этого состояния. -
--compressed
: При выполнении миграции ВМ этот параметр позволяет нам сжимать память. Это подразумевает более быстрый процесс миграции на основании значения параметра–comp-methods
. -
--abort-on-error
: Кога процесс миграции сталкивается с некой ошибкой, он автоматически останавливается. Именно этот безопасный параметр установлен по умолчанию, ибо он помогает в тех ситуациях, когда на протяжении вашего процесса миграции может произойти любой вид разрушений. -
--unsafe
: Некий вид по другую сторону от параметра--abort-on-error
. Это параметр принуждает выполнение миграции при любой её стоимости, даже в случае ошибок, разрушений данных или прочего непредвиденного сценария. Будьте особенно внимательны с этим параметром - не пользуйтесь им часто или в тех случаях, когда ключевым предварительным требованием вы желаете иметь на 100% уверенность в состоятельности данных ВМ.
Относительно этих параметров вы можете получить дополнительные сведения в RHEL 7—Virtualization Deployment and
Administration guide (вы обнаружите ссылку на него в разделе Дальнейшее чтение в конце этой главы). Кроме того, наша команда virsh
поддерживает также следующие параметры:
-
virsh migrate-setmaxdowntime <domain>
: При миграции некой ВМ, временами неизбежно что ВМ становится недоступной на короткий промежуток времени. Это может происходить - к примеру - по причине процесса потери связи, когда мы выполняем миграцию ВМ с одного хоста на другой и мы просто приходим в некий момент равновесного состояния (то есть когда и хост источника, и хост получателя обладают одним и тем же содержимым ВМ готовы удалить такую ВМ источника из описи хоста своего источника и запустить её в своём хосте получателя). В целом, небольшая пауза происходит потому что наша ВМ источника ставится на паузу и уничтожается, а ВМ её хоста получателя снимается с паузы и возобновляется. Применяя данную команду имеющийся стек KVM пытается оценить насколько долго длилась такая стадия останова. Это жизнеобеспечивающий параметр, в особенности для тех ВМ, которые действительно заняты и тем самым происходит много изменений их состояния памяти пока мы выполняем их миграцию. -
virsh migrate-setspeed <domain> bandwidth;
: Мы можем рассматривать его как почти Quality of Service (QoS) параметр. Воспользовавшись им, мы имеем возможность установить объём полосы пропускания в MiB/s, который мы предоставляем своему процессу миграции. Это очень хороший параметр когда наша сетевая среда занята (например, у нас имеется множество virtual local area networks (VLANs), работающих в той же самой физической сетевой среде и по этой причине мы имеем ограничения в полосе пропускания). Численное уменьшение замедляет сам процесс миграции. -
virsh migrate-getspeed <domain>
: Мы можем рассматривать это как параметр сбора сведений космандыmigrate-setspeed
, чтобы проверить какие настройки мы назначили для командыvirsh migrate-setspeed
.
Как вы можете видеть, миграция это сложный процесс с технической точки зрения и он обладает множеством различных типов и загрузок различных дополнительных параметров настроек, которые вы можете применять для целей управления. Как уже было сказано, это всё ещё настолько важная возможность виртуальной среды, что очень трудно представить работу без неё.
В этой главе мы рассмотрели различные способы создания ВМ и настройки оборудования ВМ. Мы также подробно осветили миграцию ВМ, причём выполняя миграцию как в реальном времени, так и в отключённом состоянии. В этих понятия очень важно разобраться, поскольку они сделают вашу жизнь администрирования виртуальной среды намного более простой.
-
Какие инструменты командной строки мы можем применять для развёртывания ВМ в
libvirt
? -
Какие инструменты графического интерфейса мы можем применять для развёртывания ВМ в
-
При настройке наших ВМ с какими сторонами настройки следует быть аккуратными?
-
В чём разница между миграцией в ВМ реальном времени и в откючённом состоянии?
-
В чём разница между миграцией ВМ и миграцией хранилища ВМ?
-
Как мы можем настраивать полосу пропускания для своего процесса миграции?
Для получения дополнительных сведений относящихся к рассмотренному нами в этой главе воспользуйтесь, пожалуйста, следующими ссылками:
Управление ВМ при помощи virt-manager
Влияние NUMA и расположения памяти на производительность Microsof SQL Server 2019
Руководство по развёртыванию и администрированию виртуализации