Статья Анатомия Linux-гипервизора

4080

В последнее время я все активнее пользуюсь виртуализацией. В частности я полностью перестал тестировать новые дистрибутивы на реальном железе. То есть я не бью новых разделов на винте, не устраиваю мельницы из файловых систем, не морочусь с настройкой GRUB, — а просто запускаю Virtual Box, и устанавливаю любую систему на виртуальный диск, как гостевую.

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

Оригинал: «Anatomy of a Linux hypervisor»
Автор: M. Tim Jones
Дата публикации: 31 May 2009
Перевод: Н.Ромоданов
Дата перевода: 10 марта 2010 г.

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

Гипервизоры дают операционным системам примерно то же самое, что операционные системы дают процессам. С их помощью предоставляются виртуальные аппаратные вычислительные платформы, создающие иллюзию полного доступа к лежащей под ними машине (реально существующим аппаратным средствам — прим.пер.). Но не все гипервизоры одинаковы, что, конечно, хорошо, поскольку речь идет о гибкости и возможности выбора в системе Linux. Настоящая статья начинается с краткого введения в понятия виртуализации и гипервизора, а затем изучается пара гипервизоров, базирующихся на Linux.

Виртуализация и гипервизоры

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

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

Рис.1. Простая многослойная архитектура виртуализации аппаратного обеспечения

Преимуществ у платформенной виртуализации много. Но стоит обратить внимание на один интересный факт, полученный в результате статистического анализа, проведенного агентством защиты окружающей среды U.S. Environmental Protection Agency (EPA). В исследованиях EPA, касающихся эффективности использования ресурсов в серверах и центрах обработки данных, было обнаружено, что фактически используется приблизительно только 5% мощности серверов. Все остальное время сервер неактивен. Виртуализированные платформы на одном сервере могут повысить степень использования сервера, но есть еще преимущества от уменьшения количества серверов. При уменьшении количества серверов уменьшается потребность в размерах помещения, уменьшается потребление электропитания, охлаждения (меньше энергетических затрат) и затраты на управление. Чем меньше аппаратуры, тем меньше шансов, что она выйдет из строя. В целом платформенная виртуализация дает не только преимущества технического характера, но также снижает затраты и уменьшает потребление электроэнергии.

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

Классификация гипервизоров

Гипервизоры можно разделить на два различных типа. Первый, гипервизоры типа 1, это те, которые изначально работают на голом аппаратном обеспечении. Вторые, типа 2, это те гипервизоры, которые работают в контексте другой операционной системы (которая работает на голом аппаратном обеспечении). К примерам гипервизора типа 1 относится виртуальная машина на базе ядра Linux – KVM (гипервизор, базирующийся на своей собственной операционной системе). К примерам гипервизоров типа 2 относятся QEMU и WINE.

Элементы гипервизора

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

С самой общей точки зрения гипервизору требуется немного для того, чтобы загрузить гостевую операционную систему: образ ядра, которое загружается, конфигурация (например, IP-адреса и количество используемой памяти), диск и сетевое устройство. Диски и сетевое устройство обычно отображаются на физический диск и сетевое устройство компьютера (как показано на рис.2). Наконец, требуется набор инструментальных средств для гостевых систем, с помощью которых гостевая система запускается и осуществляется ее управление.

Рис.2. Минимальная схема отображения ресурсов в гипотетическом гипервизоре

Затем в упрощенной архитектуре гипервизора создается связующая среда, которая позволяет гостевой операционной системе работать одновременно с основной (хостовой) операционной системой. Для этой функциональности требуется несколько конкретных элементов, которые изображены на рис.3. Во-первых, подобно системным вызовам, с помощью которых создается мостик между приложениями, работающими в пользовательском пространстве, и функциями ядра, создается слой гипервызовов, который обычно обеспечивает поступление запросов из гостевой системы в основную операционную систему. Ввод/вывод (I / O) можно виртуализировать в ядре, либо в гостевую систему нужно добавить код доступа к вводу/выводу. Прерывания должны обрабатываться исключительно гипервизором, который имеет дело с реальными прерываниями и будет осуществлять передачу прерываний виртуальных устройств в гостевую операционную систему. Гипервизор должен также отлавливать и обрабатывать исключительные состояния, которые возникают в гостевой системе. (В конце концов, ошибки в гостевой системе должны приводить к остановке этой гостевой системы, а не гипервизора или других гостевых систем). Основным элементом гипервизора является механизм отображения страниц памяти (page mapper), который указывает аппаратуре на страницы, где расположена конкретная операционная система (гостевая или гипервизор). Наконец, необходим высокоуровневый планировщик, с помощью которого будет осуществляться передача управления между гипервизором и гостевыми операционными системами (и обратно).

