Основы виртуализации и введение в KVM. Используем KVM для создания виртуальных машин на сервере

Оригинал: Welcome to KVM virtualization - Thorough introduction
Автор: Igor Ljubuncic
Дата публикации: 4 мая 2011 года
Перевод: А. Кривошей
Дата перевода: июль 2011 г.

Если вы читали мои статьи о виртуализации, то знаете, что раньше я пользовался в основном VMware и VirtualBox, но теперь настало время попробовать что-нибудь новенькое. Сегодня я хотел бы представить новый цикл заметок о KVM. Дальше, возможно, я переключюсь на Xen или какую-то другую систему, но сейчас герой нашего топика - KVM .
В данном руководстве мы поговорим о технологии KVM (Kernel-based Virtual Machine), которую создала RedHat, и которая имеет открытый исходный код, являяясь бесплатной альтернативой своих коммерческих аналогов. Мы узнаем, как скачать, установить и настроить KVM, какие инструменты она имеет для управления виртуальными машинами, как работать с KVM в командной строке, писать скрипты и многое другое. Кроме того, мы коснемся создания продвинутых (в том числе сетевых) конфигураций, а также других интересных вещей. Теперь начнем.

Глоссарий KVM

Сначала немного поговорим о том, как работает KVM. Ничего заумного, просто небольшое введение, чтобы вы знали базовую терминологию.
KVM использует технологию аппаратной виртуализации, поддерживаемую современными процессорами от Intel и AMD и известную под названиями Intel-VT и AMD-V. Используя загруженный в память модуль ядра, KVM, с помощью драйвера пользовательского режима (который представляет собой модифицированный драйвер от QEMU), эмулирует слой аппаратного обеспечения, поверх которого могут создаваться и запускаться виртуальные машины. KVM может функционировать и без аппаратной виртуализации (если она не поддерживается процессором), но в этом случае она работает в режиме чистой эмуляции с использованием QUEMU и производительность виртуальных машин очень сильно снижается.
Для управления KVM можно использовать графическую утилиту, похожую на продукты от VMware и VirtualBox, а также командную строку.
Самым популярным графическим интерфейсом является Virtual Machine Manager (VMM), созданный в RedHat. Он также известен по имени своего пакета как virt-manager и содержит несколько утилит, включая virt-install, virt-clone, virt-image и virt-viewer, служащие для создания, клонирования, установки и просмотра виртуалльных машин. VMM поддерживает также виртуальные машины Xen.
Базовый интерфейс командной строки KVM обеспечивается утилитой virsh . В определенных случаях вы можете использовать утилиты поддержки, такие как virt-install, для создания своих виртуальных машин. В Ubuntu имеется специальная утилита ubuntu-vm-builder , разработанная в Canonical, с помощью которой можно создавать билды Ubuntu.
Если вы хотите узнать больше о KVM, дополнительная информацию можно найти по следующим адресам:

Преимущества и недостатки KVM

Нужен ли вам KVM? Это зависит от того, для чего он вам нужен.
Если вы еще не пользовались виртуальными машинами или запускали их несколько раз просто для интереса, то освоение KVM может оказаться трудным. Эта программа управляется преимущественно из командной строки и не так дружелюбна к пользователю, как VMware или VirtualBox. Можно сказать, что в плане графического интерфейса KVM отстает от своих конкурентов на несколько лет, хотя на самом деле по своим возможностям им по крайней мере не уступает. Возможности KVM наиболее востребованы при ее применении в коммерческих целях в бизнес-окружении.
Далее, если ваш процессор не поддерживает аппаратную виртуализацию, то KVM будет работать в очень медленном и неэффективном режиме программной эмуляции. Кроме того, известно, что KVM конфликтует с VirtualBox, однако этому случаю будет посвящена отдельная заметка.
На основании вышесказанного можно сделать вывод, что KVM больше подходит людям, которые занимаются виртуализацией в профессиональных целях. Вряд ли она станет вашей любимой домашней игрушкой, однако если вы решите затратить определенные усилия для ее изучения, то полученные при этом знания позволят быть с технологиями виртуализации на "ты". В отличие от VMware и VirtualBox, изначально предполагающих, что пользователь будет работать с программой, используя графический интерфейс, KVM ориентирована на использование командной строки и написание скриптов.
Подводя итого, можно сказать, что преимущества KVM заключаются в использовании новейших технологий виртуализации, отсутствии каких-либо лицерзионных ограничений в использовании, мощном интерфейсе командной строки. Если ваш процессор не поддерживает аппаратной виртуализации, вы не хотите писать скрипты и предпочитаете более простые в администрировании системы, такие как VMware Server, ESXi или VirtualBox, то KVM не для вас.

Тестовая платформа

KVM можно использовать на любом дистрибутиве Linux. Однако основным разработчиком и спонсором KVM является RedHat. Например, RHEL поставляется сразу с KVM, поэтому вы можете найти ее в любом дистрибутиве на базе RedHat, например CentOS, Scientific Linux, или Fedora.
Так как дома я пользуюсь преимущественно Ubuntu, то и тестировать KVM буду на этой системе, установленный на мой сравнительно новый ноутбук HP, оснащенный процессором i5 с поддержкой аппаратной виртуализации.
В данной статье я расскажу, как установить KVM на 64-битную Ubuntu Lucid (LTS).

Подготовка к установке

Сначала необходимо проверить, поддерживает ли ваш процессор аппаратную виртуализацию. Это делается с помощью следующей команды:

$ egrep -c "(vmx|svm)" /proc/cpuinfo

Если вывод представляет собой ненулевое число, все в порядке. Кроме того, необходимо проверить, что технология виртуализации активирована в BIOS.
Естественно, после ее активирования необходимо перезагрузить машину, чтобы изменения вступили в силу. Для проверки выполните команду kvm-ok:

Скачивание и установка KVM

Для работы KVM необходимо установить следующие пакеты (для дистрибутивов с apt):

$ apt-get install qemu-kvm libvirt-bin

$ apt-get install bridge-utils virt-manager python-virtinst

P.S. В различных дистрибутивах пакеты могут называться по разному. Например, virt-install может называться python-virt-install или python-virtinst. Зависимости для virt-clone, virt-image и virt-viewer должны установиться автоматически. В отличие от того, что пишется в большинстве руководств, утилиты bridge устанавливать необязательно. Они нужны только в том случае, если вы собираетесь создавать сетевой мост между виртуальными и физическими сетевыми картами. В большинстве руководств также указывается, что большинство беспроводных сетевых интерфейсов не работают с мостами. Может быть это верно для какого-либо частного случая, однако у меня мост прекрасно работает с беспроводными адаптерами, поэтому будем надеяться, что и вас все заработает.
Я настоятельно рекомендую VMM (virt-manager). Более того, лучше установить и все утилиты поддержки, включая virt-viewer, virt-install, virt-image и virt-clone.
И последнее. Вы можете предпочесть ubuntu-vm-builder:

$ apt-get install ubuntu-vm-builder

