Вопрос: Разница между KVM и QEMU


Я читал о KVM а также Qemu на некоторое время. На данный момент я четко понимаю, что они делают.

KVM поддерживает аппаратную виртуализацию для обеспечения близкой производительности к гостевой операционной системе. С другой стороны, QEmu эмулирует целевую операционную систему.

Меня смущает то, на каком уровне эти две координируют. подобно

  1. Кто управляет совместным использованием ОЗУ и / или памяти?
  2. Кто планирует операции ввода-вывода?

103
2017-12-03 08:42


Источник




Ответы:


Qemu:

QEmu является полным и автономным программным обеспечением. Вы используете его для эмуляции машин, он очень гибкий и портативный. В основном это работает специальным «рекомпилятором», который преобразует двоичный код, написанный для данного процессора, в другой (скажем, для запуска кода MIPS на PPC mac или ARM на ПК x86).

Чтобы эмулировать больше, чем просто процессор, Qemu включает в себя длинный список периферийных эмуляторов: диск, сеть, VGA, PCI, USB, последовательные / параллельные порты и т. Д.

KQEMU:

В конкретном случае, когда исходный и целевой объекты имеют одну и ту же архитектуру (например, общий случай x86 на x86), он все равно должен анализировать код для удаления любых «привилегированных инструкций» и заменять их переключателями контекста. Чтобы сделать его максимально эффективным на x86 Linux, есть модуль ядра KQemu, который обрабатывает это.

Являясь модулем ядра, KQemu может выполнять большинство изменений без изменений, заменяя только инструкции самого нижнего уровня ring0. В этом случае пользовательское пространство Qemu по-прежнему распределяет всю ОЗУ для эмулируемой машины и загружает код. Разница в том, что вместо перекомпиляции кода он вызывает KQemu для сканирования / патча / выполнения. Вся периферийная аппаратная эмуляция выполняется в Qemu.

Это намного быстрее, чем обычный Qemu, потому что большинство кода не изменилось, но все же необходимо преобразовать код ring0 (большая часть кода в ядре VM), поэтому производительность все еще страдает.

KVM:

KVM - это пара вещей: сначала это модуль ядра Linux, который теперь включен в mainline, который переключает процессор в новое состояние «гость». Состояние гостя имеет свой собственный набор состояний кольца, но привилегированные команды ring0 возвращаются к гипервизору. Поскольку это новый процессорный режим исполнения, код не нужно каким-либо образом изменять.

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

Во-вторых, KVM является вилкой исполняемого файла Qemu. Обе команды активно работают, чтобы свести к минимуму различия, и есть прогресс в ее сокращении. В конце концов, цель состоит в том, что Qemu должен работать в любом месте, и если доступен модуль ядра KVM, его можно будет автоматически использовать. Но в обозримом будущем команда Qemu фокусируется на аппаратной эмуляции и переносимости, в то время как люди KVM сосредотачиваются на модуле ядра (иногда перемещая небольшие части эмуляции там, если это повышает производительность) и взаимодействуют с остальным кодом пользовательского пространства.

Исполнение kvm-qemu работает как обычный Qemu: выделяет ОЗУ, загружает код, а вместо его перекомпиляции или вызывает KQemu, он порождает поток (это важно). Этот поток вызывает модуль ядра KVM для переключения в гостевой режим и переходит к выполнению кода виртуальной машины. В привилегированной инструкции он переключается обратно в модуль ядра KVM, который, если необходимо, сигнализирует поток Qemu для обработки большей части аппаратной эмуляции.

Одной из приятных особенностей этой архитектуры является то, что гостевой код эмулируется в потоке posix, который вы можете управлять с помощью обычных инструментов Linux. Если вам нужна VM с 2 или 4 ядрами, kvm-qemu создает 2 или 4 потока, каждый из которых вызывает запуск модуля ядра KVM. Параллелизм - если у вас достаточно реальных ядер - или планирование - если не - - управляется обычным планировщиком Linux, ограничение содержания кода и небольшие сюрпризы ограничены.


144
2017-12-03 14:40



И для тех, у кого у меня нет процессора с поддержкой VT, плохие новости (ну, если бы это можно было назвать «новостями») - KQEMU больше не поддерживается в Ubuntu, KVM не работает с процессором без этой поддержки. - Hi-Angel


При совместной работе KVM разрешает доступ к процессору и памяти, а QEMU эмулирует аппаратные ресурсы (жесткий диск, видео, USB и т. Д.). При работе в одиночку QEMU эмулирует как процессор, так и аппаратное обеспечение.


75
2017-12-03 08:46



@ Ответ Хавьера подробно и должен быть принят, конечно, но ваш ответ позволил мне в нескольких предложениях точно знать, что мне нужно знать, так что +1 и спасибо. - Bill The Ape


QEMU работает медленнее, и KVM помогает QEMU достичь очень быстрой аппаратной скорости, чтобы обеспечить максимальную производительность для системы. QEMU - гипервизор / эмулятор.


-1
2017-11-14 10:58