Работа с виртуальными машинами KVM. Введение

Как и обещал, начинаю серию статей о том, как мы делали услугу аренды выделенных серверов на базе KVM.

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



Debian



Debian

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

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

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

KVM



KVM

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

Замечу, что лично я не очень хорошо знаю Xen, его архитектуру и уж тем более мелкие особенности — в основном я знакомился с ним в качестве гостя. Нет повода сказать, что Xen чем-то плох (потому, что он ещё не полностью вошёл в ядро, или у него что-то не так с производительностью, или еще по какой-то причине). Ничего определённого нельзя сказать и в плане производительности: в каких-то тестах KVM на 10-20 процентов опережает Xen по всем показателям, а где-то выигрывает Xen. Фактически, на текущий момент они практически сравнялись по функционалу, производительности, надёжности. И в принципе, не за горами тот день, когда Xen также войдёт в ядро. Уже вошёл в состав ядра virtually-a-machine.blogspot.com/2011/06/xen-support-in-mainline-linux-kernel.html.

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

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

libvirt


libvirt

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

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

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

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


cgroups



cgroups

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

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

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

libguestfs



libguestfs

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

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

libguestfs is a swiss knife

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

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

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

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

Прочее



Ниже приведено ещё несколько интересных ссылок на описание использованных пограммных средств — почитать и поизучать самостоятельно, если интересно. Например, про утилиту для массовой работы с конфигурационными файлами, KVM best practices от товарищей из IBM. Рекомендую!

  1. Пост Daniel Berrange об использовании cgroups с KVM и LXC.
  2. Пост Richard Jones об использовании libguestfs для получения маленького размера «базового» образа виртуальной машины.
  3. BKL #12309 на bugzilla.kernel.org


В следующей части



Следующая часть будет про установку необходимых программ, и их базовую настройку.
+41
2 июня 2011, 16:53
87
librarian 27,3 G+

комментарии (38)

+2
shadowalone #
не за горами тот день, когда Xen также войдёт в ядро.
Как в воду глядели, Xen вошел в ядро. goo.gl/g1LE5
+2
librarian #
Ух ты! Если не против, я пожалуй даже обновлю статью.
+1
shadowalone #
Конечно не против, всегда только за :)
+1
shadowalone #
Похоже Хаброэффект, на ссылку не переходит.
goo.gl/xv42G — вот здесь, на главной, новость от 2 июня.
+2
alexeym #
я бы посоветовал взять именно RHEL: благодаря хорошей документации и хорошо написаным прикладным программам это будет если не на порядок

уже лучше сразу www.redhat.com/virtualization/rhev/server/
там уже всё готово
конструктор собирать уже не нужно будет + решение уже протестировано
+1
librarian #
Для корпоративного сектора он, безусловно, походит идеально, но для предоставления хостинга к сожалению его тоже пилить и пилить.
+1
alexeym #
что там пилить?)
там уже всё готово и документировано от и до

это как с VwWare — там вам пилить никто ничего не даст

+1
librarian #
Например FreeBSD запилить, на текущий момент UFS в Linux нельзя отресайзить, только разве что через жёсткие хаки.
Или интегрировать всё это с панелью управления хостинговой. Или сделать лимитирование трафика для виртуалок.
+1
alexeym #
>например FreeBSD запилить
как гостя или как?
KVM в редхате поддерживает это и только это www.redhat.com/rhel/server/virtualization_support.html#virt_matrix

>Или интегрировать всё это с панелью управления хостинговой
при чем тут хостинг? это же клауд компутинг! :)
юзая libvirt api пишете что угодно для управления этим делом (думаю там есть и более высокоуровневые средства для кастомизации)

>Или сделать лимитирование трафика для виртуалок.
там это всё есть
+1
librarian #
FreeBSD как гостя конечно.

Маркетинг про cloud computing нафиг. Ибо у многих cloud с чем то иным ассоциируется, лично для меня это должен быть кластер, в котором все вычислительные мощности объединены (а не разделяются по нодам, как сделано у многих), и у которого общее хранилище.

А API libvirt я трогал, оно не предоставляет необходимой кастомизации.
+1
alexeym #
вот кстати монументальная дока по API для Redhat Virtualization

docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Virtualization_for_Servers/2.2/pdf/API_Guide/Red_Hat_Enterprise_Virtualization_for_Servers-2.2-API_Guide-en-US.pdf

т.е. своё апи вам писать не нужно )
0
librarian #
RHEV для корпоративного сектора хорош, для хостинга он малоприменим. API даже 10% необходимого функционала не покрывает, зато добавляет over 9000 ненужного.
0
librarian #
И опять же скажу, что я с RHEV вживую дело не имел.
+1
alexeym #
хм, что например? (какого функционала)
+1
librarian #
В API я, например, не вижу экспорта данных по использованным ресурсам и трафику. Также не вижу возможности переписать скрипт установки, например перейти с клонирование готового образа, к установке через, допустим, debian installer или debootstrap или ещё чего.
+1
alexeym #
ну это да,
так как у всех разные требования к этом