Кроме этого, скорее всего будет установлено большое количество зависимостей, поэтому загрузка может занять значительное время.
P.S. На RedHat используйте yum install, на SUSE - zypper install.

Конфликт с VirtualBox

Я снова выскажу мнение, отличное от изложенного в большинстве рукводств: KVM и VirtualBox можно устанавливать вместе на одну систему. Но запустить их одновременно не получится. Другими словами, модуль ядра одной из виртуальных машин должен быть выгружен из оперативной памяти. Но это не причина отказываться от установки. Просто попробуйте, будут ли они работать у вас. Если нет, эту неполадку можно будет исправить. Позже я выложу отдельное руководство, посвященное устранению этой проблемы. У меня сейчас установлены и работают обе виртуальные машины.

Использование KVM

Ну а теперь самое интересное. Мы начнем знакомство с KVM с ее графического интерфейса, который мало отличается от аналогов. таких как консоль VMware и особенно VirtualBox.

Virtual Machine Manager (VMM)

При первом запуске программы вы увидите две категории, обе не подключенные. Это ссылки на стандартные модули KVM, пока не работающие. Для их использования щелкните правой кнопкой мыши и выберите "connect".

Для их использования щелкните правой кнопкой мыши и выберите "connect". Чтобы добавить новое соединение, выберите в меню File > Add Connection. При этом откроется окно, в котором можно будет задать тип гипервизора и тип соединения. VMM может использовать как локальные, так и удаленные соединения, включая QUEMU/KVM и Xen. Кроме того, поддерживаются все методы аутентификации.

Можно также поставить галочку autoconnect. При следующем запуске программы эти соединения будут готовы к использованию. Это похоже на стартовый интерфейс VMware Server. Просто для примера:

Kernel vs Usermode

Вы можете спросить, в чем различие между режимами normal/default и Usermode? При использовании Usermode виртуальную машину можно запускать без административных привилегий, но ее сетевая функциональность при этом будет ограничена.

Продолжаем изучение VMM

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

Аналогично можно изменить параметры дисковой подсистемы:

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

VMM имеет небольшой набор опций, изменяя которые вы сможете лучше настроить программу под свои нужды. Например, можно активировать показ иконки VMM в системном трее, задать интервал сбора статистики, активировать сбор данных по дисковым и сетевым метрикам, настроить захват клавиатуры, масштабирование консоли, опции аудиосистемы и т.д.

После этого вы сможете просматривать более подробную информацию о виртуальной машине. Например, ниже показан вывод информации об использовании процессора, дисковой и сетевой подсистем для гостевой системы Ubuntu.

Иконка в системном трее выглядит так:

Теперь мы готовы создать новую виртуальную машину.

Создание виртуальной машины

Создать виртуальную машину можно и из командной строки, но для начала воспользуемся VMM. Первый шаг должен быть интуитивно понятен. Введите название и задайте расположение инсталляционного диска. Это может быть как локальное устройство в виде диска CD/DVD или образа ISO, так и HTTP или FTP сервер, NFS или PXE.

Мы используем локальный носитель. Теперь необходимо задать, будет ли это физическое устройство или образ. В нашем случае используется ISO. Далее нужно выбрать тип и версию ISO. Здесь не требуется такая уж высокая точность, но правильный выбор позволит повысить производительность виртуальной машины.

Четвертый этап - виртуальный диск. Вы можете создать новый образ или использовать существующий. Необходимо выбрать размер диска и задать, будет ли создан образ диска сразу заданного размера, либо его размер будет увеличиваться динамически по мере необходимости. Необходимо отметить, что выделение сразу всего пространства под образ диска повышает производительность и уменьшает фрагментирование файловой системы.

Далее мы еще уделим внимание дисковой подсистеме. Однако обратите внимание, что при работе в режиме Usermode у вас не будет прав записи в /var, где по умолчанию хранятся образы виртуальных дисков. Поэтому необходимо будет задать другое расположение для образов. Более подробно этот вопрос будет освещен в отдельной статье.
Этап 5 - это вывод сводных данных с возможностью настройки некоторых продвинутых опций. Здесь вы можете изменить тип сети, задать фиксированные MAC-адреса, выбрать тип виртуализации и целевую архитектуру. Если вы работаете в режиме Usermode, возможности настройки сети будут ограничены, например невозможно будет создать мосты между сетевыми интерфейсами. И последнее: если ваш процессор не поддерживает аппаратной виртуализации, поле Virt Type будет иметь значение QUEMU и сменить его на KVM будет невозможно. Ниже мы рассмотрим недостатки работы в режиме эмуляции. А теперь можете посмотреть, как выглядят типовые настройки для виртуальной машины Ubuntu:

Наша машина готова к использованию.

Настройка виртуальной машины

Консоль VM также имеет несколько интересных опций. Вы можете посылать сигналы гостевой системе, переключаться между виртуальными консолями, перезагружать или выключать гостевую систему, клонировать, перемещать, сохранять состояние виртуальной машины, делать скриншоты и так далее. Снова все, как у конкурентов.

Ниже представлена пара скриншотов, показывающая опции клонирования и перемещения виртуальной машины. В дальнейшем мы подробно рассмотрим данный вопрос.

Запуск виртуальной машины

А теперь самое интересное. Ниже несколько красивых скриншотов...
Начинаем с загрузочного меню 32-битной версии Ubuntu 10.10 Maverick:

Рабочий стол Puppy Linux как всегда великолепен:

Теперь Ubuntu, запущенная под NAT. Обратите внимание на низкую загрузку процессора. Позже мы поговорим об этом, когда будем обсуждать режим эмуляции.

Размер окна консоли можно подгонять под разрешение рабочего стола гостевой системы. На следущем скриншоте Puppy и Ubuntu бок о бок:

Обратите внимание на небольшую загрузку системы. С этим режимом эмуляции можно запускать одновременно несколько виртуальных машин.

При необходимости можно удалить виртуальную машину вместе со всеми ее файлами:

Командная строка

Ну а теперь познакомимся поближе с нелюбимой командной строкой. Например, выведем список всех доступных виртуальных машин с помощью virsh.

$ virsh "list --all"

Ниже приведена последовательность команд для создания и запуска виртуальной машины с помощью virt-install.

Полностью команда выглядит так:

$ virt-install --connect qemu://system -n puppy -r 512 -f puppy.img -c lupu-520.iso --vnc --noautoconsole --os-type linux --accelerate --network=network:default

--connect qemu:///system задает тип гипервизора. Опция system используется при запуске машины на голом ядре от имени суперпользователя. При запуске от имени обычного пользователя используется опция session.
-n puppy - это уникальное имя виртуальной машины. Его можно изменить с помощью virsh.
-r 512 задает размер RAM.
-f задает файл образа диска. В моем случае это puppy.img, который я создал с помощью команды dd.
-c задает the CD-ROM, который может быть как физическим устройством, так и ISO-образом.
--vnc создает гостевую консоль и экспортирует ее как сервер VNC. Опция --noautoconnect запрещает автоматическое открытие консоли при запуске виртуальной машины.
--os-type задает тип гостевой операционной системы.
--accelerate разрешает KVM использовать функции оптимизации, повышающие производительность гостевой системы.
--network определяет тип сети. В нашем случае используется соединение, заданное по умолчанию.

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

