Перестаем бояться виртуализации при помощи KVM. Что такое виртуализация 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/систем реального времени, масштабируемости виртуальных процессоров, совместимости между поставщиками, портативности ВМ, а также в создании экосистемы облачных сервисов.

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

Сейчас передо мной встал вопрос аренды хорошего сервера с большим объёмом оперативной памяти и объёмным жестким диском. Но запускать проекты прямо на хост-машине не хочется, поэтому буду разграничивать их по отдельным небольшим виртуальным серверам с ОС Linux или docker-контейнерам (о них расскажу в другой статье).

Все современные облачные хостинги работают по такому же принципу, т.е. хостер на хорошем железе поднимает кучу виртуальных серверов, которые мы привыкли называть VPS/VDS, и раздаёт их пользователям, либо автоматизирует этот процесс (привет, DigitalOcean).

KVM (kernel-based virtual machine) это программное обеспечения для Linux, использующее аппаратные средства x86-совместимых процессоров для работы с технологией виртуализации Intel VT/AMD SVM.

Установка KVM

Все махинации по созданию виртуальной машины я буду проводить на ОС Ubuntu 16.04.1 LTS. Чтобы проверить поддерживает ли ваш процессов аппаратную виртуализацию на базе Intel VT/AMD SVM, выполняем:

Grep -E "(vmx|svm)" /proc/cpuinfo

Если терминал непустой, то значит всё в порядке и KVM можно устанавливать. Ubuntu официально поддерживает только гипервизор KVM (входит в состав ядра Linux) и советует использовать библиотеку libvirt в качестве инструмента по управлению им, что мы и будем делать дальше.

Проверить поддержку аппаратной виртуализации в Ubuntu также можно через команду:

В случае успеха, вы увидите что-то вроде этого:

INFO: /dev/kvm exists KVM acceleration can be used

Устанавливаем пакеты для работы с KVM:

Sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

Если у вас есть доступ к графической оболочке системы, то можно установить GUI менеджер libvirt:

Sudo apt-get install virt-manager

Пользоваться virt-manager достаточно просто (не сложнее VirtualBox), поэтому в этой заметке речь пойдёт про консольный вариант установки и настройки виртуального сервера.

Установка и настройка виртуального сервера

В консольном варианте установки, настройки и управлением системой, незаменимым инструментом является утилита virsh (надстройка над библиотекой libvirt). У неё большое количество опций и параметров, подробное описание можно получить так:

Man virsh

или вызвать стандартный "help":

Virsh help

Я всегда придерживаюсь следующих правил при работе с виртуальными серверами:

  1. Храню iso образы ОС в каталоге /var/lib/libvirt/boot
  2. Храню образы виртуальных машин в каталоге /var/lib/libvirt/images
  3. Явно задаю каждой новой виртуальной машине свой статичный IP адрес через DHCP сервер гипервизора.

Приступим к установке первой виртуалки (64-битной серверной убунте 16.04 LTS):

Cd /var/lib/libvirt/boot sudo wget http://releases.ubuntu.com/16.04/ubuntu-16.04.1-desktop-amd64.iso

Скачав образ запускаем установку:

Sudo virt-install \ --virt-type=kvm \ --name ubuntu1604\ --ram 1024 \ --vcpus=1 \ --os-variant=ubuntu16.04 \ --hvm \ --cdrom=/var/lib/libvirt/boot/ubuntu-16.04.1-server-amd64.iso \ --network network=default,model=virtio \ --graphics vnc \ --disk path=/var/lib/libvirt/images/ubuntu1604.img,size=20,bus=virtio

Переводя все эти параметры на "человеческий язык", то получается, что мы создаём виртуальную машину с ОС Ubuntu 16.04, 1024 МБ ОЗУ, 1 процессором, стандартной сетевой картой (виртуальная машина будет ходить в интернет как-будто из-за NAT), 20 ГБ HDD.

Стоит обратить внимание на параметр --os-variant , он указывает гипервизору под какую именно ОС следует адаптировать настройки.
Список доступных вариантов ОС можно получить, выполнив команду:

Osinfo-query os

Если такой утилиты нет в вашей системе, то устанавливаем:

Sudo apt-get install libosinfo-bin

После запуска установки, в консоли появится вот такая надпись:

Domain installation still in progress. You can reconnect to the console to complete the installation process.

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

