Rate this post

Контейнерная виртуализация характеризуется высокой эффективностью, но в некоторых случаях она неприменима, и необходимо использовать полноценные виртуальные машины.n

nnВ предыдущей статье о Virtuozzo 7 мы отмечали, что на­ряду с преимуществами в виде низких накладных расходов и высокой производительности контейнерная виртуали­зация по определению обладает ограничениями в плане операционных систем, которые можно использовать вну­три виртуальных окружений, — ведь эти ОС должны будут работать на том же ядре, что и основная система. Кроме того, реализация контейнерной виртуализации требует вме­шательства в ядро системы, что затруднительно без досту­па к ее исходному коду. Поэтому данный вид виртуализации традиционно применяется в открытых системах, и в первую очередь в Linux.nnLinux — популярная ОС на серверах и на рынке хостинг-провайдеров, однако нередки ситуации, когда контейнерная виртуализация не работает и необходимы более «тяжело­весные» подходы. Понимают это и разработчики Virtuozzo, и контейнерной виртуализацией возможности их продуктов не ограничиваются.nnРабота с виртуальными машинами стала ключевым нов­шеством очередной предварительной версии Virtuozzo 7, вышедшей в декабре 2015 года. Как и предыдущая, эта вер­сия имеет статус Technical Preview и предназначена для оз­накомления, но не для промышленного применения.nnПоддержка «полноценных» виртуальных машин (предо­ставляющих более высокую степень изоляции по сравне­нию с контейнерами и позволяющих запускать любые госте­вые ОС) имелась в продуктах Virtuozzo уже давно, однако до Virtuozzo 6 включительно для управления такими маши­нами использовался свой собственный проприетарный ги-первизор.nnВ новой же версии продукта тенденцию перехода на от­крытые инструменты было решено продолжить и в сфере гипервизоров. В Virtuozzo 7 управление виртуальными ма­шинами возложено на KVM, к настоящему времени став­ший достаточно зрелым для промышленного использова­ния. Причины такого перехода традиционны — создавать сложный продукт совместно с другими крупными игро­ками выгодно как с точки зрения снижения собственных затрат на разработку, так и в плане получения продукта со стандартной основой, знакомой многим потенциальным пользователям.nnВ этой статье рассмотрим процесс управления виртуаль­ными машинами в Virtuozzo 7 и попробуем оценить, что уни­кального предлагает Virtuozzo по сравнению с другими ре­шениями, основанными на KVM.n

Создание и запуск ВМ Virtuozzo 7

