Что такое виртуализация kvm
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
KVM (Kernel-based Virtual Machine)
Разработчики: | Open Virtualization Alliance (OVA), изначально (Qumranet, затем Red Hat) |
---|---|
Постоянный выпуск: | 88 / 12 июля 2009 |
Написана на: | Си |
Операционная система: | Linux |
Тип ПО: | виртуализация |
Лицензия: | GNU General Public License и GNU Lesser General Public License |
Веб-сайт | http://www.linux-kvm.org/ |
KVM (Kernel-based Virtual Machine) — программное решение, обеспечивающее виртуализацию в среде Linux на платформе x86, которая поддерживает аппаратную виртуализацию на базе Intel VT (Virtualization Technology) либо AMD SVM (Secure Virtual Machine).
C KVM работает большое количество гостевых ОС, включаю множество видов и версий Linux, BSD, Solaris, Windows, Haiku, ReactOS, Plan 9, AROS Research Operating System [3] а также OS X. [4] В дополнение, Android 2.2, Minix 3.1.2a, Solaris 10 U3 and Darwin 8.0.1GNU/Hurd [5] (Debian K16), Minix 3.1.2a, Solaris 10 U3 and Darwin 8.0.1, вместе с некоторыми версиями выше укзаных ОС, работают с некоторыми ограничениями. [6]
Паравиртуализациия некоторых устройств доступна на Linux, OpenBSD, [7] FreeBSD, [8] NetBSD, [9] Plan 9 [10] и Windows гостевых ОС использующих VirtIO [11] API. Это поддерживает паравиртуальные Ethernet карты, I/O контроллер диска, [12] устройства для модификации потребляемой гостем памяти, а также графический интерфейс VGA используя драйверы SPICE или VMware.
Содержание
Окружение
Сам по себе KVM не выполняет эмуляции. Вместо этого программа, работающая в пространстве пользователя, использует интерфейс /dev/kvm для настройки адресного пространства гостя виртуальной машины, через него же эмулирует устройства ввода-вывода и видеоадаптер.
KVM позволяет виртуальным машинам использовать немодифицированные образы дисков QEMU, VMware и других, содержащие операционные системы. Каждая виртуальная машина имеет своё собственное виртуальное аппаратное обеспечение: сетевые карты, диск, видеокарту и другие устройства.
История
Принцип работы
В настоящее время 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.
Управление памятью
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 ТБ ОЗУ. Он может обеспечить:
Это означает, что KVM допускает виртуализацию самых требовательных рабочих нагрузок.
Настройка
Настройка Virtual Machine Manager (VMM) [15]
При первом запуске программы вы увидите две категории, обе не подключенные. Это ссылки на стандартные модули KVM, пока не работающие. Для их использования щелкните правой кнопкой мыши и выберите «connect».
Чтобы добавить новое соединение, выберите в меню File > Add Connection. При этом откроется окно, в котором можно будет задать тип гипервизора и тип соединения. VMM может использовать как локальные, так и удаленные соединения, включая QUEMU/KVM и Xen. Кроме того, поддерживаются все методы аутентификации.
Можно также поставить галочку autoconnect. При следующем запуске программы эти соединения будут готовы к использованию.
Кратко рассмотрим остальные функции программы.
Сетевую функциональность можно просмотреть или изменить, открыв пункт Host Details. Там же мы установим утилиты для работы сетевого моста.
Аналогично можно изменить параметры дисковой подсистемы:
Создание виртуальной машины
Создать виртуальную машину можно и из командной строки, но мы воспользуемся VMM. Первый шаг должен быть интуитивно понятен. Введите название и задайте расположение инсталляционного диска. Это может быть как локальное устройство в виде диска CD/DVD или образа ISO, так и HTTP или FTP сервер, NFS или PXE.
Мы используем локальный носитель. Теперь необходимо задать, будет ли это физическое устройство или образ. В нашем случае используется ISO. Далее нужно выбрать тип и версию ISO. Здесь не требуется такая уж высокая точность, но правильный выбор позволит повысить производительность виртуальной машины.
Задаем количество процессоров и размер оперативной памяти:
Далее мы еще уделим внимание дисковой подсистеме. Однако обратите внимание, что при работе в режиме Usermode у вас не будет прав записи в /var, где по умолчанию хранятся образы виртуальных дисков. Поэтому необходимо будет задать другое расположение для образов.
Наша машина готова к использованию.
Ниже представлена пара скриншотов, показывающая опции клонирования и перемещения виртуальной машины.
Обратите внимание на небольшую загрузку системы. С этим режимом эмуляции можно запускать одновременно несколько виртуальных машин.
При необходимости можно удалить виртуальную машину вместе со всеми ее файлами:
Общие принципы работы QEMU-KVM
Мое текущее понимание:
1) KVM
KVM (Kernel-based Virtual Machine) – гипервизор (VMM – Virtual Machine Manager), работающий в виде модуля на ОС Linux. Гипервизор нужен для того, чтобы запускать некий софт в несуществующей (виртуальной) среде и при этом, скрывать от этого софта реальное физическое железо, на котором этот софт работает. Гипервизор работает в роли «прокладки» между физическим железом (хостом) и виртуальной ОС (гостем).
Поскольку KVM является стандартным модулем ядра Linux, он получает от ядра все положенные ништяки (работа с памятью, планировщик и пр.). А соответственно, в конечном итоге, все эти преимущества достаются и гостям (т.к. гости работают на гипервизоре, которые работает на/в ядре ОС Linux).
KVM очень быстрый, но его самого по себе недостаточно для запуска виртуальной ОС, т.к. для этого нужна эмуляция I/O. Для I/O (процессор, диски, сеть, видео, PCI, USB, серийные порты и т.д.) KVM использует QEMU.
2) QEMU
QEMU (Quick Emulator) – эмулятор различных устройств, который позволяет запускать операционные системы, предназначенные под одну архитектуру, на другой (например, ARM –> x86). Кроме процессора, QEMU эмулирует различные периферийные устройства: сетевые карты, HDD, видео карты, PCI, USB и пр.
Инструкции/бинарный код (например, ARM) конвертируются в промежуточный платформонезависимый код при помощи конвертера TCG (Tiny Code Generator) и затем этот платформонезависимый бинарный код конвертируется уже в целевые инструкции/код (например, x86).
ARM –> промежуточный_код –> x86
По сути, вы можете запускать виртуальные машины на QEMU на любом хосте, даже со старыми моделями процессоров, не поддерживающими Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Однако в таком случае, это будет работать весьма медленно, в связи с тем, что исполняемый бинарный код нужно перекомпилировать на лету два раза, при помощи TCG (TCG – это Just-in-Time compiler).
Т.е. сам по себе QEMU мега крутой, но работает очень медленно.
3) Protection rings
Бинарный программный код на процессорах работает не просто так, а располагается на разных уровнях (кольцах / Protection rings) с разными уровнями доступа к данным, от самого привилегированного (Ring 0), до самого ограниченного, зарегулированного и «с закрученными гайками» (Ring 3).
Операционная система (ядро ОС) работает на Ring 0 (kernel mode) и может делать с любыми данными и устройствами все, что угодно. Пользовательские приложения работают на уровне Ring 3 (user mode) и не в праве делать все, что захотят, а вместо этого каждый раз должны запрашивать доступ на проведение той или иной операции (таким образом, пользовательские приложения имеют доступ только к собственным данным и не могут «влезть» в «чужую песочницу»). Ring 1 и 2 предназначены для использования драйверами.
До изобретения Intel VT-x / AMD SVM, гипервизоры работали на Ring 0, а гости работали на Ring 1. Поскольку у Ring 1 недостаточно прав для нормального функционирования ОС, то при каждом привилегированном вызове от гостевой системы, гипервизору приходилось на лету модифицировать этот вызов и выполнять его на Ring 0 (примерно так, как это делает QEMU). Т.е. гостевой бинарный код НЕ выполнялся напрямую на процессоре, а каждый раз на лету проходил несколько промежуточных модификаций.
Накладные расходы были существенными и это было большой проблемой и тогда производители процессоров, независимо друг от друга, выпустили расширенный набор инструкций (Intel VT-x / AMD SVM), позволяющих выполнять код гостевых ОС НАПРЯМУЮ на процессоре хоста (минуя всякие затратные промежуточные этапы, как это было раньше).
4) QEMU-KVM
KVM предоставляет доступ гостям к Ring 0 и использует QEMU для эмуляции I/O (процессор, диски, сеть, видео, PCI, USB, серийные порты и т.д., которые «видят» и с которыми работают гости).
Отсюда QEMU-KVM (или KVM-QEMU) 🙂
P.S. Текст этой статьи изначально был опубликован в Telegram канале @RU_Voip в качестве ответа на вопрос одного из участников канала.
Напишите в комментариях, в каких местах я не правильно понимаю тему или если есть, что дополнить.
Что такое KVM на VDS
Аренда VDS становится все более популярной услугой как для небольших сайтов, так и для высоконагруженных информационных систем. VDS по всем параметрам превосходит недорогой виртуальный хостинг, но в то же время обходится дешевле, чем выделенный сервер.
При выборе провайдера и тарифного плана пользователю приходится учитывать огромное количество различных характеристик ВДС. К ним относится и программное обеспечение, используемое хостером для эмуляции отдельного сервера, – гипервизор. Сегодня мы рассмотрим одну из самых популярных систем виртуализации – KVM (Kernel Based Virtual Machine), но для начала разберемся в том, какие гипервизоры вообще существуют.
OpenVZ Web Panel
Система виртуализации работает на уровне ОС Linux, использует общее с операционной системой ядро и позволяет создавать так называемые контейнеры с виртуальным окружением. Плюсы данного гипервизора в его относительной гибкости:
дает возможность переустановки ОС и изменения параметров в режиме онлайн, без перезагрузки сервера;
легкость администрирования и управления;
скорость работы на уровне физического сервера (в некоторых случаях может быть даже выше);
все модули общие и загружены в основной ОС, что позволяет VDS практически не использовать ресурсы на его работу;
является самым дешевым вариантом виртуализации.
Будучи разработкой на базе Линукс, OpenVZ не поддерживает ОС Windows и требует хороших знаний в части программирования и администрирования. Также эта платформа допускает возможность оверселлинга со стороны провайдера.
1000 рублей в подарок на производительные VDS от Timeweb
Закажи VDS, пополни баланс на 1000 рублей, и мы добавим еще столько же. Активируй промокод community1000 в панели управления.
LXC-контейнеры под управлением Proxmox VE
Более оптимизированная, чем OpenVZ, система виртуализации. Также работает на уровне ОС Linux, не взаимодействует с Windows. Не использует контейнеры, позволяет менять время и дату. По стоимости немного дороже вышеописанной платформы.
Система виртуализации Microsoft Hyper-V
Как следует из названия, используется для администрирования серверов на базе Windows. IT-специалисты ценят в данной платформе такие качества, как достаточно высокую надежность, масштабируемость и поддержку кластеризации для создания облачных сервисов. Гипервизор можно скачать бесплатно с сайта Microsoft. Все остальные затраты будут связаны с настройками и приобретением дополнительного ПО для администрирования.
К негативным качествам пользователи Hyper-V относят ограничения настройки работы с СХД. Затруднена миграция ВМ внутри кластера, которая допустима только между серверами с процессорами одного семейства. Как и все продукты семейства Microsoft, требует дополнительной установки ПО для обеспечения защиты ввиду высокой уязвимости от внешних угроз.
Веб-клиент VMware vSphere
Одна из наиболее дорогостоящих систем создания виртуальных сред. Работает независимо от операционной системы. Способна создавать виртуальные устройства, добавлять к ним память, процессор и диски без перезагрузки VM. Поддерживает все известные операционные системы и управление несколькими сетевыми устройствами одновременно.
Обладая рядом существенных преимуществ, VMware vSphere не лишена и некоторых недостатков:
для получения развернутого функционала требуется покупка лицензионной версии (VMware vCloud Suite Enterprise);
возможность конфликтов на аппаратном уровне – перед установкой требуется проверка на совместимость железа с версией ESXi;
каждый CPU потребует приобретения отдельной лицензии vSphere;
необходимость покупки годового пакета обслуживания для каждой лицензии.
Виртуализация на базе KVM
А теперь о главном. Достаточно молодая разработка под управлением ОС Linux, завоевывающая все большую популярность благодаря широким функциональным возможностям с очень приемлемой стоимостью внедрения и администрирования. Данное решение распространяется бесплатно, а для корпоративных клиентов существует коммерческий вариант, дистрибутив RHEL (Red Hat Enterprise Linux), обеспечивающий официальную техподдержку (на 10 лет) и расширенные возможности управления.
Все лидирующие российские хостинг-провайдеры используют систему виртуализации KVM, Timeweb не является исключением:
Плюсы и минусы KVM
Гипервизор Kernel-based Virtual Machine представляет собой аппаратную виртуализацию, благодаря которой невозможно понять, виртуальный это сервер или физический. Для пользователей каждый сервер фактически является полноценной виртуальной машиной. К дополнительным преимуществам, в отличие от другой опенсорсной платформы виртуализации OpenVZ, можно отнести:
возможность установки своего ядра Linux;
быстрый доступ ко всем модулям системы iptables\tun\tap;
возможность инсталляции любой операционной системы;
обеспечение прав root-доступа к управлению сервером;
организацию GRE туннелей, IPIP и других;
использование виртуальной сети eth со своими параметрами.
При всех очевидных достоинствах гипервизор KVM обладает и рядом недостатков:
смена ресурсов невозможна без перезагрузки системы, расширение дискового пространства производится вручную;
администрировать KVM сложнее, большинство настроек необходимо производить вручную;
добавление IP-адресов происходит тоже вручную.
Если сравнивать KVM с системой виртуализации VMware, то последнюю чаще выбирают для внедрения облачных решений по модели IaaS. В то же время платформа Kernel удобна для разработчиков, специализирующихся на создании и внедрении «линуксового» ПО.
Обладая высокими функциональными возможностями, низким ресурсопотреблением и доступностью, гипервизор KVM постоянно модернизируется за счет поддержки мирового сообщества разработчиков OpenSource. Это позволяет быстро устранять баги и «слабые места», постоянно совершенствовать программу с учетом практического использования в сложных ситуациях.
Заключение
Правильный выбор системы виртуализации в первую очередь важен для хостинг-провайдеров. Неверное решение может носить как тактические, так и стратегические последствия. Самые очевидные из них – это временные и денежные потери, связанные с внедрением, настройками и управлением серверами ЦОД.
Удобство использования конкретного гипервизора конечными пользователями является еще более важным критерием, определяющим конкурентоспособность, окупаемость и жизнеспособность компании.
Тем и другим следует учитывать не только текущее состояние бизнеса, но и перспективы его развития. Вариант внедрения системы виртуализации на базе технологии KVM выглядит оптимальным по всем параметрам, обладает необходимой гибкостью и потенциалом, в т.ч. в перспективном направлении развития облачных технологий.
Основы виртуализации и введение в KVM
Допустим ты молодой, но всё ещё бедный студент, А значит из всех возможных платформ ты имеешь лишь ПК на 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 AWS анонсировали новый основанный на KVM гипервизор, который постепенно заменит 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 возможны небольшие отличия.
Сначала проверим, поддерживается ли аппаратная виртуализация. На самом деле, работать будет и без её поддержки, только гораздо медленнее.
Так как KVM то модуль ядра Linux, то нужно проверить, загружен ли он уже, и если нет, то загрузить.
Возможна ситуация, что аппаратная виртуализация выключена в BIOS. Поэтому если модули kvm_intel/kvm_amd не подгружаются, то проверь настройки BIOS.
Теперь установим необходимые пакеты. Проще всего сделать это, установив сразу группу пакетов:
Если не нравится командная строка, то ещё есть virt-manager — весьма удобный GUI для виртуалок.
Вместо указания размера диска, можно создать его заранее через 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 файла добавим следующую секцию:
Теперь можно применить созданный конфиг! virt-install позволяет при создании виртуалки передавать дополнительные аргументы, в том числе путь к Kickstart файлу.
Одно из преимуществ использования KVM/libvirt — потрясающая документация, в том числе создаваемая компанией Red Hat. Дорогому читателю предлагается с должной любознательностью изучить её.
Конечно, создавать виртуальные машины вот так вот руками в консоли, а потом настраивать их только при помощи Kickstart — не самый удобный процесс. В будущих статьях мы ознакомимся с множеством классных инструментов, облегчающих и полностью автоматизирующих конфигурацию систем.
Что дальше?
Невозможно уместить в одну статью всё, что стоит знать о виртуализации. Мы рассмотрели несколько вариантов использования виртуализации и её преимущества, немного углубились в детали её работы и познакомились с лучшим, на наш взгляд, решением для этих задач (KVM), и даже создали и настроили виртуалку.
Важно понять, что виртуальные машины — кирпичи в огромных зданиях современных облачных архитектур. Именно они позволяют приложениям автоматически разрастаться до безграничных размеров, максимально быстрым способом и с максимальной утилизацией всех ресурсов.
Каким бы мощным и богатым на сервисы не был AWS, его основа — это виртуальные машины поверх Xen. Каждый раз, когда ты создаёшь новый дроплет на DigitalOcean, ты создаёшь виртуалку. Практически все сайты, которыми ты пользуешься, размещены на виртуальных машинах. Простота и гибкость виртуалок позволяет не только строить production-системы, но и в десятки раз облегчает локальную разработку и тестирование, особенно когда в системе задействовано множество компонентов.
Мы научились создавать одну единственную машинку — неплохо для тестирования одного приложения. Но что, если нам нужно сразу несколько виртуальных машин? Как они будут общаться друг с другом? Как они будут находить друг друга? Для этого нам нужно будет разобраться, как вообще работают сети, как они работают в контексте виртуализации, и какие компоненты задействованы в этой работе и нуждаются в настройке — в следующей статье серии.
Дополнительное чтение
Мы рассказываем, как стать более лучшим разработчиком, как поддерживать и эффективно применять свои навыки. Информация о вакансиях и акциях эксклюзивно для более чем 8000 подписчиков. Присоединяйся!