Разница между KVM и QEMU


138

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

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

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

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

Ответы:


194

Кему :

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

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

KQemu :

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

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

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

KVM :

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

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

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

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

Одна из приятных особенностей этой архитектуры заключается в том, что гостевой код эмулируется в виде потока posix, которым вы можете управлять с помощью обычных инструментов Linux. Если вам нужна виртуальная машина с 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.