(хотя вот в XCP/XenServer, API позволяет получить статистику по ресурсам)
+1
librarian #
Вот про это я собственно и говорю, иногда лучше написать свой велосипед, зато ты будешь детально знать что и как там работает. А если нужно будет допилить, не будешь разводить руками говоря что не знаешь как это сделать.
+2
alexeym #
если есть время, деньги, мозг, то да:)
+1
RankoR #
Спасибо большое, очень в тему — как раз начинаю заниматься виртуализацией на KVM.
P. S. Ничего против Xen не имею, но его же вроде из Debian обещали выпилить с 7-й версии?
+1
RankoR #
Это я к тому, что дебиановцы его убрать хотят, и тут раз — его в ядро включают…
+1
librarian #
Ну врятли тут его «раз» и включили, его несколько лет встраивали в ядро.
+1
librarian #
habrahabr.ru/blogs/virtualization/120432/#comment_3950710
Врятли его выпилят, сейчас он уже внутри ядра 3.0 должен быть. Да и не скоро это будет, всё 100 раз поменяется.
+1
Demosfen #
Редхат его тоже выпилил в 6ке. Интересно, если 7ка будет на 3й ветке ядра, то они его тоже будут выпиливать, или оставят? :)
+2
Demosfen #
>Основной же причиной, по которой мы решили использовать именно KVM, является необходимость запуска виртуальных машин с FreeBSD и, в перспективе, MS Windows.
Ээээ… А в чем проблема с Xen? Под винду паравирт дрова есть и работают нормально. Под фряху — не знаю, но если и нет, то можно в полной виртуализации запустить.
Опять же Citrix XenServer в базовом варианте очень неплох и халявен.
+1
librarian #
Мой опыт насчёт «нормально» утверждает обратное, bsod на bsod-е. Для боевой эксплуатации оно как-то не очень подходит.

Ну и под FreeBSD скоро будут сделают, наконец-то, virtio драйверы, и всё будет работать ещё лучше :) А xen-овские вроде пока не торопятся.
+1
Demosfen #
Странно. У меня опыта с виндой не очень много — в основном все виртуалки с центом или RHELом. На работе 7 виртуалок под XenServer бегают, дрова стоят цитриксовые. Не уверен конечно на 100%, что они полностью паравирт (не ковырял), но машинки бегают очень шустро.
Пару машин еще запускал на Xen под RHEL в режиме полной виртуализации, они да — не так шустро как хотелось бы работали. Недавно перевел их под KVM с паравирт дровами, вроде шустрее бегают.
В обоих случаях ни разу не видел BSOD.
+1
librarian #
В общем это более вопрос личного опыта. И я лично не знаю ни одного хостера, который бы на Xen Windows запускал. В основном это Hyper-V, конечно.
+1
Demosfen #
Ну это собственно не удивительно — родная ось в родном гипервизоре шустрее будет бегать. Если количество виртуалок под виндой приближается к 10ку, то стоит задуматься о родном для винды решении.
Просто удивился — Xen вроде как пилится Цитриксом, если бы у них винда криво работала, то вмварь давно бы их в прессе камнями закидала.
0
librarian #
Я Citrix Xen не пробовал, использовал только тот, который в Debian лежит. Их драйвера вполне могут быть допилены до приемлемого состояния.
+1
simonoff #
Да KVM приятен и прост. Только libvirt немного не интуитивна.
Кстати SuSE в следующем SLES делает выбор между XEN и KVM, что есть гуд.
0
simonoff #
«даёт выбор» конечно же.
+1
polyakstar #
В debian уже запилили SPICE?
0
librarian #
Что под этим подразумевается? Клиентская часть или серверная? Серверная в KVM встроена вроде как, а клиентской по моему нет, но на самом деле не интересовался этим.
0
librarian #
Судя по bugs.debian.org/cgi-bin/bugreport.cgi?bug=560721 работы ведутся.
0
ALiEN_QWERTY #
Есть знатоки xen server?

Перепробовал все хаки какие знал, но так и не смог поставить Mac OS X Snow Leopard Server на xen. Может кто то занимался и подскажет?

P.S. на esxi поставил SL, но там другая проблема очень странная, поэтому пришлось отказаться в пользу xen.
0
simonoff #
а зачем? хакинтош ставили на вмтварь. а что бы на хен или квм — первый раз слышу.
0
ALiEN_QWERTY #
Раз первый раз, значит к сожалению не сможете мне помочь.
0
Godless #
Спасибо за информацию. Как раз то что нужно. Отказался от ESX на домашнем сервере. поставил Федору, буду на KVM все разворачивать. Причина отказа — не смог пробросить звук в гостевую ось. Проброс PCI не поддерживается чипсетом, а USB звуковухи не пробрасываются ESXом. А оочень хочется разговаривающий серв (festival) и модный будильник)))

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