Работа с виртуальными машинами 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


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



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

    Подробнее
    Реклама

    Комментарии 38

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

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

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

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

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

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

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

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

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

                      Ну и под FreeBSD скоро будут сделают, наконец-то, virtio драйверы, и всё будет работать ещё лучше :) А xen-овские вроде пока не торопятся.
                        +1
                        Странно. У меня опыта с виндой не очень много — в основном все виртуалки с центом или RHELом. На работе 7 виртуалок под XenServer бегают, дрова стоят цитриксовые. Не уверен конечно на 100%, что они полностью паравирт (не ковырял), но машинки бегают очень шустро.
                        Пару машин еще запускал на Xen под RHEL в режиме полной виртуализации, они да — не так шустро как хотелось бы работали. Недавно перевел их под KVM с паравирт дровами, вроде шустрее бегают.
                        В обоих случаях ни разу не видел BSOD.
                          +1
                          В общем это более вопрос личного опыта. И я лично не знаю ни одного хостера, который бы на Xen Windows запускал. В основном это Hyper-V, конечно.
                            +1
                            Ну это собственно не удивительно — родная ось в родном гипервизоре шустрее будет бегать. Если количество виртуалок под виндой приближается к 10ку, то стоит задуматься о родном для винды решении.
                            Просто удивился — Xen вроде как пилится Цитриксом, если бы у них винда криво работала, то вмварь давно бы их в прессе камнями закидала.
                              0
                              Я Citrix Xen не пробовал, использовал только тот, который в Debian лежит. Их драйвера вполне могут быть допилены до приемлемого состояния.
                      +1
                      Да KVM приятен и прост. Только libvirt немного не интуитивна.
                      Кстати SuSE в следующем SLES делает выбор между XEN и KVM, что есть гуд.
                        0
                        «даёт выбор» конечно же.
                        +1
                        В debian уже запилили SPICE?
                          0
                          Что под этим подразумевается? Клиентская часть или серверная? Серверная в KVM встроена вроде как, а клиентской по моему нет, но на самом деле не интересовался этим.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          а зачем? хакинтош ставили на вмтварь. а что бы на хен или квм — первый раз слышу.
                          • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          Спасибо за информацию. Как раз то что нужно. Отказался от ESX на домашнем сервере. поставил Федору, буду на KVM все разворачивать. Причина отказа — не смог пробросить звук в гостевую ось. Проброс PCI не поддерживается чипсетом, а USB звуковухи не пробрасываются ESXом. А оочень хочется разговаривающий серв (festival) и модный будильник)))

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

                          Самое читаемое