Virsh dumpxml ubuntu1604 ... ...

Порт 5900, на локальном адресе 127.0.0.1. Чтобы подключиться к VNC, необходимо использовать Port Forwarding через ssh. Перед тем как это сделать, убедитесь, что tcp forwarding разрешён у демона ssh. Для этого идём в настройки sshd:

Cat /etc/ssh/sshd_config | grep AllowTcpForwarding

Если ничего не нашлось или вы видите:

AllowTcpForwarding no

То правим конфиг на

AllowTcpForwarding yes

и перезагружаем sshd.

Настройка Port forwarding

Выполняем команду на локальной машине:

Ssh -fN -l login -L 127.0.0.1:5900:localhost:5900 server_ip

Здесь мы настроили ssh port forwarding с локального порта 5900 на серверный порт 5900. Теперь уже можно подключиться к VNC, используя любой VNC-клиент. Я предпочитаю UltraVNC из-за простоты и удобства.

После успешного подключения, на экране отобразится стандартное окно приветствия начала установки Ubuntu:

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

Ifconfig

Запоминаем и идём на хост машину. Вытаскиваем mac-адрес "сетевой" карты виртуалки:

Virsh dumpxml ubuntu1604 | grep "mac address"

Запоминаем наш mac адрес:

Редактируем сетевые настройки гипервизора:

Sudo virsh net-edit default

Ищем DHCP, и добавляем вот это:

Должно получиться что-то вроде этого:

Для того, чтобы настройки вступили в силу, необходимо перезагрузить DHCP сервер гипервизора:

Sudo virsh net-destroy default sudo virsh net-start default sudo service libvirt-bin restart

После этого перегружаем виртуальную машину, теперь она всегда будет иметь заданный ей IP адрес - 192.168.122.131.

Есть и другие способы задать виртуалке статичный IP, например, напрямую редактируя сетевые настройки внутри гостевой системы, но тут уже как душе вашей будет угодно. Я лишь показал вариант, который сам предпочитаю использовать.

Чтобы подключиться к терминалу виртуальной машины, выполняем:

Ssh 192.168.122.131

Машина готова к бою.

Virsh: список команд

Чтобы посмотреть запущенные виртуальные хосты (все доступные можно получить добавив --all):

Sudo virsh list

Перезагрузить хост можно:

Sudo virsh reboot $VM_NAME

Остановить виртуальную машину:

Sudo virsh stop $VM_NAME

Выполнить halt:

Sudo virsh destroy $VM_NAME

Sudo virsh start $VM_NAME

Отключение:

Sudo virsh shutdown $VM_NAME

Добавить в автозапуск:

Sudo virsh autostart $VM_NAME

Очень часто требуется склонировать систему, чтобы в будущем использовать её как каркас для других виртуальных ОС, для этого используют утилиту virt-clone.

Virt-clone --help

Она клонирует существующую виртуалку и изменяет host-sensitive данные, например, mac address. Пароли, файлы и прочая user-specific информация в клоне остаётся прежней. Если на клонируемой виртуалке IP адрес был прописан вручную, то могут возникнуть проблемы с доступом по SSH на клон из-за конфликта (2 хоста с одинаковым IP).

Помимо установки виртуалки через VNC, также возможен вариант с X11Forwarding через утилиту virt-manager. В Windows, например, для этого можно использовать Xming и PuTTY.

Оригинал: 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), как о таком уровне абстракции над технологиями хардверной виртуализации Intel VT-x и AMD-V. Берем машину с процессором, поддерживающим одну из этих технологий, ставим на эту машину Linux, в Linux’е устанавливаем KVM, в результате получаем возможность создавать виртуалки. Так примерно и работают облачные хостинги, например, Amazon Web Services . Наряду с KVM иногда также используется и Xen, но обсуждение этой технологии уже выходит за рамки данного поста. В отличие от технологий контейнерной виртуализации, например, того же Docker , KVM позволяет запускать в качестве гостевой системы любую ОС, но при этом имеет и бо льшие накладные расходы на виртуализацию.

Примечание: Описанные ниже действия были проверены мной на Ubuntu Linux 14.04, но по идее будут во многом справедливы как для других версий Ubuntu, так и других дистрибутивов Linux. Все должно работать как на десктопе, так и на сервере, доступ к которому осуществляется по SSH.

Установка KVM

