Моє поточне розуміння:
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
Бінарний програмний код на процесорах працює не просто так, а розташовується на різних рівнях (кільцях / 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) 🙂
КРЕДИТИ
PS Текст цієї статті спочатку було опубліковано у Telegram каналі
Напишіть у коментарях, у яких місцях я не правильно розумію тему або якщо є що доповнити.
Спасибо!
Джерело: habr.com