Загальні принципи роботи QEMU-KVM

Загальні принципи роботи 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

Загальні принципи роботи QEMU-KVM

Бінарний програмний код на процесорах працює не просто так, а розташовується на різних рівнях (кільцях / 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), що дозволяють виконувати код гостьових ОС НАПРЯМУ на процесорі хоста (минаючи всякі проміжні витратні етапи, як це було раніше).

З появою Intel VT-x/AMD SVM, був створений спеціальний новий рівень Ring-1 (мінус один). І тепер на ньому працює гіпервізор, а гості працюють на Ring 0 та отримують привілейований доступ до CPU.

Тобто. в підсумку:

  • хост працює на Ring 0
  • гості працюють на Ring 0
  • гіпервізор працює на Ring-1

4) QEMU-KVM

KVM надає доступ гостям до Ring 0 та використовує QEMU для емуляції I/O (процесор, диски, мережа, відео, PCI, USB, серійні порти тощо, які «бачать» і з якими працюють гості).

Звідси QEMU-KVM (або KVM-QEMU) 🙂

КРЕДИТИ
Картинка для привернення уваги
Зображення Protection rings

PS Текст цієї статті спочатку було опубліковано у Telegram каналі @RU_Voip як відповідь на запитання одного з учасників каналу.

Напишіть у коментарях, у яких місцях я не правильно розумію тему або якщо є що доповнити.

Спасибо!

Джерело: habr.com

Додати коментар або відгук