Чтобы иметь возможность работать с ВМ, необходимо устано­вить последнюю доступную версию Virtuozzo 7 (https://download.openvz.org/virtuozzo/releases/7.0/x86_64/iso). Поскольку виртуальные машины основаны на KVM, то необходим сер­вер с аппаратной поддержкой виртуализации.nnУправление виртуальными машинами осуществляется с помощью утилиты prlctl, которая используется и для уп­равления контейнерами. Главное отличие — при создании виртуальной машины необходимо опцию —vmtype выставить в значение vm:n

 #  prlctl create vml --vmtype vm --distribution=win-xp

Как и для контейнеров, при создании ВМ можно ис­пользовать заранее подготовленные шаблоны с помо­щью опции —ostemplate. Рассмотрим вариант, когда нужно самостоятельно установить операционную систему внутрь ВМ (что вполне вероятно, ведь нужного шаблона может и не оказаться). В отсутствие шаблона можно указать, ОС ка­кого семейства вы планируете использовать, с помощью опции —distribution. Получить перечень возможных значений для этой опции можно с помощью следующей команды:n

 #  prlctl create vm -d list

Советуем внимательно подойти к выбору значения этой опции при создании ВМ, поскольку при расхождении с ре­ально устанавливаемой системой могут возникнуть неприят­ности — например, в одном из наших экспериментов попытка установить Window XP в сконфигурированную под CentOS машину успехом не увенчалась, закончившись «синим экр­ном смерти».nnСамый прямолинейный способ установить ОС в вирту­альную машину Virtuozzo — это подключить к машине уста­новочный диск и загрузиться с него, контролируя ход уста­новки по VNC. Для этого перед стартом машины необходимо подключить к ней ISO-образ установочного диска (также поддерживаются форматы CUE, CCD и DMG, а кроме того, можно подключить DVD-привод машины, на котором запу­скается ВМ):n

 #  prlctl set vml --device-add cdrom --image <имя_образа.iso>

а также разрешить доступ по VNC — для простоты разрешим доступ без пароля:n

 #  prlctl set vml --vnc-mode auto --vnc-nopasswd

Теперь можно запустить ВМ точно так же, как мы это де­лали с контейнерами:n

 #  prlctl start vml

После чего можно подключиться к серверу, на котором запущена ВМ, с помощью любого VNC-клиента. Машина должна загрузиться с подключенного образа, и мы увидим программу установки (см. рис. 1). При необходимости дос­тупа к нескольким ВМ на одном сервере можно разнести их на разные порты с помощью опции —vnc-port.nnvirtuozzo7nnЕсли по какой-то причине ВМ начинает загружаться не с того устройства, можно изменить порядок загрузки с по­мощью prlctl set. Например, следующая команда заставит ВМ грузиться сначала с устройства cdroml, затем с hddO:n

 #  prlctl set vml --device-bootorder="cdrom1 hdd0"

Какие именно устройства подключены к ВМ, показывает расширенная информация:n

 #  prlctl list -i vml

Управление ВМ

Как вы уже наверняка заметили, управление виртуальными машинами в Virtuozzo мало чем отличается от управления контейнерами — все операции можно производить с помо­щью одной и той же утилиты prlctl, а названия и опции мно­гих операций не зависят от типа виртуального окружения. Впрочем, некоторые операции доступны только для контей­неров, а некоторые — только для ВМ.nnНапример, ряд команд (в частности, create и clone, с которой мы познакомимся чуть позже) имеет опцию —changesid, изменяющую значение идентификатора безо­пасности Windows (SID — security idendifier); но поскольку Virtuozzo 7 позволяет создавать только Linux-контейнеры, то для контейнеров эта опция неактуальна.nnТо же самое можно сказать о возможности выставить режим SD-ускорения внутри ВМ в dx9 (обеспечивающий поддержку DirectX 9), а более заметный пример — это воз­можность приостановить работу ВМ командой prlctl pause (остановка осуществляется мгновенно, а продолжить рабо­ту ВМ можно с помощью prlctl start).nnПолный набор действий, которые prlctl позволяет осу­ществлять с ВМ, можно найти в (https://docs.openvz.org/virtuozzo_7_users_guide.pdf)nnДля выполнения операций, требующих взаимодействия с операционной системой внутри ВМ (например, prlctl exec или prlctl enter), необходимо предварительно установить внутри ВМ специальные дополнения — Virtuozzo Guest Tools. Эти дополнения в первую очередь содержат драйверы для ядра гостевой ОС, которые позволят основной системе с ней общаться; в случае контейнеров необходимости в от­дельной установке таких драйверов нет, так как в основной и гостевых ОС используется одно и то же ядро.nnДля установки Guest Tools выполните следующую коман­ду, которая подключит ISO-образ с дополнениями, как диск CD-ROM в гостевой системе:n

# prlctl installtools vml

В Linux-системах необходимо запустить скрипт install с этого диска, который установит необходимые пакеты. В Windows необходимо установить драйвер VirtIO посред­ством inf-файла vioserial/<Win_version>/<architecture>/ vioser.inf, а также запустить установщики prl_nettool_<Win_ arch>.msi и qemu-ga-<Win_arch>.msi.nnПризнаком корректности установки дополнений как в ОС Windows, так и в Linux будет запущенный сер­вис qemu-ga (QEMU Guest Agent — как видно из названия, это стандартный агент QEMU, доработанный под нужды Virtuozzo).nnКак и для любого ПО, для гостевых дополнений время от времени выходят обновления, автоматическую установку которых внутри ВМ можно настроить с помощью следующей команды:n

#  prlctl set vml -tools-autoupdate on

Настройка сети

Важный аспект настройки ВМ — это конфигурация сетевого взаимодействия с внешним миром и друг с другом. По умол­чанию Virtuozzo создает на сервере две сети, к которым можно подключать ВМ и контейнеры:n

  • Bridged — связанную с одним из сетевых адаптеров сер­вера и имеющую доступ наружу,
  • Host-only — привязанную к специальному виртуальному адаптеру и используемую для виртуальных окружений, которым нужен доступ только к серверу и другим окруже­ниям на этом сервере.

Можно создавать несколько сетей одного вида, так что ВМ и контейнеры будут видеть только окружения только в той сети, к которой подключены сами. Управление сетями осуществляется с помощью команды prlsrvctl. Напри­мер, следующая команда создаст сеть networkl типа bridged и привяжет ее к сетевому интерфейсу enp0s6 на сервере.n

 #  prlsrvctl net add networkl -t bridged --ifname enp0s6

Опция —dhcp-server позволяет включать/отключать ис­пользование DHCP-сервера для ВМ, подключаемых к дан­ной сети, IP-адрес этого сервера указывается в —dhcp-ip. Диапазон адресов в сети задается посредством —ip (прини­мающей аргумент в виде «адрес/маска подсети») либо па­ры —ip-scope-start/—ip-scope-end.nnКоманда prlsrvctl net list покажет список имеющихся се­тей, prlsrvctl net set может быть использована для изменения параметров, а prlsrvctl net del — для их удаления.nnЧто касается подключения ВМ, то для каждой из них Virtuozzo позволяет определить до 16 сетевых адаптеров, каждый из которых можно соединить с отдельной сетью. Добавление адаптеров осуществляется командой prlctl set —device-add:n

 #  prlctl set vml --device-add netl

А посредством опции —device-set можно задавать нас­тройки. В частности, можно вручную прописать IP, DNS и шлюз:n

#  prlctl set vml --device-set netl --ipadd 192.129.129.20 --gw 192.129.129.1 --nameserver 192.192.192.10

либо настроить машину на использование DHCP:n

 #  prlctl set vm1 --device-set net1 --dhcp yes

Обратите внимание, что для манипуляций с настройками сетевого адаптера с помощью prlctl внутри ВМ должны быть установлены Virtuozzo Guest Tools.nnПо умолчанию сетевые адаптеры ВМ подключаются к од­ной из сетей типа Bridged. Подключить адаптер к другой сети можно с помощью все той же опции —device-set:n

 #  prlctl set vm1 --device-set net1 --network network1

Использование сторонних инструментов

Поскольку виртуальные машины в Virtuozzo 7 основаны на QEMU/KVM, то для управления ими можно использовать и сторонние средства — например, virt-install, virsh или virt-manager, доступный в репозиториях Virtuozzo (см. рис. 2).nnvirtuozzo7-1nnСовместимость имеет место быть в двух направлениях -prlctl может применяться для контроля машин, созданных с помощью сторонних утилит, а эти самые утилиты могут ис­пользоваться для взаимодействия с ВМ, созданными с по­мощью prlctl.nnУчтите, что, хотя основная пакетная база Virtuozzo 7 осно­вана на RHEL 7.x, версии QEMU, virt-manager и ряда других пакетов, относящихся к виртуализации, существенно новее, чем в RHEL, и содержат уникальные для Virtuozzo модифика­ции. Поэтому сторонние инструменты, даже взятые из RHEL, могут работать некорректно либо предоставлять неполный функционал.nnВсе инструменты для работы с QEMU/KVM позволят ра­ботать с виртуальными машинами Virtuozzo, но не с кон­тейнерами. Достоинством же «родных» средств Virtuozzo (в частности, prlctl) является унификация работы с контей­нерами и ВМ — при выполнении большинства команд вам не обязательно знать, какой тип виртуализации использует­ся для того или иного окружения.n

Клонирование и создание шаблонов

Создание ВМ «с нуля» посредством установки и настрой­ки ОС и необходимых приложений — занятие трудоемкое и немасштабируемое. Наличие заранее подготовленных шаблонов с основными дистрибутивами Linux и стеками приложений частично спасает ситуацию. Найти сторонние шаблоны на все случаи жизни вряд ли получится, однако можно подготовить их самим. Для создания большого ко­личества виртуальных окружений с одинаковыми харак­теристиками пригодится возможность клонирования уже имеющихся ВМ и контейнеров. Virtuozzo совмещает эти две задачи (клонирование и создание шаблонов) в операции prlctl clone, которая может быть использована как для ВМ, так и для контейнеров.nnОсновное использование этой команды прямолинейно. Для примера склонируем vm1 в vm2:n

 #  prlctl clone vm1 --name vm2

По умолчанию создается виртуальное окружение, полно­стью идентичное исходному, за исключением MAC-адреса. Для Windows-машин имеет смысл указать уже упоминавшу­юся опцию —changesid для генерации Security ID, отлично­го от SID исходной машины. Чтобы эта опция отработала успешно, в исходной ВМ должны быть установлены Virtuozzo Guest Tools.nn

nСоздаваемый клон полностью независим от родитель­ской машины — в частности, для него создается свой собст­венный виртуальный жесткий диск, являющийся копией дис­ка исходной системы.nnУказав опцию —linked, можно создавать связанные ВМ, основанные на снимке состояния исходного окружения. Для таких клонов хранятся только изменения, сделанные после создания снимка, которые на этот снимок наклады­ваются.nnВсе последующие изменения, производимые с диском родительской ВМ, не затрагивают связанный клон, и наобо­рот. Такой подход позволяет сэкономить дисковое простран­ство на сервере, однако требует наличия родительской ВМ на той же машине, где располагается клон, — то есть перене­сти только клонированную ВМ на другой сервер вы не смо­жете.nnДля создания шаблона достаточно добавить опцию —template:n

 # prlctl clone vml --name my_vm_template -template

После этого сможете указывать имя my_vm_template в оп­ции —ostemplate при создании новых ВМ.nnТаким образом, Virtuozzo 7 позволяет разворачивать на одном физическом сервере как легковесные контейне­ры, так и полноценные ВМ на основе гипервизора KVM, де­лая возможным развертывание виртуальных сред на базе Windows и BSD (что актуально, например, для провайде-ров, и позволяет им существенно расширить спектр своих VPS-предложений). При этом Virtuozzo предоставляет унифици­рованный интерфейс для управления всеми виртуальными окружениями независимо от их типа.nnНадеюсь, что данная статья в совокупности со ста­тьей дала вам достаточно сведений, чтобы попробовать Virtuozzo 7 в деле.nnИсточник: журнал Системный администратор №158-159n

Предоставляем услуги разработки, установки и поддержки ИТ инфраструктуры с использованием виртуализации.