Режим чистой эмуляции

Я уже говорил, что он ужасно неэффективен. Теперь подтвердим это на практике. Например, на представленном ниже скриншоте можно видеть, что система при работе потребляет все доступные ей ресурсы процессора, которые в данном случае при наличии одного ядра составляют 25% ресурсов физического процессора. Это значит, что четыре виртуальные машины будут полностью загружать четырехъядерный хост.

Кроме того, производительность гостевой системы ниже всякой критики. Если при включенной аппаратной виртуализации загрузка гостевой Ubuntu занимала у меня около 1 минуты, то после ее отключения она составила 20 минут. Необходимо отметить, что без использования аппаратной виртуализации производительность QUEMU/KVM намного ниже, чем у конкурентов.

Гипервизоры, виртуализация и облако

Анализ гипервизора KVM

Серия контента:

Об этом цикле статей

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

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

Что нужно знать для начала

Kernel-based Virtual Machine (KVM) – это полное решение платформенно-зависимой виртуализации для Linux на процессорах x86 с расширениями виртуализации (Intel VT или AMD-V). Для гостевых систем доступна также ограниченная поддержка паравиртуализации для Linux и Windows в форме паравиртуального сетевого драйвера.

В настоящее время KVM взаимодействует с ядром через загружаемый модуль ядра. Поддерживаются разнообразные гостевые операционные системы, такие как Linux, BSD, Solaris, Windows, Haiku, ReactOS и AROS Research Operating System. Модифицированная версия KVM (qemu) может работать на Mac OS X.

Примечание: KVM не выполняет никакой самоэмуляции; вместо этого, программа, работающая в пользовательском пространстве, применяет интерфейс /dev/kvm для настройки адресного пространства гостевого виртуального сервера, берет его смоделированные ресурсы ввода/вывода и отображает его образ на образ хоста.

Архитектура KVM показана на рисунке 1.

Рисунок 1. Архитектура KVM
Паравиртуализация

Паравиртуализация ― это метод виртуализации, который предоставляет виртуальным машинам программный интерфейс, подобный, но не идентичный базовым аппаратным средствам. Задачей этого модифицированного интерфейса является сокращение времени, затрачиваемого гостевой операционной системой на выполнение операций, которые в виртуальной среде выполнить значительно труднее, чем в невиртуализированной.

Существуют специальные "крюки" (hooks), позволяющие гостевой и хозяйской системам запрашивать и подтверждать решение этих сложных задач, которые можно было бы выполнить и в виртуальной среде, но значительно медленнее.

В архитектуре KVM, виртуальная машина выполняется как обычный Linux-процесс, запланированный стандартным планировщиком Linux. На самом деле каждый виртуальный процессор представляется как обычный Linux-процесс. Это позволяет KVM пользоваться всеми возможностями ядра Linux.

Эмуляцией устройств управляет модифицированная версия qemu, которая обеспечивает эмуляцию BIOS, шины PCI, шины USB, а также стандартный набор устройств, таких как дисковые контроллеры IDE и SCSI, сетевые карты и т.д.

Функциональные возможности

Ниже перечислены основные функции KVM.

Безопасность

Поскольку виртуальная машина реализована как Linux-процесс, она использует стандартную модель безопасности Linux для изоляции и управления ресурсами. С помощью SELinux (Security-Enhanced Linux) ядро Linux добавляет обязательные средства контроля доступа, многоуровневые и разнообразные средства защиты, а также управляет политикой безопасности. SELinux обеспечивает строгую изоляцию ресурсов и ограничивает подвижность процессов, запущенных в ядре Linux.

Проект SVirt – попытка усилиями сообщества интегрировать функции безопасности Mandatory Access Control (MAC) и виртуализацию на базе Linux (KVM) - основывается на SELinux, чтобы обеспечить инфраструктуру, которая позволит администратору определять политику изоляции виртуальных машин. SVirt призван гарантировать, что ресурсы виртуальных машин не будут доступны ни для каких других процессов (или виртуальных машин); администратор может дополнить эту политику, определив детальные разрешения; например, чтобы группа виртуальных машин совместно использовала одни и те же ресурсы.

Управление памятью

KVM наследует мощные функции управления памятью от Linux. Память виртуальной машины хранится так же, как память любого другого Linux-процесса, и может заменяться, копироваться большими страницами для повышения производительности, обобщаться или сохраняться в файле на диске. Поддержка технологии NUMA (Non-Uniform Memory Access, архитектура памяти для многопроцессорных систем) позволяет виртуальным машинам эффективно обращаться к памяти большого объема.

KVM поддерживает новейшие функции виртуализации памяти от производителей процессоров, в частности, Intel Extended Page Table (EPT) и AMD Rapid Virtualization Indexing (RVI), для минимизации загрузки процессора и достижения высокой пропускной способности.

Обобщение страниц памяти поддерживается с помощью функции ядра Kernel Same-page Merging (KSM). KSM сканирует память каждой виртуальной машины, и если какие-то страницы памяти виртуальных машин идентичны, объединяет их в одну страницу, которая становится общей для этих виртуальных машин и хранится в единственной копии. Если гостевая система пытается изменить эту общую страницу, ей предоставляется собственная копия.

Хранение данных

KVM может использовать любой носитель, поддерживаемый Linux, для хранения образов виртуальных машин, в том числе локальные диски с интерфейсами IDE, SCSI и SATA, Network Attached Storage (NAS), включая NFS и SAMBA/CIFS, или SAN с поддержкой iSCSI и Fibre Channel. Для улучшения пропускной способности системы хранения данных и резервирования может использоваться многопоточный ввод/вывод.

Опять же, поскольку KVM входит в состав ядра Linux, может использоваться проверенная и надежная инфраструктура хранения данных с поддержкой всех ведущих производителей; его набор функций хранения проверен на многих производственных установках.

KVM поддерживает образы виртуальных машин в распределенных файловых системах, таких как Global File System (GFS2), так что они могут разделяться несколькими хостами или обобщаться с использованием логических томов. Поддержка тонкой настройки (thin provisioning) образов дисков позволяет оптимизировать использование ресурсов хранения данных, выделяя их не сразу все наперед, а только тогда, когда этого требует виртуальная машина. Собственный формат дисков для KVM ― QCOW2 ― обеспечивает поддержку снимков текущего состояния и обеспечивает несколько уровней таких снимков, а также сжатие и шифрование.

Динамическая миграция

KVM поддерживает динамическую миграцию, обеспечивая возможность перемещения работающих виртуальных машин между физическими узлами без прерывания обслуживания. Динамическая миграция прозрачна для пользователей: виртуальная машина остается включенной, сетевые соединения ― активными, и пользовательские приложения продолжают работать, в то время как виртуальная машина перемещается на новый физический сервер.

Кроме динамической миграции, KVM поддерживает сохранение копии текущего состояния виртуальной машины на диск, позволяя хранить ее и восстанавливать позднее.