Рис.3. Упрощенная схема гипервизора на базе Linux

Гипервизоры Linux

В настоящей статье будут изучены два варианта гипервизоров на основе Linux. Первый, KVM, был первым модулем-гипервизором, который был интегрирован в ядро Linux и который реализует полную виртуализацию, а второй, Lguest, является экспериментальным гипервизором, в котором реализована паравиртаулизация, требующая, на удивление, очень небольших изменений.

KVM

KVM является инфраструктурой, реализующей виртуализацию для платформы x86 на базе ядра Linux. KVM был первым гипервизором, который стал частью нативного ядра Linux (2.6.20), он был разработан и поддерживается Ави Кивити (Avi Kivity) в рамках стартапа Qumranet, владельцем которого в настоящее время является фирма Red Hat

В этом гипервизоре поддерживается виртуализация платформы x86, в процессе разработки порты для платформ PowerPC® и IA64. Кроме того, совсем недавно в KVM была добавлена поддержка симметричной мультипроцессорной обработки (SMP) в основных (и гостевых) операционных системах и поддержка таких возможностей уровня предприятия (уровня enterprise), как горячая миграция сервера (что позволяет переносить гостевые операционные системы с одного физического сервера на другой).

KVM реализован как модуль ядра, что позволяет сделать Linux гипервизором просто загрузив для этого модуль. KVM обеспечивает полную виртуализацию на аппаратных платформах, на которых поддерживается исполнение инструкций гипервизора (напрмер, Intel® Virtualization Technology [Intel VT] или в AMD Virtualization [AMD-V]). В KVM также поддерживается паравиртуализация гостевых систем, в том числе Linux и Windows®.

Эта технология реализована в виде двух компонентов. Первым является загружаемый модуль KVM, который, когда он установлен в ядре Linux, обеспечивает управление виртуальным аппаратным обеспечением; эта возможность показана в файловой системе /proc (смотрите рис.4). Второй компонент предназначен для эмуляции платформы PC, что обеспечивается модифицированной версией эмулятора QEMU. Эмулятор QEMU выполняется как процесс в пользовательском пространстве и согласовывает с ядром запросы гостевой операционной системы.

Рис.4. Общая схема гипервизора KVM

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

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

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

Lguest (бывший lhype)

В гипервизоре Lguest, разработанном Расти Расселом (Rusty Russell) из подразделения IBM в Австралии, реализован совсем другой подход к виртуализации. Вместо поддержки полной виртуализации для запуска любых операционных систем, в Lguest предлагается легковесная паравиртуализация для гостевых систем Linux с архитектурой x86, в которых есть модуль Lguest (иначе называемой виртуализацией Linux-на-Linux). Это означает, что гостевым операционным системам известно, что они виртулизированы, и это ведет к повышению производительности. Тем не менее Lguest обеспечивает приемлемую производительность и без использования QEMU, который нужен для платформенной виртуализации (как в случае с KVM). Подход с использованием Lguest также снижает общие требования к коду — в гостевой и в основной системах нужен лишь тонкий дополнительный слой. Давайте теперь рассмотрим эти различия и изучим общую структуру среды Lguest.

