Узнайте о виртуальной машине ядра Linux (KVM)

Узнайте об архитектуре и преимуществах KVM

Linux и гибкость идут бок о бок и возможности виртуализации также. Совсем недавно с появлением Kernel Virtual Machine, или KVM, ситуация с виртуализацией в Linux изменилась. KVM поддерживает виртуализацию гостевых операционных систем Linux и даже Windows на аппаратуре, которая способна к виртуализации.

М. Тим Джонс, инженер-консультант, Emulex

M. Tim JonesM. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного обеспечения и автором работ: Программирование Приложений под GNU/Linux, Программирование AI-приложений и Использование BSD-сокетов в различных языках программирования. Он имеет опыт разработки процессоров для геостационарных космических летательных аппаратов, а также разработки архитектуры встраиваемых систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо.



20.06.2007

Введение

Виртуализация – это концепция, которая была популярна в последнее время. Кратко – это процесс, который состоит в том, чтобы взять что-то и сделать его похожим на что-то другое. Применение этой концепции к компьютерной системе позволяет различным пользователям видеть одну систему по-разному (например, один и тот же компьютер работает как под Linux, так и под Microsoft® Windows® одновременно). Это обычно называется полной виртуализацией (full virtualization).

KVM и kvm

В этой статье я говорю KVM, когда подразумеваю Kernel Virtual Machine и kvm, когда подразумеваю утилиту-гипервизор (используемую для запуска виртуальной машины).

Виртуализация может также быть более сложной, такой что одиночный компьютер может выглядеть как множественная архитектура (для одного пользователя он будет стандартной платформой x86, для другого – платформой IBM Power PC®). Эта форма виртуализации известна как эмуляция аппаратуры (hardware emulation).

Более простая форма виртуализации – это виртуализация операционной системы, в результате которой одиночный компьютер работает с несколькими операционными системами одного типа. Этот тип виртуализации просто изолирует некоторые приложения на отдельной операционной системе (что означает, что все должны использовать один и тот же тип и версию операционной системы). Для получения дополнительной информации обратитесь к Ресурсам.

Виртуализация и пара-виртуализация

Два основных подхода к виртуализации – это полная виртуализация (full virtualization) и пара-виртуализация (para-virtualization). При полной виртуализации существует прослойка между виртуализируемой операционной системой и аппаратурой как способ осуществления арбитража доступа. Эта прослойка называется гипервизор или монитор виртуальной машины (VMM). Пара-виртуализация сходна с виртуализацией, но гипервизор работает в более согласованном режиме. Это происходит потому, что каждая гостевая операционная система осведомлена о том, что она работает виртуально, поэтому каждая из них работает совместно с гипервизором, для того чтобы виртуализировать базовую аппаратуру.

Примеры полной виртуализации – это коммерческая реализация виртуализации VMware, а также операционная система коммерческой IBM System z9 Virtual Machine (z/VM) для компьютеров IBM zSeriesВ®. Пара-виртуализация поддерживается Xen и User-Mode-Linux (UML). KVM также рассматривается как реализация полной виртуализации, но я объясню это позже.


Как работает виртуализация

Давайте начнем с краткого обсуждения виртуализации и ее составных элементов. В основе реализации виртуализации лежит машина, которую надо виртуализировать. Эта машина может поддерживать или не поддерживать виртуализацию, во втором случае требуется поддержка на следующем уровне, называемом гипервизор. Гипервизор (или VMM) служит как некая абстракция между аппаратной платформой и операционной системой. В некоторых случаях гипервизор является операционной системой; в этом случае он называется базовая операционная система, как показано на Рисунке 1.

Рисунок 1. Уровневая модель виртуализации
Уровневая модель виртуализации

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

Поддержка виртуализации процессором

Преимущества виртуализационной платформы настолько велики, что производители процессоров внесли изменения в кристалл, чтобы непосредственно поддерживать виртуализацию. Это позволяет процессору поддерживать гипервизор напрямую – иначе чем гостевую операционную систему. Вдобавок к состоянию процессора (регистры и т.д.), которые управляются по-разному для VMM и VM, процессор поддерживает виртуализацию ввода/вывода и прерываний. За дополнительной информацией обратитесь к Ресурсам.