Проверяем, поддерживается ли Intel VT-x или AMD-V нашим процессором:

grep -E "(vmx|svm)" / proc/ cpuinfo

Если что-то нагреполось, значит поддерживается, и можно действовать дальше.

Устанавливаем KVM:

sudo apt-get update
sudo apt-get install qemu-kvm libvirt-bin virtinst bridge-utils

Что где принято хранить:

  • /var/lib/libvirt/boot/ — ISO-образы для установки гостевых систем;
  • /var/lib/libvirt/images/ — образы жестких дисков гостевых систем;
  • /var/log/libvirt/ — тут следует искать все логи;
  • /etc/libvirt/ — каталог с файлами конфигурации;

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

Создание первой виртуалки

В качестве гостевой системы я выбрал FreeBSD. Качаем ISO-образ системы:

cd / var/ lib/ libvirt/ boot/
sudo wget http:// ftp.freebsd.org/ path/ to/ some-freebsd-disk.iso

Управление виртуальными машинами в большинстве случаев производится при помощи утилиты virsh:

sudo virsh --help

Перед запуском виртуалки нам понадобится собрать кое-какие дополнительные сведения.

Смотрим список доступных сетей:

sudo virsh net-list

Просмотр информации о конкретной сети (с именем default):

sudo virsh net-info default

Смотрим список доступных оптимизаций для гостевых ОС:

sudo virt-install --os-variant list

Итак, теперь создаем виртуальную машину с 1 CPU, 1 Гб RAM и 32 Гб места на диске, подключенную к сети default:

sudo virt-install \
--virt-type =kvm \
--name freebsd10 \
--ram 1024 \
--vcpus =1 \
--os-variant =freebsd8 \
--hvm \
--cdrom =/ var/ lib/ libvirt/ boot/ FreeBSD-10.2 -RELEASE-amd64-disc1.iso \
--network network =default,model =virtio \
--graphics vnc \
--disk path =/ var/ lib/ libvirt/ images/ freebsd10.img,size =32 ,bus =virtio

Вы можете увидеть:

WARNING Unable to connect to graphical console: virt-viewer not
installed. Please install the "virt-viewer" package.

Domain installation still in progress. You can reconnect to the console
to complete the installation process.

Это нормально, так и должно быть.

Затем смотрим свойства виртуалки в формате XML:

sudo virsh dumpxml freebsd10

Тут приводится наиболее полная информация. В том числе есть, к примеру, и MAC-адрес, который понадобятся нам далее. Пока что находим информацию о VNC. В моем случае:

С помощью любимого клиента (я лично пользуюсь Rammina) заходим по VNC , при необходимости используя SSH port forwarding. Попадаем прямо в инстялятор FreeBSD. Дальше все как обычно — Next, Next, Next, получаем установленную систему.

Основные команды

Давайте теперь рассмотрим основные команды для работы с KVM.

Получение списка всех виртуалок:

sudo virsh list --all

Получение информации о конкретной виртуалке:

sudo virsh dominfo freebsd10

Запустить виртуалку:

sudo virsh start freebsd10

Остановить виртуалку:

sudo virsh shutdown freebsd10

Жестко прибить виртуалку (несмотря на название, это не удаление):

sudo virsh destroy freebsd10

Ребутнуть виртуалку:

sudo virsh reboot freebsd10

Склонировать виртуалку:

sudo virt-clone -o freebsd10 -n freebsd10-clone \
--file / var/ lib/ libvirt/ images/ freebsd10-clone.img

Включить/выключить автозапуск:

sudo virsh autostart freebsd10
sudo virsh autostart --disable freebsd10

Запуск virsh в диалоговом режиме (все команды в диалоговом режиме — как описано выше):

sudo virsh

Редактирование свойств виртуалки в XML, в том числе здесь можно изменить ограничение на количество памяти и тд:

sudo virsh edit freebsd10

Важно! Комментарии из отредактированного XML, к сожалению, удаляются.

Когда виртуалка остановлена, диск тоже можно ресайзить:

sudo qemu-img resize / var/ lib/ libvirt/ images/ freebsd10.img -2G
sudo qemu-img info / var/ lib/ libvirt/ images/ freebsd10.img

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

Резервное копирование и восстановление производятся довольно просто. Достаточно сохранить куда-то вывод dumpxml, а также образ диска, а потом восстановить их. На YouTube удалось найти видео с демонстрацией этого процесса, все и вправду несложно.

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