Как видно на рис.5, гостевая операционная система включает в себя тонкий слой кода Lguest (согласно определению — паравиртуализацию). В нем реализованы несколько сервисов. На самом высоком уровне, есть код, который определяет, будет ли загруженное ядро виртуализировано. Есть также абстрактный слой (реализованный через paravirt_ops), который при помощи гипервызовов перенаправляет привилегированные операции в основную операционную систему. Например, гостевая система не может отключать прерывания, поэтому эти запросы обрабатываются в основной (хостовой) операционной системе. Здесь также можно обнаружить шину, в которой реализованы абстрактные устройства для гостевых систем, а также набор простых драйверов, реализующих консоль, виртуальный драйвер поблочного доступа и виртуальный драйвер сети (через который осуществляется связь с другими гостевыми системами).

Рис.5. Рассматриваем, как в Lguest реализована паравиртуализация архитектуры x86

Что касается самого ядра, то здесь реализован загружаемый модуль, называемый lg.ko. В этом модуле содержится интерфейс гостевых операционных систем с ядром основной (хостовой) системы. Первый элемент — переключатель, с помощью которого реализовано контекстное переключение гостевой операционной системы во время ее исполнения. В этом же модуле также реализована файловая система /proc (для /dev/lguest), где реализован интерфейс пользовательского пространства к ядру и драйверам, включая и гипервызовы. Есть код, с помощью которого осуществляется отображение памяти, — для этого используется страничная организация памяти и управление сегментацией архитектуры x86.

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

Модуль Lguest был добавлен в основное ядро с версии 2.6.23 (октябрь 2007 г.), он разработан и поддерживается Расти Расселом (Rusty Russell). Модуль содержит примерно 5000 строк кода, в том числе утилиты пользовательского пространства. Хотя (как говорят) код простой, Lguest обеспечивает истинную паравиртуализацию. Однако из-за этой простоты возникают некоторые ограничения. Например, Lguest виртуализирует только те гостевые операционные системы, в которых имеется Lguest, и только для архитектуры x86. Но даже с учетом этих ограничений, в Lguest предлагается интересный подход к виртуализации, который доступен любому, кто хочет изучить код, созданный Расти Расселом.

Преимущества гипервизоров Linux

Разработка гипервизоров, использующих Linux в качестве основы, имеет реальные и ощутимые преимущества. Совершенно очевидно, что если гипервизор базируется на Linux, то он выигрывает от непрерывного развития Linux и от того большого объема работы, который выполняется для Linux. Linux является платформой, которая непрерывно совершенствуется: от обычной оптимизации и исправления ошибок, нововведений по планированию и управлению памятью и до поддержки архитектур различных процессоров (цитируя Джона Солсбери «стоя на плечах гигантов» — John of Salisbury «standing on the shoulders of giants»).

С помощью KVM не так давно было показано, что если добавить модуль ядра, ядро Linux можно преобразовать в гипервизор. Гипервизор Lguest идет еще на один шаг вперед, и с учетом ограничений, связанных с паравиртуализацией, еще больше упрощает решение.

Еще одно преимущество от использования Linux в качестве платформы в том, что в дополнение к гипервизору можно также пользоваться возможностями самой системы. Таким образом в добавок к нескольким гостевым операционным системам, работающим под Linux гипервизором, вы можете в той же самой среде запускать другие обычные приложения. Так что вместо волнений, касающихся новой платформы с новыми интерфейсами программирования прикладного программного обеспечения (API), вы имеете для разработки программного обеспечения свою стандартную платформу Linux (если необходимо приложение, осуществляющее мониторинг или управляющее гипервизором). Бок о бок с гостевыми системами также имеются стандартные протоколы (TCP/IP) и другие полезные приложения (веб сервера). Вспомните рис.4 из обсуждения KVM: дополнительно к гостевым операционным системам есть также QEMU, модифицированный для KVM. Это стандартный процесс и он иллюстрирует мощность Linux, когда последний используется как гипервизор. KVM использует QEMU для платформенной виртуализации, а с Linux в качестве гипервизора сразу же появляется возможность запускать гостевые операционные системы во взаимодействии с другими приложениями Linux.

Заключение

С появлением разработок, связанных с гипервизорами, ясно одно: гипервизор — это новое поле боя. Тридцать лет назад, все внимание фокусировалось на операционной системе, которая доминировала среди небольшого количества разработок. Сегодня это поле боя сдвинулось в сторону гипервизоров и ясно, какую роль здесь играет Linux.

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