Драйверы устройств

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

Гипервизор KVM использует стандарт VirtIO, разработанный IBM и Red Hat совместно с Linux-сообществом для паравиртуализированных драйверов; это независимый от гипервизора интерфейс для создания драйверов устройств, позволяющий нескольким гипервизорам использовать один и тот же набор драйверов устройств, что улучшает взаимодействие между гостевыми системами.

Драйверы VirtIO входят в современные версии Linux-ядра (наиболее поздняя ― 2.6.25), включены в Red Hat Enterprise Linux 4.8+ и 5.3+, а также доступны для Red Hat Enterprise Linux 3. Red Hat разработала драйверы VirtIO для гостевых ОС Microsoft Windows, оптимизирующие сетевые и дисковые операции ввода/вывода; эти драйверы сертифицированы по программе сертификации Microsoft Windows Hardware Quality Labs (WHQL).

Производительность и масштабируемость

KVM унаследовал производительность и масштабируемость Linux, поддерживая виртуальные машины с 16 виртуальными процессорами и 256 ГБ оперативной памяти, а также хост-системы с 256 ядрами и более 1 ТБ ОЗУ. Он может обеспечить:

  • производительность в 95-135% по сравнению с "голым железом" в реальных корпоративных приложениях, таких как SAP, Oracle, LAMP и Microsoft Exchange;
  • свыше миллиона сообщений в секунду и менее чем 200-мкс задержку в виртуальных машинах, работающих на стандартном сервере;
  • максимальные уровни консолидации более чем с 600 виртуальными машинами, выполняющими корпоративные приложения, на одном сервере.

Это означает, что KVM допускает виртуализацию самых требовательных рабочих нагрузок.

Развертывание виртуализации

Развертывание KVM ― довольно сложный процесс, полный особых требований к конфигурации, так что за дополнительной информации обращайтесь к разделу .

Управление виртуальными машинами

Существует несколько менеджеров виртуальных машин. Среди них:

  • Univention Virtual Manager;
  • qemu/KVM: запускается прямо из командной строки в машине KVM;
  • Virsh: минимальная оболочка для управления виртуальными машинами;
  • Virtual Machine Manager: иначе - virt-manager, пользовательский интерфейс для управления виртуальными машинами.

Выбор KVM

Доводы "за":

  • несмотря на то что KVM - относительно молодой гипервизор, это компактный модуль, который в сочетании с ядром Linux обеспечивает простоту реализации, сохраняя поддержку Linux-тяжеловесов;
  • KVM гибок; так как гостевые операционные системы взаимодействуют с гипервизором, интегрированным в ядро Linux, они могут во всех случаях обращаться непосредственно к оборудованию без необходимости изменения виртуализированной операционной системы. Это делает KVM более быстрым решением для виртуальных машин;
  • исправления для KVM совместимы с ядром Linux. KVM реализован в самом ядре Linux, что облегчает управление процессами виртуализации.

Доводы "против":

  • мощных инструментов для управления сервером и виртуальными машинами KVM не существует;
  • KVM нуждается в совершенствовании поддержки виртуальных сетей и виртуальных систем хранения данных, усилении защиты, в улучшении надежности и отказоустойчивости, управления питанием, поддержки HPC/систем реального времени, масштабируемости виртуальных процессоров, совместимости между поставщиками, портативности ВМ, а также в создании экосистемы облачных сервисов.

Допустим ты молодой, но всё ещё бедный студент, А значит из всех возможных платформ ты имеешь лишь ПК на Windows и PS4. В один прекрасный день ты решаешься взяться за ум и стать программистом, но мудрые люди в интернете сообщили тебе, что нормальным инженером без Linux не стать. Установить Fedora своей основной и единственной системой ты не можешь, потому что Windows всё ещё нужен для игр и вконтактика, а установить Linux второй системой на жёсткий диск тебе мешает страх или отсутствие опыта.

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

Или, вот скажем, у тебя уже борода и очки, ты технический директор, и тебя не устраивает, что чтобы разработчики получили для развёртывания нового приложения новый сервер нужно ждать аж два месяца. Как в таких условиях быстро двигаться вперёд?

А, может, ты и вовсе архитектор, который спроектировал новую сложную систему для обработки бизнес аналитики. В систему твою входят такие вещи, как ElasticSearch, Kafka, Spark и много чего ещё, и каждый компонент должен жить отдельно, настраиваться по уму и общаться с другими компонентами. Как хороший инженер, ты понимаешь, что недостаточно просто установить весь этот зоопарк прямо себе на систему. Нужно попробовать развернуть максимально близкое к будущему production окружение, и желательно так, чтобы твои наработки потом бесшовно заработали на production серверах.

И что же делать во всех этих непростых ситуациях? Правильно: использовать виртуализацию.

Виртуализация как раз и позволяет устанавливать множество полностью изолированных друг от друга и работающих бок о бок операционных систем на одном и том же железе.

Немного истории. Первые технологии виртуализации появились аж в 60-ых годах, однако настоящая нужда в них появилась только в 90-ых, по мере всё большего роста количества серверов. Именно тогда возникла проблема эффективной утилизации всех железок, а также оптимизации процессов обновления, развёртывания приложений, обеспечения безопасности и восстановления систем в случае какой-нибудь катастрофы.

Оставим за кадром долгую и мучительную историю развития различных технологий и методов виртуализации - для любопытного читателя в конце статьи найдутся дополнительные материалы на эту тему. Важно то, к чему в итоге всё это пришло: к трём основным подходам к виртуализации.

Подходы к виртуализации

Независимо от подхода и технологии, при использовании виртуализации всегда существует host-машина и установленный на ней гипервизор, управляющий guest-машинами.

В зависимости от используемой технологии, гипервизор может быть как отдельным ПО, устанавливаемым прямо на железо, так и частью операционной системы.

Внимательный читатель, любящий модные словечки, через пару параграфов начнёт бурчать, что его любимые Docker-контейнеры тоже считаются виртуализацией. Мы поговорим о технологиях контейнеров в другой раз, но да, ты прав, внимательный читатель, контейнеры тоже в каком-то роде виртуализация, только на уровне ресурсов одной и той же операционной системы.

Существует три способа взаимодействия виртуальных машин с железом:

Динамическая трансляция

В этом случае виртуальные машины не имеют ни малейшего понятия, что они - виртуальные. Гипервизор перехватывает на лету все команды от виртуалки и обрабатывает их, заменяя на безопасные, а затем возвращает назад в виртуалку. Такой подход, очевидно, страдает некоторыми проблемами с производительностью, но зато позволяет виртуализировать любую ОС, так как гостевая ОС не нуждается в модификации. Динамическая трансляция используется в продуктах VMWare - лидере коммерческого ПО для виртуализации.

Паравиртуализация

В случае с паравиртуализацией исходный код гостевой ОС специально изменяется так, чтобы все инструкции выполнялись максимально эффективно и безопасно. При этом виртуалка всегда в курсе, что она - виртуалка. Из плюсов - улучшенная производительность. Из минусов - таким образом нельзя виртуализовать, например, MacOS или Windows, или любой другую ОС, к исходникам которой нет доступа. Паравиртуализация в той или иной форме используется, например, в Xen и KVM.