Интересный вопрос — как определить, какой IP-адрес получила виртуалка после загрузки? В KVM это делается хитро. Я в итоге написал такой скрипт на Python :

#!/usr/bin/env python3

# virt-ip.py script
# (c) 2016 Aleksander Alekseev
# http://сайт/

import sys
import re
import os
import subprocess
from xml .etree import ElementTree

def eprint(str ) :
print (str , file = sys .stderr )

if len (sys .argv ) < 2 :
eprint("USAGE: " + sys .argv [ 0 ] + " " )
eprint("Example: " + sys .argv [ 0 ] + " freebsd10" )
sys .exit (1 )

if os .geteuid () != 0 :
eprint("ERROR: you shold be root" )
eprint("Hint: run `sudo " + sys .argv [ 0 ] + " ...`" ) ;
sys .exit (1 )

if subprocess .call ("which arping 2>&1 >/dev/null" , shell = True ) != 0 :
eprint("ERROR: arping not found" )
eprint("Hint: run `sudo apt-get install arping`" )
sys .exit (1 )

Domain = sys .argv [ 1 ]

if not re .match ("^*$" , domain) :
eprint("ERROR: invalid characters in domain name" )
sys .exit (1 )

Domout = subprocess .check_output ("virsh dumpxml " +domain+" || true" ,
shell = True )
domout = domout.decode ("utf-8" ) .strip ()

if domout == "" :
# error message already printed by dumpxml
sys .exit (1 )

Doc = ElementTree.fromstring (domout)

# 1. list all network interfaces
# 2. run `arping` on every interface in parallel
# 3. grep replies
cmd = "(ifconfig | cut -d " " -f 1 | grep -E "." | " + \
"xargs -P0 -I IFACE arping -i IFACE -c 1 {} 2>&1 | " + \
"grep "bytes from") || true"

for child in doc.iter () :
if child.tag == "mac" :
macaddr = child.attrib [ "address" ]
macout = subprocess .check_output (cmd .format (macaddr) ,
shell = True )
print (macout.decode ("utf-8" ) )

Скрипт работает как с default сетью, так и с bridged сетью, настройку которой мы рассмотрим далее. Однако на практике куда удобнее настроить KVM так, чтобы он всегда назначал гостевым системам одни и те же IP-адреса. Для этого правим настройки сети:

sudo virsh net-edit default

… примерно таким образом:

>



>

После внесения этих правок


>

… и заменяем на что-то вроде:




>

Перезагружаем гостевую систему и проверяем, что она получила IP по DHCP от роутера. Если же вы хотите, чтобы гостевая система имела статический IP-адрес, это настраивается как обычно внутри самой гостевой системы.

Программа virt-manager

Вас также может заинтересовать программа virt-manager:

sudo apt-get install virt-manager
sudo usermod -a -G libvirtd USERNAME

Так выглядит ее главное окно:

Как видите, virt-manager представляет собой не только GUI для виртуалок, запущенных локально. С его помощью можно управлять виртуальными машинами, работающими и на других хостах, а также смотреть на красивые графички в реальном времени. Я лично нахожу особенно удобным в virt-manager то, что не нужно искать по конфигам, на каком порту крутится VNC конкретной гостевой системы. Просто находишь виртуалку в списке, делаешь двойной клик, и получаешь доступ к монитору.

Еще при помощи virt-manager очень удобно делать вещи, которые иначе потребовали бы трудоемкого редактирования XML-файлов и в некоторых случаях выполнения дополнительных команд. Например, переименование виртуальных машин, настройку CPU affinity и подобные вещи. Кстати, использование CPU affinity существенно снижает эффект шумных соседей и влияние виртуальных машин на хост-систему. По возможности используйте его всегда.

Если вы решите использовать KVM в качестве замены VirtualBox, примите во внимание, что хардверную виртуализацию они между собой поделить не смогут. Чтобы KVM заработал у вас на десктопе, вам не только придется остановить все виртуалки в VirtualBox и Vagrant , но и перезагрузить систему. Я лично нахожу KVM намного удобнее VirtualBox, как минимум, потому что он не требует выполнять команду sudo / sbin/ rcvboxdrv setup после каждого обновления ядра, адекватно работает c Unity , и вообще позволяет спрятать все окошки.

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

