Різниця між KVM та QEMU


138

Я читав про KVMі Qemuколись. На сьогодні я чітко розумію, що вони роблять.

KVM підтримує апаратну віртуалізацію для забезпечення майже рідної продуктивності систем Gosti Operating. З іншого боку, QEmu емулює цільову операційну систему.

Мене плутає те, на якому рівні ці двоє координують. Подібно до

  1. Хто управляє обміном оперативної пам’яті та / або пам’яттю?
  2. Хто планує операції вводу / виводу?

Відповіді:


194

Qemu :

QEmu - це власне повноцінне програмне забезпечення. Ви використовуєте його для емуляції машин, він дуже гнучкий і портативний. В основному він працює за допомогою спеціального 'рекомпілятора', який перетворює двійковий код, записаний для даного процесора, в інший (скажімо, для запуску MIPS-коду на ПК-мак або ARM на комп'ютері x86).

Щоб наслідувати більше, ніж просто процесор, Qemu включає довгий список периферійних емуляторів: диск, мережа, VGA, PCI, USB, послідовний / паралельний порт тощо.

KQemu :

У конкретному випадку, коли і джерело, і ціль є однаковою архітектурою (як звичайний випадок x86 на x86), він все ще повинен проаналізувати код, щоб видалити будь-які "привілейовані інструкції" та замінити їх контекстними комутаторами. Щоб зробити його максимально ефективним на x86 Linux, є модуль ядра під назвою KQemu, який обробляє це.

Будучи модулем ядра, KQemu здатний виконувати більшість кодів без змін, замінюючи лише інструкції, призначені лише для ring0. У цьому випадку користувальницький простір Qemu все ще виділяє всю оперативну пам’ять для емульованої машини та завантажує код. Різниця полягає в тому, що замість перекомпіляції коду він викликає KQemu для сканування / виправлення / виконання. Вся периферійна апаратна емуляція виконується в Qemu.

Це набагато швидше, ніж звичайний Qemu, оскільки більша частина коду не змінюється, але все ж має трансформувати код ring0 (більша частина коду в ядрі VM), тому продуктивність все ще страждає.

КВМ :

KVM - це декілька речей: спочатку це модуль ядра Linux (тепер він включений в основну лінію), який перетворює процесор у новий стан гостя. Стан гостя має власний набір станів дзвінка, але привілейовані інструкції ring0 повертаються до коду гіпервізора. Оскільки це новий спосіб виконання процесора, код не має бути жодним чином змінювати.

Крім переключення стану процесора, модуль ядра також обробляє декілька низькорівневих частин емуляції, таких як регістри MMU (використовувані для обробки VM) та деякі частини емульованого обладнання PCI.

По-друге, KVM - це вилка виконуваного файлу Qemu. Обидві команди активно працюють над тим, щоб мінімізувати відмінності, і є досягнення в її зменшенні. Зрештою, мета полягає в тому, що Qemu повинен працювати де завгодно, і якщо модуль ядра KVM доступний, він може бути використаний автоматично. Але в осяжному майбутньому команда Qemu зосереджується на апаратній емуляції та портативності, тоді як KVM фокусується на модулі ядра (іноді переміщуючи туди невеликі частини емуляції, якщо це покращує продуктивність) та взаємодіє з рештою коду простору користувача.

Виконаний файл kvm-qemu працює як звичайний Qemu: виділяє оперативну пам'ять, завантажує код і замість того, щоб перекомпілювати його або викликати KQemu, він породжує потік (це важливо). Потік викликає модуль ядра KVM для переходу в гостьовий режим і переходить до виконання коду VM. У привілейованій інструкції він перемикається назад на модуль ядра KVM, який, якщо необхідно, передає потік Qemu для обробки більшості апаратної емуляції.

Однією з приємних речей цієї архітектури є те, що гостьовий код емулюється в потоковій позі, якою можна керувати за допомогою звичайних інструментів Linux. Якщо ви хочете VM з 2 або 4 ядрами, kvm-qemu створює 2 або 4 потоки, кожен з них викликає модуль ядра KVM для початку виконання. Паралельність - якщо у вас достатньо реальних ядер - або планування - якщо ні - керується звичайним планувальником Linux, зберігаючи код невеликим, а сюрпризи обмежені.


3
А для тих, хто як я не має процесора з підтримкою VT, погані новини (ну, якщо це можна назвати «новинами») - KQEMU більше не підтримується в Ubuntu . Без цієї підтримки KVM не працює з процесором.
Привіт-Ангел

100

Працюючи разом, KVM арбітражно здійснює доступ до центрального процесора та пам'яті, а QEMU емулює апаратні ресурси (жорсткий диск, відео, USB тощо). Працюючи в поодинці, QEMU емулює як процесор, так і апаратне забезпечення.


9
@ Відповідь Хав'єра детальна, і вона, безумовно, повинна бути прийнятою, але ваша відповідь встигла дати мені в декількох реченнях саме те, що мені потрібно було знати, тому +1 і спасибі.
Білл Мавпа

-2

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.