Сегодня проблема осуществления виртуализации состоит в том, что не вся аппаратура правильно поддерживает виртуализацию. Более старые x86 процессоры выдают разные результаты для определенных команд в зависимости от домена исполнения. Это создает проблему, так как гипервизор должен работать только в наиболее защищенном домене. По этой причине такие решения виртуализации как VMware предварительно сканируют код, который следует выполнять, для того чтобы заменить существующие команды ловушками, с тем чтобы гипервизор мог выполнять их надлежащим образом. Xen, поддерживающий кооперативный метод виртуализации, не требует модификаций, поскольку гостевая система осведомлена о том, что она работает виртуально и соответствующим образом модифицирована. KVM просто игнорирует эту проблему и постулирует, что если вы хотите виртуализации, то вы должны работать на новейшем оборудовании.

Поначалу это кажется слегка неуклюжим, но, принимая во внимание то, что новейшие современные машины (такие как Intel® VT и AMD SVM) поддерживают виртуализацию, не так уж долго осталось ждать того времени, когда это будет нормой, а не исключением. За дополнительной информацией о процессорах, которые поддерживают виртуализацию, обратитесь к Ресурсам и вставке Поддержка виртуализации процессором.


Гипервизор KVM

Принимая во внимание временную шкалу виртуализационной техники, KVM можно считать относительной новинкой. В настоящее время существуют некоторые действующие open source методы, такие как Xen, Bochs, UML, Linux-VServer и coLinux, но KVM получил удивительно широкое освещение в прессе. Далее, KVM в действительности сам по себе не является полной виртуализационной схемой, но представляет собой кусок более крупного технического решения.

Подход, который использует KVM, состоит в том, чтобы превратить ядро Linux в гипервизор простой загрузкой модуля ядра. Модуль ядра экспортирует устройство, называемое /dev/kvm, которое делает возможным гостевой режим ядра (вдобавок к обычным режимам ядра и пользователей). С dev/kvm VM имеет свое собственное адресное пространство, отдельное от адресного пространства ядра или любых других работающих VM. Устройства в дереве устройств (/dev) являются общими для всех пользовательских процессов. Но /dev/kvm отличается тем, что каждый процесс, который его открывает, видит другую карту (для поддержания изоляции виртуальных машин).

Исходники KVM в ядре Linux

Вы можете найти исходники KVM в ./linux/drivers/kvm (в V2.6.20 и последующих). Эта директория содержит исходные файлы для KVM, а также файлы поддержки процессора для расширений Intel и AMD.

KVM просто превращает ядро Linux в гипервизор (когда вы инсталлируете модуль ядра kvm). Так как гипервизор является стандартным ядром Linux, он получает преимущества от изменений в стандартном ядре (поддержка памяти, планировщик и т.д.). Оптимизация этих компонент Linux (таких как новый O(1) планировщик в ядре 2.6) дает преимущества как гипервизору (базовая операционная система), так и гостевой операционной системе Linux. Но KVM – не первая машина, которая делает это. UML уже ранее трансформировал ядро Linux в гипервизор. С ядром, работающим как гипервизор, вы можете затем запускать другие операционные системы, такие как другие ядра Linux или Windows.


KVM

Когда KVM инсталлирован, вы можете запустить операционную систему в пространстве пользователей. Каждая гостевая операционная система представляет собой отдельный процесс базовой операционной системы (или гипервизора). Рисунок 2 показывает схему виртуализации с KVM. В основе лежит аппаратная платформа, которая способна к виртуализации (в настоящее время это Intel VT или AMD-SVM процессор). На «голой» аппаратуре работает гипервизор (ядро Linux с модулем KVM). Этот гипервизор выглядит точно также как стандартное ядро Linux, на котором вы можете запускать другие приложения. Но это ядро может также поддерживать гостевые операционные системы, загруженные с помощью утилиты kvm. В конечном счете гостевая операционная система может поддерживать те же самые приложения, что и базовая операционная система.

Рисунок 2. Компоненты виртуализации с KVM
Компоненты виртуализации с KVM