Аппаратная виртуализация

Разработчики процессоров вовремя осознали, что архитектура x86 плохо подходит для виртуализации, так как изначально была заточена под одну ОС за раз. Поэтому, уже после того как появились динамическая трансляция от VMWare и паравиртуализация от Xen, Intel и AMD начали выпускать процессоры с аппаратной поддержкой виртуализации.

Особого прироста производительности это поначалу не дало,так как главным фокусом первых релизов было улучшение архитектуры процессоров. Однако, теперь, спустя больше 10 лет после появления Intel VT-x и AMD-V, аппаратная виртуализация ничем не уступает и даже в чём-то превосходит другие решения.

Аппаратную виртуализацию использует и требует KVM (Kernel-based Virtual Machine), которую мы и будем использовать в дальнейшем.

Kernel-based Virtual Machine

KVM - это решение для виртуализации, встроенное прямо в ядро Linux, не уступающее остальным решениям в функциональности и превосходящее их в удобстве использования. Более того, KVM - open source технология, которую, тем не менее, на всех парах двигает вперёд (как в плане написания кода, так и в плане маркетинга) и внедряет в свои продукты Red Hat.

Это, кстати, одна из многих причин, почему мы настаиваем на Red Hat дистрибутивах.

Создатели KVM изначально сфокусировались на поддержке аппаратной виртуализации и не стали переизобретать многие вещи. Гипервизор, по сути, это маленькая операционная система, которая должна уметь работать с памятью, с сетью и т.п. Linux уже отлично умеет всё это делать, поэтому использование ядра Linux в качестве гипервизора - логичное и красивое техническое решение. Каждая виртуальная машина KVM -это всего лишь отдельный Linux процесс, безопасность обеспечивается при помощи SELinux/sVirt, ресурсы управляются при помощи CGroups.

Мы ещё поговорим о SELinux и CGroups в другой статье, не пугайся, если не знаешь таких слов.

KVM не просто работает как часть ядра Linux: начиная с версии ядра 2.6.20 KVM является основной составляющей Linux. Иными словами, если у вас стоит Linux, то у вас уже есть KVM. Удобно, правда?

Стоит сказать, что в сфере публичных облачных платформ Xen доминирует чуть больше, чем полностью. Например, AWS EC2 и Rackspace используют именно Xen. Обусловлено это тем, что Xen появился раньше всех и первый достиг достаточного уровня производительности. Но есть и хорошие новости: в ноябре 2017 , который постепенно заменит Xen для крупнейшего облачного провайдера.

Несмотря на то, что KVM использует аппаратную виртуализацию, для некоторых драйверов I/O устройств KVM может использовать паравиртуализацию, что обеспечивает прирост производительности для определённых сценариев использования.

libvirt

Мы уже почти дошли до практической части статьи, осталось только рассмотреть ещё один open source инструмент: libvirt.

libvirt - это набор инструментов, предоставляющий единый API к множеству различных технологий виртуализации. Используя libvirt вам впринципе без разницы, что там за “бакенд”: Xen, KVM, VirtualBox или что-то ещё. Более того, можно использовать libvirt внутри Ruby (а ещё Python, C++ и много чего ещё) программ. Ещё можно удалённо по защищённым каналам подключаться к виртуальным машинам.

Разработкой libvirt, кстати, занимается Red Hat. Ты уже установил себе Fedora Workstation основной системой?

Создадим виртуалку

libvirt - это просто API, а вот как с ним взаимодействовать решать пользователю. Вариантов куча . Мы воспользуемся несколькими стандартными утилитами. Напоминаем: мы настаиваем на использовании Red Hat дистрибутивов (CentOS, Fedora, RHEL) и команды ниже были протестированы именно на одной из этих систем. Для других дистрибутивов Linux возможны небольшие отличия.

Сначала проверим, поддерживается ли аппаратная виртуализация. На самом деле, работать будет и без её поддержки, только гораздо медленнее.

egrep --color = auto "vmx|svm|0xc0f" /proc/cpuinfo # если не выведется ничего, значит поддержки нет:(

Так как KVM то модуль ядра Linux, то нужно проверить, загружен ли он уже, и если нет, то загрузить.

lsmod | grep kvm # kvm, kvm_intel, kvm_amd. Если ничего не выводит, значит, нужно загрузить нужные модули # Если модуль не загружен modprobe kvm modprobe kvm_intel # или modprobe kvm_amd

Возможна ситуация, что аппаратная виртуализация выключена в BIOS. Поэтому если модули kvm_intel/kvm_amd не подгружаются, то проверь настройки BIOS.

Теперь установим необходимые пакеты. Проще всего сделать это, установив сразу группу пакетов:

yum group list "Virtual*"

Список групп зависит от используемой ОС. У меня группа называлась Virtualization . Для управления виртуальными машинами из командой строки используется утилита virsh . Проверь, есть ли у тебя хотя бы одна виртуалка командой virsh list . Скорее всего нет.

Если не нравится командная строка, то ещё есть virt-manager - весьма удобный GUI для виртуалок.

virsh умеет создавать виртуалки только из XML файлов, формат которых можно изучить в документации libvirt . К счастью, ещё есть virt-manager и команда virt-install . С GUI ты и сам разберёшься, а вот пример использования virt-install:

sudo virt-install --name mkdev-vm-0 \ --location ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso \ --memory = 1024 --vcpus = 1 \ --disk size = 8

Вместо указания размера диска, можно создать его заранее через virt-manager, или через virsh и XML файл. Я использовал выше образ с Centos 7 minimal, который легко найти на сайте Centos .

Теперь остаётся один важный вопрос: как подсоединиться к созданной машине? Проще всего это сделать через virt-manager - достаточно дважды кликнуть по созданной машине и откроется окно с SPICE соединением. Там тебя ждёт экран установки ОС.

Кстати, KVM умеет nested virtualization: виртуалки внутри виртуалку. We need to go deeper!

После того, как ты установишь ОС вручную, ты сразу задашься вопросом, как этот процесс можно автоматизировать. Для этого нам понадобится утилита под названием Kickstart , предназначенная для автоматической первичной настройки ОС. Это простой текстовый файлик, в котором можно указать конфигурацию ОС, вплоть до различных скриптов, выполняемых уже после установки.

Но где взять такой файл? Не писать же его с нуля? Разумеется, нет: так как мы уже установили внутри нашей виртуалки Centos 7, то нам нужно просто подсоединиться к ней и найти файл /root/anaconda-ks.cfg - это Kickstart конфиг для того, чтобы создать копию уже созданной ОС. Нужно просто скопировать его и отредактировать содержимое.

Но просто скопировать файл скучно, поэтому мы добавим в него ещё кое-что. Дело в том, что по умолчанию у нас не получится подсоединиться к консоли созданной виртуалки из командой строки host-машины. Чтобы сделать это, нужно отредактировать конфиг загрузчика GRUB. Поэтому в самый конец Kickstart файла добавим следующую секцию:

