Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Виртуализация и эмуляция в Linux

Анатомия библиотеки виртуализации libvirt

Оригинал: "Anatomy of the libvirt virtualization library"
Автор: M. Tim Jones
Дата публикации: 05 Jan 2010
Перевод: Н.Ромоданов
Дата перевода: 12 марта 2010 г.

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

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

Базовая архитектура

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

Основные компоненты библиотеки libvirt

Рис. 1. Основные компоненты и модель использования библиотеки libvirt

На рисунке также показаны основные компоненты, с которыми оперируют при использовании библиотеки libvirt. Названия компонентов важны, поскольку они используются в самом API. Есть две принципиальные особенности в том, что в библиотеке libvirt физический хост называется узлом, а гостевая операционная система называется доменом. Отметим здесь, что библиотека libvirt (и ее приложения) работает в домене хостовой операционной системы Linux (домен 0).

Механизм управления

В библиотеке libvirt есть два разных механизма управления. Первый показан на рис. 1, где управляющее приложение и домены размещены на одном и том же узле. В этом случае, управляющее приложение работает через libvirt, которое управляет локальными доменами. В случае, если управляющее приложение и домены расположены на разных узлах, то используется другой механизм управления. В этом случае требуется подключение к удаленному узлу (см. рис. 2). В этом режиме используется специальный демон, называемый libvirtd, который работает на удаленных узлах. Этот демон запускается автоматически, когда на новом узле устанавливается библиотека libvirt, и он автоматически определяет, какие локальные гипервизоры используются, и настраивает под них драйвера (чуть позже рассмотрим это подробнее). Управляющее приложение взаимодействует через локальный экземпляр libvirt с удаленным экземпляром libvirt с использованием специального протокола. Если используется QEMU, управление, в конце концов, достигает монитора QEMU. В составе QEMU есть консоль монитора, которая позволит вам просматривать, как работает гостевая операционная система, а также контролировать различные характеристики виртуальной машины (VM).

Дистанционное управление гипервизорами с помощью libvirtd

Рис.2. Дистанционное управление гипервизорами с помощью libvirtd

Поддержка гипервизоров

Для того, чтобы в libvirt можно было поддерживать широкий спектр гипервизоров, была реализована архитектура, базирующаяся на использовании драйверов, которая позволяет обычным API в обычном режиме обслуживать большое количество гипервизоров. Это означает, что через API недоступна (невидима и не влияет на работу — прим.пер.) определенная функциональность, касающаяся некоторых гипервизоров. Кроме того, в некоторых гипервизорах не всегда удается реализовывать все функции API, которые внутри конкретного драйвера отмечаются как не поддерживаемые. На рис.3 показана послойная архитектура libvirt API и подключенные драйвера. Отметим также, что в libvirtd реализован механизм доступа к локальным доменам из удаленных приложений.

Архитектура libvirt, базирующаяся на использовании драйверов

Рис.3. Архитектура libvirt, базирующаяся на использовании драйверов

На момент написания статьи в libvirt реализованы драйвера для гипервизоров, перечисленных в таблице 1. Как только сообщество open source создаст новые новые гипервизоры, то, несомненно, станут доступными и другие драйвера.

Гипервизор

Описание

Xen

Гипервизоры для архитектур IA-32, IA-64 и PowerPC 970

QEMU

Эмулятор платформы для различных архитектур

Виртуальная машина на базе ядра Linux (KVM)

Эмулятор платформы Linux

Контейнеры Linux (LXC)

(Легковесные) контейнеры Linux для виртуализации операционных систем

OpenVZ

Виртуализации уровня операционных систем, базирующаяся на ядре Linux

VirtualBox

Гипервизор для виртуализации платформы x86

Пользовательский режим Linux (User Mode Linux)

Эмулятор платформы Linux для различных архитектур

Тест (Test)

Тест-драйвер для фиктивного гипервизора

Память (Storage)

Драйвера пулов памяти (локальный диск, сетевой диск, том iSCSI)

Libvirt и виртуальная оболочка

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

Первый шаг - создание конфигурационного файла домена (это показано ниже в листинге 1). В этом файле определяются все параметры, необходимые для создания домена: от гипервизора (эмулятора) и до ресурсов, которые используются в домене, а также задается конфигурация периферии (например, сеть). Заметим, что это очень простой пример конфигурации: атрибуты, которые используются на практике и поддерживаются в libvirt, гораздо разнообразнее. Например, вы можете указать BIOS и загрузчик хостовой системы, определить ресурсы, которые будут использоваться доменом, а также перечислить используемые устройства — от флоппи-дисков и устройств CD-ROM и до устройств USB и PCI.

