Робота з віртуальними машинами KVM. Введення

Робота з віртуальними машинами KVM. Введення

Як і обіцяв, починаю серію статей про те, як ми робили послугу оренди виділених серверів на базі KVM.

У цій вступній статті я розповім коротко про всі програмні засоби, використані в процесі розробки послуги. Докладніше про них можна дізнатися з наступних статей.

Debian

Чому Debian? Ця операційна система мені близька і зрозуміла, так що при виборі дистрибутива мук, терзань і метань випробувано не було. Особливих переваг перед Red Hat Enterprise Linux у нього немає, але було прийнято рішення працювати зі знайомою системою.

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

Ми ж, повторюся, вирішили використовувати Debian Squeeze з набором пакетів з Sid/Experimental і деякими пакетами, бекпортованими і зібраними з нашими патчами.

У планах є публікація репозитарію з пакетами.

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 і продукти, що використовують її API: virsh, virt-manager, virt-install, пр.

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

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

  • Абсолютно неосудні повідомлення про помилки.
  • Неможливість змінювати частину конфігурації віртуальної машини на льоту, хоча QMP (QEMU Monitor Protocol) це цілком дозволяє.
  • Іноді до libvirtd з незрозумілої причини неможливо з'єднатися - він перестає реагувати на зовнішні події.

cgroups

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

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

Профіт у тому, що все це реалізується всередині ядра, і використовувати це можна не тільки для сервера, але і для десктопа (що і використовували у відомому «The ауд 200 Line Linux Kernel Patch That Does Wonders»). І на мій погляд, це одна з найбільш значних змін у гілці 2.6, не рахуючи улюбленого # 12309, а не запилювання чергової файлової системи. Ну, хіба що, крім POHMELFS (але чисто через назву).

libguestfs

Ставлення до цієї бібліотеки-утиліти у мене досить неоднозначне.

З одного боку це виглядає приблизно так:

І ще цю штуку до біса складно зібрати з вихідців і тим більше в пакет: іноді мені здається, що 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

У наступній частині

Наступна частина буде про встановлення необхідних програм, і їх базове налаштування.