%post --log = /root/grubby.log /sbin/grubby --update-kernel = ALL --args = "console=ttyS0" %end

%post , как не сложно догадаться, выполнится после установки ОС. Команда grubby обновит конфиг GRUB, добавив возможность подключаться к консоли.

Кстати, ещё можно указать возможность подключения через консоль прямо во время создания виртуалки. Для этого в команду virt-install нужно передать ещё один аргумент: --extra-args="console=ttyS0" . После этого можно устанавливать саму ОС в интерактивном текстовом режиме из терминала твоей host машины, подключившись к виртуалке через virsh console сразу после её создания. Это особенно удобно, когда создаёшь виртуалки на железном удалённом сервере.

Теперь можно применить созданный конфиг! virt-install позволяет при создании виртуалки передавать дополнительные аргументы, в том числе путь к Kickstart файлу.

sudo virt-install --name mkdev-vm-1 \ --location ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso \ --initrd-inject /path/to/ks.cfg \ --extra-args ks = file:/ks.cfg \ --memory = 1024 --vcpus = 1 --disk size = 8

После того, как вторая виртуалка будет создана (полностью автоматически), ты сможешь подключиться к ней из командой строки командой virsh console vm_id . vm_id можно узнать из списка всех виртуалок командой virsh list .

Одно из преимуществ использования KVM/libvirt - потрясающая документация, в том числе создаваемая компанией Red Hat . Дорогому читателю предлагается с должной любознательностью изучить её.

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

Что дальше?

Невозможно уместить в одну статью всё, что стоит знать о виртуализации. Мы рассмотрели несколько вариантов использования виртуализации и её преимущества, немного углубились в детали её работы и познакомились с лучшим, на наш взгляд, решением для этих задач (KVM), и даже создали и настроили виртуалку.

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

Каким бы мощным и богатым на сервисы не был AWS, его основа - это виртуальные машины поверх Xen. Каждый раз, когда ты создаёшь новый дроплет на DigitalOcean , ты создаёшь виртуалку. Практически все сайты, которыми ты пользуешься, размещены на виртуальных машинах. Простота и гибкость виртуалок позволяет не только строить production-системы, но и в десятки раз облегчает локальную разработку и тестирование, особенно когда в системе задействовано множество компонентов.

Мы научились создавать одну единственную машинку - неплохо для тестирования одного приложения. Но что, если нам нужно сразу несколько виртуальных машин? Как они будут общаться друг с другом? Как они будут находить друг друга? Для этого нам нужно будет разобраться, как вообще работают сети, как они работают в контексте виртуализации, и какие компоненты задействованы в этой работе и нуждаются в настройке - в следующей статье серии.

В этой вступительной статье я расскажу вкратце обо всех программных средствах, использованных в процессе разработки услуги. Более подробно о них будет рассказано в следующих статьях.

Почему ? Эта операционная система мне близка и понятна, так что при выборе дистрибутива мучений, терзаний и метаний испытано не было. Особых преимуществ перед Red Hat Enterprise Linux у него нет, но было принято решение работать со знакомой системой.

Если вы планируете самостоятельно развернуть инфраструктуру, используя аналогичные технологии, я бы посоветовал взять именно RHEL: благодаря хорошей документации и хорошо написаным прикладным программам это будет если не на порядок, то уж точно раза в два проще, а благодаря развитой системе сертификации без особого труда можно будет найти некоторое количество специалистов, на должном уровне знакомых в данной ОС.

Мы же, повторюсь, решили использовать Debian Squeeze с набором пакетов из Sid/Experimental и некоторыми пакетами, бэкпортированными и собранными с нашими патчами.
В планах имеется публикация репозитория с пакетами.

При выборе технологии виртуализации рассматривались два варианта - Xen и KVM.

Также во внимание принимался факт наличия огромного количества разработчиков, хостеров, комерческих решений именно на базе Xen - тем интереснее было провести в жизнь решение именно на базе KVM.

Основной же причиной, по которой мы решили использовать именно KVM, является необходимость запуска виртуальных машин с FreeBSD и, в перспективе, MS Windows.

Для управления виртуальными машинами оказалось чрезвычайно удобно использовать и продукты, использующие ее API: virsh , virt-manager , virt-install , пр.

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

Разумеется, решение не идеально. Из минусов следует назвать:

  • Абсолютно невменяемые сообщения об ошибках.
  • Невозможность изменять часть конфигурации виртуальной машины на лету, хотя QMP (QEMU Monitor Protocol) это вполне позволяет.
  • Иногда к libvirtd по непонятной причине невозможно подключиться - он перестаёт реагировать на внешние события.

Основной проблемой в реализации услуги в самом начале представлялось лимитирование ресурсов для виртуальных машин. В Xen эта проблема была решена при помощи внутреннего шедулера, распределяющего ресурсы между виртуальными машинами - и что самое прекрасное, была реализована возможность лимитировать и дисковые операции в том числе.

В KVM ничего такого не было до появления механизма распределения ресурсов ядра . Как обычно в Linux, доступ к этим функциям был реализован посредством специальной файловой системы cgroup , в которой при помощи обычных системных вызовов write() можно было добавить процесс в группу, назначить ему его вес в попугаях, указать ядро, на котором он будет работать, указать пропускную способность диска, которую этот процесс может использовать, или, опять же, назначить ему вес.

Профит в том, что всё это реализуется внутри ядра, и использовать это можно не только для сервера, но и для десктопа (что и использовали в известном «The ~200 Line Linux Kernel Patch That Does Wonders »). И на мой взгляд, это одно из самых значительных изменений в ветке 2.6, не считая любимого #12309 , а не запиливание очередной файловой системы. Ну, разве что, кроме POHMELFS (но чисто из-за названия).

Отношение к этой библиотеке-утилите у меня весьма неоднозначное.

С одной стороны это выглядит примерно так:

И ещё эту штуку чертовски сложно собрать из исходников и тем более в пакет: иногда мне кажется, что Linux From Scratch собрать с нуля несколько проще.

С другой стороны - очень мощная штука, которая позволяет создавать образы для виртуальных машин, модифицировать их, ужимать, ставить grub, модифицировать таблицу разделов, управлять конфигурационными файлами, переносить «железные» машины в виртуальную среду, переносить виртуальные машины с одного образа на другой, переносить виртуальные машины из образа на железо и, честно говоря, тут меня фантазия немного подводит. Ах, да: ещё можно запустить демон внутри виртуальной машины Linux и получить доступ к данным виртуальной машины вживую, и всё это делать на shell, python, perl, java, ocaml. Это краткий и далеко не полный список того, что можно сделать с .

Интересно, что большая часть кода в генерируется в момент сборки, равно как и документация к проекту. Очень широко используется ocaml, perl. Сам код пишется на C, который потом оборачивается в OCaml, и повторяющиеся куски кода генерируются сами. Работа с образами осуществляется путём запуска специального сервисного образа (supermin appliance), в который через канал внутрь него отправляются команды. Внутри этого образа содержится некоторый rescue набор утилит, таких как parted, mkfs и прочих полезных в хозяйстве системного администратора.