Первый материал, из серии «технологии VPS/VDS», посвящен программному продукту KVM (Kernel-based Virtual Machine). Начинаем с него, так как именно этот гипервизор мы используем в облаке Tucha и, конечно же, наше отношение к нему особенное.

Гипервизор KVM: особенности и принцип работы

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

Гипервизор KVM: архитектура

KVM (аббревиатура от Kernel-based Virtual Machine) – это программное обеспечение, которое дает возможность реализовать виртуализацию на базе компьютеров под управлением ОС Linux и подобных. С некоторых пор KVM является частью Linux-ядра, потому развивается вместе с ним. Работает только в системах с аппаратной поддержкой виртуализации – на процессорах Intel и AMD.

Для организации работы KVM использует прямой доступ к ядру с помощью процессор-специфичного модуля (kvm-intel или kvm-amd). Кроме того, в состав комплекса входит главное ядро – kvm.ko и элементы UI, в том числе и популярный QEMU. Гипервизор позволяет работать напрямую с файлами виртуальных машин и образами дисков из других программ. Для каждой машины создается изолированное пространство со своей памятью, диском, сетевым доступом, видеокартой и другими устройствами.

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

Как и любое программное решение, KVM имеет как плюсы, так и минусы, исходя из которых, хостеры и конечные потребители принимают решение об использовании этого ПО.

Основные преимущества гипервизора таковы:

  • независимо распределяемые ресурсы . Каждая работающая под управлением KVM виртуальная машина получает свой объем оперативной и постоянной памяти и не может «залезть» в другие области, что повышает стабильность работы;
  • широкая поддержка гостевых ОС . Кроме полной поддержки UNIX-дистрибутивов, в том числе *BSD, Solaris, Linux, есть возможность устанавливать Windows и даже MacOS;
  • взаимодействие с ядром позволяет напрямую обращаться к оборудованию рабочей станции, что делает работу более быстрой ;
  • поддержка грандов софтверного рынка (RedHat Linux, HP, Intel, IBM) позволяет проекту быстро развиваться, охватывая все большее количество оборудования и OS, в том числе новейших;
  • простое администрирование – возможность удаленного управления через VNC и большое количество стороннего ПО и надстроек.

Без недостатков также не обошлось:

  • относительная молодость гипервизора (например, по сравнению с Xen) и соответственно взрывной рост приводят к различным проблемам, особенно при добавлении поддержки нового оборудования и программного окружения;
  • сложность настроек, особенно для неискушенного пользователя. Правда, большинство опций можно не менять – они настроены оптимально «из коробки».

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

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

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

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

Поскольку KVM является частью ядра Linux, гипервизор наследует мощные инструменты управления памятью. Страницы памяти каждого процесса, т.е. виртуальных машин, могут быстро копироваться и меняться без ущерба скорости работы. С поддержкой многопроцессорных систем KVM получила возможность управлять большими объемами памяти. Поддерживается также обобщение памяти – объединение одинаковых страниц и выдача копии машине по запросу, а также другие методы оптимизации.

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

Для хранения образов машин и их данных KVM может использовать любые носители, которые поддерживаются родительной операционной системой – жесткие диски, NAS, съемные накопители, в том числе с многопоточным вводом-выводом для ускорения работы. Кроме того, гипервизор может работать с распределёнными файловыми системами – например, GFS2. Диски для KVM имеют собственный уникальный формат, который поддерживает динамическое создание снимков разного уровня, шифрование и сжатие.

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

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

Масштабируемость и производительности комплекса благодаря плотной интеграции с Linux, полностью унаследованы от этой ОС. Таким образом, гипервизор поддерживает до 16 процессоров (виртуальных или физических) и до 256 ГБ ОЗУ в каждой виртуальной машине. Это позволяет использовать гипервизор даже в наиболее высоконагруженных системах.

Стабильность

Программный комплекс постоянно совершенствуется - если изначально он поддерживал только платформу Linux x86, то сегодня количество различных платформ исчисляется десятками, включая все популярные серверные ОС. Кроме того, вы без труда сможете развернуть виртуальную машину с модифицированной сборкой операционной системы, если она совместима с родительской платформой. А благодаря сотрудничеству с ведущими производителями ПО гипервизор KVM можно назвать самым стабильным и надежным на рынке.