Вспомним, что KVM представляет собой часть решения проблемы виртуализации. Процессор поддерживает виртуализацию (способность виртуализировать процессор для множества операционных систем). Память виртуализируется с помощью kvm (который будет обсуждаться в следующем разделе). И наконец, система ввода/вывода виртуализируется с помощью слегка модифицированного процесса QEMU (копия которого выполняется с каждым процессом гостевой операционной системы).

KVM вводит новый режим процессов в Linux в существующее ядро и пользовательские режимы. Новый режим называется guest и, как подсказывает его имя, используется для выполнения кодов гостевой операционной системы (или, по крайней мере, некоторых из них). Вспомним, что режим ядра представляет собой привилегированный режим выполнения кодов, в то время как пользовательский режим не является привилегированным (программы, работающие вне ядра). Поэтому режимы выполнения определяются для различных целей, в зависимости от того, что выполняется и с какой целью. Режим guest существует для выполнения кодов гостевой операционной системы, но только для кодов, которые не являются вводом/выводом. В рамках режима guest существуют два стандартных режима, для того чтобы гостевая операционная система работала в режиме guest, но поддерживала стандартные режимы: режим ядра и пользовательский режим, для своего ядра и приложений пространства пользователей. Пользовательский режим гостевой операционной системы существует для того, чтобы выполнять операции ввода/вывода, которые управляются независимо.

Выполнение операции ввода/вывода с гостевой операционной системы обеспечивается QEMU. QEMU – это виртуализационная платформа, которая позволяет виртуализировать все оборудование PC (включая диски, графические адаптеры, сетевые устройства). Любые запросы ввода/вывода, которые делает гостевая операционная система, перехватываются и направляются в пользовательский режим для эмулирования с помощью процесса QEMU.

KVM обеспечивает виртуализацию памяти с помощью /dev/kvm. Каждая гостевая операционная система имеет свое собственное адресное пространство, которое устанавливается, когда создается гостевая система. Физическая память, которая назначается для гостевой операционной системы, является в действительности виртуальной памятью процесса. Набор теневых таблиц поддерживается для преобразования с гостевых физических адресов в реальные физические адреса. Процессор также поддерживает процесс преобразования памяти, передавая управление гипервизору (базовому ядру), когда имеется обращение к не распределенному адресу памяти.


Инсталляция новой гостевой системы

Инсталляция новой гостевой операционной системы обеспечивается утилитой, называемой kvm. Эта утилита работает с модулем kvm, используя /dev/kvm для загрузки гостевой системы, объединяет ее с виртуальным диском (обычный файл базовой операционной системы) и затем загружает ее.

Контроль обеспечивается набором ioctl-вызовов, которые работают с устройством /dev/kvm. Когда файл устройства открывается впервые, создается новый VM объект, который ассоциируется с виртуальным процессором. После этого вы можете использовать ряд ioctl-вызовов для создания виртуального CPU, проверки версии kvm, создания области памяти и затем запуска виртуального CPU. Вы это делаете, используя команду kvm. Я рассмотрю команду kvm и дам примеры некоторых поддерживаемых вызовов в следующем разделе.


Использование KVM

Использовать KVM в действительности очень просто, если ваша аппаратура ее поддерживает. Вам нужен процессор, который поддерживает виртуализацию: вы можете узнать, поддерживает ли ваша система виртуализацию, посмотрев в /proc/cpuinfo. Этот файл указывает, поддерживаются ли расширения vmx (Intel) или svm (AMD).

Далее вам необходимо ядро Linux с включенной поддержкой KVM. Вы можете это сделать в конфигурации ядра с помощью Device Drivers > Virtualization. Вы также должны включить поддержку процессора для вашего оборудования. У вас должны быть приложения kvm и qemu. За дополнительной информацией обратитесь к Ресурсам.

После того как у вас есть загруженное ядро с включенной поддержкой виртуализации, следующим шагом будет создание образа диска для гостевой операционной системы. Сделайте это, используя qeumu-img, как показано ниже. Обратите внимание на то, что размер образа 4 ГБ, но при использовании copy-on-write формата QEMU (qcow), файл будет увеличиваться настолько, насколько необходимо, вместо того чтобы занимать все 4 ГБ.

$ qemu-img create -f qcow vm-disk.img 4G