Я с недавнего времени его даже дома стал использовать, когда выковыривал из образа nandroid нужные мне данные. Но для этого требуется ядро с поддержкой yaffs.

Прочее

Ниже приведено ещё несколько интересных ссылок на описание использованных пограммных средств - почитать и поизучать самостоятельно, если интересно. Например,

KVM (Kernel-based Virtual Machine ) - программное решение, обеспечивающее виртуализацию в среде Linux на платформе x86, которая поддерживает аппаратную виртуализацию на базе Intel VT (Virtualization Technology) либо AMD SVM (Secure Virtual Machine).

Программное обеспечение KVM состоит из загружаемого модуля ядра (называемого kvm.ko), предоставляющего базовый сервис виртуализации, процессорно-специфического загружаемого модуля kvm-amd.ko либо kvm-intel.ko , и компонентов пользовательского режима (модифицированного QEMU). Все компоненты программного обеспечения KVM открыты. Компонент ядра, необходимый для работы KVM, включён в основную ветку ядра Linux начиная с версии 2.6.20 (февраль 2007 года) . KVM был также портирован на FreeBSD как модуль ядра . Ведётся работа по включению модификаций, необходимых для работы с KVM, в основную ветку QEMU.

C KVM работает большое количество гостевых ОС, включаю множество видов и версий Linux, BSD, Solaris, Windows, Haiku, ReactOS, Plan 9, AROS Research Operating System а также OS X. В дополнение, Android 2.2, Minix 3.1.2a, Solaris 10 U3 and Darwin 8.0.1GNU/Hurd (Debian K16), Minix 3.1.2a, Solaris 10 U3 and Darwin 8.0.1, вместе с некоторыми версиями выше укзаных ОС, работают с некоторыми ограничениями.

Паравиртуализациия некоторых устройств доступна на Linux, OpenBSD, FreeBSD, NetBSD, Plan 9 и Windows гостевых ОС использующих VirtIO API. Это поддерживает паравиртуальные Ethernet карты, I/O контроллер диска, устройства для модификации потребляемой гостем памяти, а также графический интерфейс VGA используя драйверы SPICE или VMware.

Окружение

Сам по себе KVM не выполняет эмуляции. Вместо этого программа, работающая в пространстве пользователя, использует интерфейс /dev/kvm для настройки адресного пространства гостя виртуальной машины, через него же эмулирует устройства ввода-вывода и видеоадаптер.

KVM позволяет виртуальным машинам использовать немодифицированные образы дисков QEMU, VMware и других, содержащие операционные системы. Каждая виртуальная машина имеет своё собственное виртуальное аппаратное обеспечение: сетевые карты, диск, видеокарту и другие устройства.

История

Программное обеспечение KVM было создано, разрабатывается и поддерживается фирмой Qumranet, которая была куплена Red Hat за $107 млн 4 сентября 2008 года. После сделки KVM (наряду с системой управления виртуализацией oVirt) вошла в состав платформы виртуализации RHEV. KVM поддерживается Paolo Bonzini.

Принцип работы

В настоящее время KVM взаимодействует с ядром через загружаемый модуль ядра. Поддерживаются разнообразные гостевые операционные системы, такие как Linux, BSD, Solaris, Windows, Haiku, ReactOS и AROS Research Operating System. Модифицированная версия KVM (qemu) может работать на Mac OS X. Примечание: KVM не выполняет никакой самоэмуляции; вместо этого, программа, работающая в пользовательском пространстве, применяет интерфейс /dev/kvm для настройки адресного пространства гостевого виртуального сервера, берет его смоделированные ресурсы ввода/вывода и отображает его образ на образ хоста.

В архитектуре KVM, виртуальная машина выполняется как обычный Linux-процесс, запланированный стандартным планировщиком Linux. На самом деле каждый виртуальный процессор представляется как обычный Linux-процесс. Это позволяет KVM пользоваться всеми возможностями ядра Linux. Эмуляцией устройств управляет модифицированная версия qemu, которая обеспечивает эмуляцию BIOS, шины PCI, шины USB, а также стандартный набор устройств, таких как дисковые контроллеры IDE и SCSI, сетевые карты и т.д.

Функциональные возможности

Безопасность

Поскольку виртуальная машина реализована как Linux-процесс, она использует стандартную модель безопасности Linux для изоляции и управления ресурсами. С помощью SELinux (Security-Enhanced Linux) ядро Linux добавляет обязательные средства контроля доступа, многоуровневые и разнообразные средства защиты, а также управляет политикой безопасности. SELinux обеспечивает строгую изоляцию ресурсов и ограничивает подвижность процессов, запущенных в ядре Linux.

Проект SVirt – попытка усилиями сообщества интегрировать функции безопасности Mandatory Access Control (MAC) и виртуализацию на базе Linux (KVM) - основывается на SELinux, чтобы обеспечить инфраструктуру, которая позволит администратору определять политику изоляции виртуальных машин. SVirt призван гарантировать, что ресурсы виртуальных машин не будут доступны ни для каких других процессов (или виртуальных машин); администратор может дополнить эту политику, определив детальные разрешения; например, чтобы группа виртуальных машин совместно использовала одни и те же ресурсы.

Управление памятью

KVM наследует мощные функции управления памятью от Linux. Память виртуальной машины хранится так же, как память любого другого Linux-процесса, и может заменяться, копироваться большими страницами для повышения производительности, обобщаться или сохраняться в файле на диске. Поддержка технологии NUMA (Non-Uniform Memory Access, архитектура памяти для многопроцессорных систем) позволяет виртуальным машинам эффективно обращаться к памяти большого объема.

KVM поддерживает новейшие функции виртуализации памяти от производителей процессоров, в частности, Intel Extended Page Table (EPT) и AMD Rapid Virtualization Indexing (RVI), для минимизации загрузки процессора и достижения высокой пропускной способности.

Обобщение страниц памяти поддерживается с помощью функции ядра Kernel Same-page Merging (KSM). KSM сканирует память каждой виртуальной машины, и если какие-то страницы памяти виртуальных машин идентичны, объединяет их в одну страницу, которая становится общей для этих виртуальных машин и хранится в единственной копии. Если гостевая система пытается изменить эту общую страницу, ей предоставляется собственная копия.

Хранение данных

KVM может использовать любой носитель, поддерживаемый Linux, для хранения образов виртуальных машин, в том числе локальные диски с интерфейсами IDE, SCSI и SATA, Network Attached Storage (NAS), включая NFS и SAMBA/CIFS, или SAN с поддержкой iSCSI и Fibre Channel. Для улучшения пропускной способности системы хранения данных и резервирования может использоваться многопоточный ввод/вывод.

Опять же, поскольку KVM входит в состав ядра Linux, может использоваться проверенная и надежная инфраструктура хранения данных с поддержкой всех ведущих производителей; его набор функций хранения проверен на многих производственных установках.