В конфигурационном файле домена определяются некоторые базовые метаданные, которые будут использоваться для данного домена QEMU, в том числе имя домена, максимальный и первоначально доступный (текущий) объем памяти, а также число виртуальных процессоров, которые будут доступны этому домену. Вам не нужно назначать глобальный уникальный идентификатор (UUID), позвольте это сделать libvirt. Вы определяете тип машины, которая эмулируется для этой платформы — в нашем случае это процессор 686, который является полностью виртуальным (hvm). Вы определяете, где должен находиться эмулятор (в случае, если нужно поддерживать несколько однотипных эмуляторов) и виртуальный диск для домена. Отметьте, что вы указываете виртуальную машину, которая является операционной системой ReactOS в формате Virtual Machine Disk (VMDK). Наконец, можно указать конфигурацию сети, используемую по умолчанию, и то, что используется графическая оболочка Virtual Network Computing (VNC).

Листинг 1. Конфигурационный файл домена

Теперь, когда конфигурационный файл домена создан, давайте запустим домен с помощью инструментального средства virsh. Конкретные действия, которые должны быть выполнены, указываются с помощью аргументов команды virsh. В случае запуска нового домена вы используете команду create и указываете конфигурационный файл домена:

Листинг 2. Запуск нового домена

Заметьте, что здесь для подключения к домену (qemu:///system) используется универсальный индикатор ресурсов (URI). Этот локальный URI подключает локальный драйвер QEMU к демону, работающему в системном режиме. Для того, чтобы через безопасный протокол (SSH) подключится к удаленному гипервизору QEMU, работающему на хосте shinchan, вы можете использовать следующий универсальный индикатор ресурсов: qemu+ssh://shinchan/.

Далее с помощью команды list, имеющейся в virsh, вы можете просмотреть список активных доменов на данном хосте. Вы получите список активных доменов, идентификаторы этих доменов и статус доменов, например, так, как показано ниже:

Листинг 3. Список активных доменов

Обратите внимание, что имя, указанное здесь, является именем, которое вы указали в метаданных конфигурационного файла домена. Вы видите, что идентификатор этого домена ID равен 1 и в настоящее время домен работает.

Вы также можете с помощью команды suspend приостановить работу домена. Эта команда останавливает домен, но он остается загруженным в память и его работу можно легко возобновить. В следующем примере иллюстрируется приостановка домена, просмотр его состояния, а затем перезапуск домена:

Листинг 4. Приостановка домена, проверка его статуса и повторный запуск

В утилите virsh также поддерживается ряд других команд, таких как сохранение домена (save), восстановление сохраненного домена (restore), перезагрузка домена (reboot) и много других. Вы также можете создавать конфигурационные файлы для уже работающих доменов (dumpxml).

Итак, вы запустили домен и стали выполнять действия над ним. Но как относительно того, чтобы подключиться к нему и увидеть домен в действии. Вы можете это сделать с помощью VNC. Для того, чтобы создать окно, представляющее собой графический рабочий стол конкретного домена, вы можете воспользоваться VNC следующим образом:

Листинг 5. Подключение к домену

Libvirt и Python

В предыдущем примере проиллюстрировано управление доменами с помощью утилиты virsh, работающей из командной строки. Теперь давайте рассмотрим пример управления доменом с помощью языка Python. Python является скриптовым языком, который позволяет работать библиотекой libvirt и обеспечивает ясный объектно-ориентированный интерфейс к libvirt API.

В этом примере показаны некоторые из тех операций, которые были продемонстрированы с помощью утилиты virsh (list, suspend, resume и т.п.). В листинге 6 показан пример сценария на языке Python. В этом примере вы сначала импортируете модуль libvirt. Затем вы подключаетесь к локальному гипервизору QEMU. Далее перебираете идентификаторы имеющихся доменов и для каждого из них создаете доменный объект, после чего приостанавливаете работу домена, затем возобновляете его работу, а затем, наконец, уничтожаете домен.

Листинг 6. Пример скрипта на языке Python для управления доменом (libvtest.py)

Хотя это и простой пример, в нем видна вся мощь управления, которую можно достичь от библиотеки libvirt с помощью языка Python. При помощи простого скрипта вы можете просмотреть все локальные домены QEMU, получить некоторую информацию о каждом домене, а затем выполнить действия над каждым из доменов. Результат выдачи этого скрипта показан в листинге 7.

Листинг 7. Выходные данные скрипта на языке Python, приведенного на листинге 6

Обзор API

С самой общей точки зрения libvirt API состоит из пяти различных API: API для связи с гипервизором, доменное API, сетевое API, API для работы с томами памяти и, наконец, API для работы с пулами хранения данных.

Все взаимодействие с libvirt происходит после того, как для данного гипервизора создается соединение (например, как показано для вызова open в листинге 6). Благодаря соединению обеспечивается путь ко всем другим необходимым API. В API для языка C эта функциональность реализована с помощью вызова virConnectOpen (и через другие вызовы, обеспечивающие аутентификацию). В результате вызова этих функций создается объект virConnectPtr, используемый для соединения с гипервизором. Этот объект используется в качестве базового для всех других управляющих функций, и поэтому он присутствует в качестве аргумента во всех последующих вызовах API для данного гипервизора. Объект virConnectGetCapabilities содержит всю информацию о взаимодействии гипервизора и драйвера, а в объекте virNodeGetInfo находится информация, описывающая узел. Эта информация представлена в виде документа XML, анализ которого позволяет понять, какие действия допустимы.

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

В API реализовано большое количество функций, предназначенных для работы с доменами. Для доступа к домену и управления им вам сначала потребуется объект VirDomainPtr. Вы можете получить этот объект-указатель несколькими способами (по идентификатору ID, по UUID или по имени домена). Если снова обратиться к примеру исследования домена, то можно воспользоваться списком индексов, который возвращается в этом примере, а затем обратиться к объекту virDomainLookupByID с тем, чтобы получить указатель на домен. Когда у вас будет указатель на домен, вы сможете выполнять большое количество действий, начиная с получения информации о домене (virDomainGetUUID, virDomainGetInfo, virDomainGetXMLDesc, virDomainMemoryPeek) и до управления доменом (virDomainCreate, virDomainSuspend, virDomainResume, virDomainDestroy и virDomainMigrate).

Вы также можете использовать API для управления и инспектирования виртуальных сетей и ресурсов хранения данных. В соответствие с моделью API управление и инспектирование виртуальных сетей требует использование объекта virNetworkPtr, а управление ресурсами требует использование объекта virStoragePoolPtr (пул хранения данных) или объекта virStorageVolPtr (том).

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

Привязка к языкам

Библиотека libvirt была реализована на языке C (с поддержкой C++) и включает в себя прямую поддержку языка Python. Однако также есть привязка к ряду языков. Привязка была реализована для языков Ruby, Java ™, Perl и OCaml. Также была проведена работа для вызовов библиотеки libvirt из языка C#. В библиотеке libvirt поддерживаются самые популярные языки системного программирования (С и C++), различные скриптовые языки и даже унифицированный функциональный язык (Objective caml). Поэтому, независимо от того, на каком языке вы сосредоточились, библиотека libvirt предоставит вам возможность управлять вашими доменами.

Приложения, использующие libvirt

Уже из того небольшого количества возможностей, которое представлено в этой статье, видно, насколько большими возможностями обладает библиотека libvirt. И, как следовало ожидать, есть ряд приложений, которые успешно разработаны на базе libvirt. Одним из интересных приложений является virsh (см. описание выше), которое представляет собой shell оболочку, используемую при виртуализации. Есть также приложение virt-install, которое можно использовать для создания новых доменов из дистрибутивов операционных систем. Утилиту virt-clone можно использовать для клонирования VM из другой VM (выполняется репликация как операционной системы, так и диска). К числу высокоуровневых приложений относится приложение virt-manager, которое представляет инструментальное средство общего назначения, предназначенное для управления настольными рабочими станциями, а также приложение virt-viewer , которое представляет собой легковесное инструментальное средство, предназначенное для безопасного подключения к графическим консолям виртуальных машин.

Одним из наиболее важных инструментальных средств, созданных на базе libvirt, является приложение oVirt. Приложение для управления виртуальными машинами oVirt может обслуживать как одну виртуальную машину на отдельно взятом узле, так и тысячи виртуальных машин, расположенных на сотнях хостов. Кроме помощи в управлении большим количеством хостов и виртуальных машин, приложение можно использовать для автоматизации кластеризации и балансировки нагрузки, причем это можно делать для разных платформ и разных архитектур.

Двигаемся дальше

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


Ссылки на источники смотрите в оригинале статьи.