После создания виртуального диска загрузите на него гостевую операционную систему. В следующем примере предполагается, что гостевая операционная система находится на CD-ROM. Кроме создания виртуального диска c ISO-образом CD-ROM, вы должны загрузить этот образ, после того как он сделан.

$ kvm -no-acpi -m 384 -cdrom guestos.iso -hda vm-disk.img -boot d

Ари Кивити написал ряд тестовых программ для тестирования KVM, для которых не требуется полная модель устройства. Следующий фрагмент кода (from kvm-12/user/main.c) дает высокоуровневый обзор запуска VM (смотрите Листинг 1). Контроль обеспечивается через ioctl ядра (в частности, в файле./linux-2.6.20/drivers/kvm/kvm_main.c).

Вызов kvm_init открывает устройство /dev/kvm, проверяет номера версий (экспортированные модулем ядра KVM), затем размещает контекстные объекты KVM и замещает некоторые функции внешнего вызова. Функция kvm_create устанавливает и отображает две области памяти и затем создает виртуальный CPU (VCPU) с ioctl (KVM_CREATE_VCPU).

Затем функция load_file загружает образ в адресное пространство для данной VM, которая потом запускается вызовом kvm_run (используя ioctl KVM_RUN). Этот простой процесс иллюстрирует, как вы можете запустить новую гостевую операционную систему с помощью KVM.

Листинг 1. Фрагмент приложения для тестирования KVM гипервизора
int main()
{
	void *vm_mem;

	kvm = kvm_init(&test_callbacks, 0);
	if (!kvm) {
	    fprintf(stderr, "kvm_init failed\n");
	    return 1;
	}
	if (kvm_create(kvm, 128 * 1024 * 1024, &vm_mem) < 0) {
	    kvm_finalize(kvm);
	    fprintf(stderr, "kvm_create failed\n");
	    return 1;
	}
	if (ac > 1)
	    if (strcmp(av[1], "-32") != 0)
		load_file(vm_mem + 0xf0000, av[1]);
	    else
		enter_32(kvm);
	if (ac > 2)
	    load_file(vm_mem + 0x100000, av[2]);
	kvm_show_regs(kvm, 0);

	kvm_run(kvm, 0);

	return 0;
}

Резюме

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

Другое преимущество KVM состоит в том, что поскольку она сама является частью ядра, она может воспользоваться преимуществами от развития и оптимизации ядра. Это свидетельствует о перспективности этого подхода по сравнению с другими независимыми реализациями гипервизора. Два основных недостатка KVM состоят в том, что она требует новейших способных к виртуализации процессоров и запуска процесса QEMU в пользовательском пространстве для обеспечения виртуализации ввода/вывода. Но так или иначе KVM уже в ядре, что является огромным скачком вперед по сравнению с существующими решениями.

Ресурсы

Научиться

  • Оригинал этой статьи на developerWorks.
  • Существует множество способов осуществления виртуализации, и вы можете узнать больше из статьи "Виртуальный Linux" .
  • Некоторые компании, включая IBM, Intel и AMD, создают аппаратуру для виртуализации. Вы можете посмотреть их сайты для получения дополнительной информации.
  • Для получения последних новостей о KVM обратитесь к KVM wiki, который предоставляется Qumranet.
  • Несмотря на то, что KVM появилась совсем недавно, вы можете найти несколько статей, в которых исследуется ее производительность в разных областях. Две интересные статьи предоставлены Phoronix и KernelNewbies.
  • Еще одна интересная статья в KernelNewbies производит сравнение методов виртуализации (включая KVM).
  • Планировщик V2.6 Linux был создан Инго Молнаром (Ingo Molnar), чтобы добиться O(1) диспетчеризации. Вы можете прочитать об этом планировщике в статье "Внутри планировщика Linux (Inside the Linux scheduler)" .
  • Метод кооперативной виртуализации coLinux позволит вам запускать Linux под Windows.
  • QEMU представляет собой open source-эмулятор процессора, который обеспечивает возможности виртуализации оборудования PC для KVM.
  • В разделе Linux сайта developerWorks найдите больше ресурсов для разработчиков Linux.
  • Семинары и обучение на developerWorks Россия.

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=232111
ArticleTitle=Узнайте о виртуальной машине ядра Linux (KVM)
publish-date=06202007