KVM поддерживает образы виртуальных машин в распределенных файловых системах, таких как Global File System (GFS2), так что они могут разделяться несколькими хостами или обобщаться с использованием логических томов. Поддержка тонкой настройки (thin provisioning) образов дисков позволяет оптимизировать использование ресурсов хранения данных, выделяя их не сразу все наперед, а только тогда, когда этого требует виртуальная машина. Собственный формат дисков для KVM ― QCOW2 ― обеспечивает поддержку снимков текущего состояния и обеспечивает несколько уровней таких снимков, а также сжатие и шифрование.

Динамическая миграция

KVM поддерживает динамическую миграцию, обеспечивая возможность перемещения работающих виртуальных машин между физическими узлами без прерывания обслуживания. Динамическая миграция прозрачна для пользователей: виртуальная машина остается включенной, сетевые соединения ― активными, и пользовательские приложения продолжают работать, в то время как виртуальная машина перемещается на новый физический сервер.

Кроме динамической миграции, KVM поддерживает сохранение копии текущего состояния виртуальной машины на диск, позволяя хранить ее и восстанавливать позднее.

Драйверы устройств

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

Гипервизор KVM использует стандарт VirtIO, разработанный IBM и Red Hat совместно с Linux-сообществом для паравиртуализированных драйверов; это независимый от гипервизора интерфейс для создания драйверов устройств, позволяющий нескольким гипервизорам использовать один и тот же набор драйверов устройств, что улучшает взаимодействие между гостевыми системами.

Драйверы VirtIO входят в современные версии Linux-ядра (наиболее поздняя ― 2.6.25), включены в Red Hat Enterprise Linux 4.8+ и 5.3+, а также доступны для Red Hat Enterprise Linux 3. Red Hat разработала драйверы VirtIO для гостевых ОС Microsoft Windows, оптимизирующие сетевые и дисковые операции ввода/вывода; эти драйверы сертифицированы по программе сертификации Microsoft Windows Hardware Quality Labs (WHQL).

Производительность и масштабируемость

KVM унаследовал производительность и масштабируемость Linux, поддерживая виртуальные машины с 16 виртуальными процессорами и 256 ГБ оперативной памяти, а также хост-системы с 256 ядрами и более 1 ТБ ОЗУ. Он может обеспечить:

  • производительность в 95-135% по сравнению с "голым железом" в реальных корпоративных приложениях, таких как SAP, Oracle, LAMP и Microsoft Exchange;
  • свыше миллиона сообщений в секунду и менее чем 200-мкс задержку в виртуальных машинах, работающих на стандартном сервере;
  • максимальные уровни консолидации более чем с 600 виртуальными машинами, выполняющими корпоративные приложения, на одном сервере.

Это означает, что KVM допускает виртуализацию самых требовательных рабочих нагрузок.

Настройка

Настройка Virtual Machine Manager (VMM)

При первом запуске программы вы увидите две категории, обе не подключенные. Это ссылки на стандартные модули KVM, пока не работающие. Для их использования щелкните правой кнопкой мыши и выберите "connect".

Чтобы добавить новое соединение, выберите в меню File > Add Connection. При этом откроется окно, в котором можно будет задать тип гипервизора и тип соединения. VMM может использовать как локальные, так и удаленные соединения, включая QUEMU/KVM и Xen. Кроме того, поддерживаются все методы аутентификации.

Можно также поставить галочку autoconnect. При следующем запуске программы эти соединения будут готовы к использованию.

Кратко рассмотрим остальные функции программы.
Сетевую функциональность можно просмотреть или изменить, открыв пункт Host Details. Там же мы установим утилиты для работы сетевого моста.

Аналогично можно изменить параметры дисковой подсистемы:

Создание виртуальной машины

Создать виртуальную машину можно и из командной строки, но мы воспользуемся VMM. Первый шаг должен быть интуитивно понятен. Введите название и задайте расположение инсталляционного диска. Это может быть как локальное устройство в виде диска CD/DVD или образа ISO, так и HTTP или FTP сервер, NFS или PXE.

Мы используем локальный носитель. Теперь необходимо задать, будет ли это физическое устройство или образ. В нашем случае используется ISO. Далее нужно выбрать тип и версию ISO. Здесь не требуется такая уж высокая точность, но правильный выбор позволит повысить производительность виртуальной машины.

Задаем количество процессоров и размер оперативной памяти:

Четвертый этап - виртуальный диск. Вы можете создать новый образ или использовать существующий. Необходимо выбрать размер диска и задать, будет ли создан образ диска сразу заданного размера, либо его размер будет увеличиваться динамически по мере необходимости. Необходимо отметить, что выделение сразу всего пространства под образ диска повышает производительность и уменьшает фрагментирование файловой системы.

Далее мы еще уделим внимание дисковой подсистеме. Однако обратите внимание, что при работе в режиме Usermode у вас не будет прав записи в /var, где по умолчанию хранятся образы виртуальных дисков. Поэтому необходимо будет задать другое расположение для образов.

Этап 5 - это вывод сводных данных с возможностью настройки некоторых продвинутых опций. Здесь вы можете изменить тип сети, задать фиксированные MAC-адреса, выбрать тип виртуализации и целевую архитектуру. Если вы работаете в режиме Usermode, возможности настройки сети будут ограничены, например невозможно будет создать мосты между сетевыми интерфейсами. И последнее: если ваш процессор не поддерживает аппаратной виртуализации, поле Virt Type будет иметь значение QUEMU и сменить его на KVM будет невозможно. Вы можете посмотреть, как выглядят типовые настройки для виртуальной машины Ubuntu:

  • KVM модуль ядра: GPL v2.
  • KVM модуль пользовательского окружения: LGPL v2.
  • QEMU библиотека виртуального процессора (libqemu.a) и эмулятор системы QEMU PC: LGPL.
  • Эмулятор пользовательского режима Linux QEMU: GPL.
  • Файлы BIOS (bios.bin , vgabios.bin и vgabios-cirrus.bin): SeaBIOS (LGPL v2 или более поздняя).

Графические инструменты

libvirt supports KVM

  • Kimchi веб инструмент менеджмента для KVM
  • Virtual Machine Manager поддерживает создание, редакцию, старт и остановку KVM-машин, также как холодную миграцию ВМ между хостами
  • Proxmox Virtual Environment свободный пакет менеджмента виртуализации, включая KVM и OpenVZ. Имеет установщик на голую машину, удаленный веб-интерфейс для менеджмента, и опционально коммерческую поддержку.
  • OpenQRM платформа менеджмента для управления гетерогенными дата центрами.
  • GNOME Boxes интерфейс Gnome для управления libvirt гостями на Linux.
  • oVirt свободный иснструмент менеджмента виртуализации для KVM на основе libvirt

Реализации

  • Debian 5.0 и выше
  • Gentoo Linux
  • illumos-based дистрибутивы
  • OpenIndiana
  • Red Hat Enterprise Linux (RHEL) 5.4 и выше
  • SmartOS
  • SUSE Linux Enterprise Server (SLES) 11 SP1 и выше
  • Ubuntu 10.04 LTS и выше
  • Univention Corporate Server