Библиотека сайта rus-linux.net
Виртуальный LinuxОбзор методов виртуализации, архитектур и реализаций M. Tim Jones (mtj@mtjones.com), Consultant Engineer, Emulex, 29 Dec.2006.
( Источник)
Под "виртуализацией" разные люди понимают разные вещи. В настоящее время этим термином чаще всего обозначают виртуализацию серверов, то есть размещение (хостинг) нескольких независимых операционных систем на одном физическом компьютере (хосте). В настоящей статье рассматриваются основные идеи, скрывающиеся за термином "виртуализация", а затем обсуждаются некоторые из возможных путей или способов реализации этих идей. Мы здесь рассмотрим также и другие технологии виртуализации, такие как виртуализация операционной системы в Linux. Виртуализировать означает сделать так, чтобы одна вещь представлялась как другая (или казалась другой вещью). Виртуализация компьютера означает, что он представляется как много компьютеров или как совершенно другой компьютер. Виртуализация также может означать, что некоторая совокупность компьютеров представляется как единый компьютер. Обычно это явление называют агрегацией серверов или распределенными вычислениями (grid computing). Давайте начнем с возникновения виртуализации. Виртуализация - это далеко не новое явление: фактически ей уже более четырех десятков лет. Самые первые применения виртуализации имели место в компьютерах IBM® 7044, в системе разделения времени (the Compatible Time Sharing System - CTSS), разработанной в Массачусетском технологическом институте для IBM 704 и в проекте Atlas Манчестерского университете (один из первых в мире суперкомпьютеров), в котором впервые были применены выделение страниц по требованию и вызовы супервизора (which pioneered demand paging and supervisor calls). IBM осознала важность виртуализации в 1960-х годах во время разработки компьютера System/360(TM) Model 67. Этот компьютер виртуализировал все аппаратные интерфейсы посредством монитора виртуальных машин VMM (the Virtual Machine Monitor). В начале компьютерной эры операционные системы называли супервизорами (supervisor). После реализации возможности запускать одну операционную систему в другой операционной системе появился (в 1970-х) термин "гипервизор" (hypervisor). Монитор виртуальных машин VMM работал непосредственно с аппаратным обеспечением и позволял запускать множество виртуальных машин (VM). В каждой виртуальной машине могла быть запущена своя операционная система - в те дни это называлось CMS или Conversational Monitor System. Виртуальные машины совершенствовались и сегодня мы находим их работающими на мэйнфремах серии System z9(TM). Они обеспечивают обратную совместимость, даже с линейкой System/360. Еще одним из ранних вариантов виртуализации были P-коды (или псевдо-коды), в этом случае осуществлялась симуляция процессора. P-коды - это машинный язык, который исполнялся в виртуальной машине, а не на реальном процессоре. P-коды появились в начале 1970-х в разработанной в Калифорнийском университете Сан-Диего (UCSD) Pascal-системе, которая компилировала Pascal-программу в P-коды, а затем выполняла ее в виртуальной машине, реализующей P-коды. Это делало программы на P-кодах в высшей степени переносимыми и позволяло запускать их на любых компьютерах, для которых существовали виртуальные машины, реализующие P-коды.
Та же самая концепция была использована в 1960-х годах при создании языка Basic Combined Programming Language (BCPL), предшественника языка C. В нем компилятор преобразовывал BCPL-код в промежуточный код, который назывался O-код. На втором этапе O-код компилировался в машинные коды компьютера, на котором он должен был исполняться. Та же модель используется в современных компиляторах для языков программирования, что позволяет обеспечить возможность легкого портирования компилятора на новые аппаратные архитектуры (за счет разделения внешнего и внутреннего интерфейсов промежуточным языком). Более поздний вариант виртуализации - виртуализация набора команд (инструкций) или бинарная трансляция. В этой модели виртуальный набор команд транслируется в набор команд реального аппаратного обеспечения, причем в большинстве случаев это осуществляется динамически. Трансляция сегмента кода происходит тогда, когда код должен исполняться. Если происходит переход, извлекается из памяти нужный новый кусок кода и транслируется. Это сильно напоминает кэширование, при котором блок инструкций перед исполнением перемещается из памяти в быстрый кэш. Недавний пример использования той же модели имел место в процессоре Crusoe, разработанном компанией Transmeta. В этой архитектуре применяется бинарная трансляция, зарегистрированная под торговой маркой Code Morphing. Еще одним примером может служить сканирование кодов во время исполнения (runtime code scanning), используемое при полной виртуализации для поиска и перенаправления привелигированных команд (для обработки результатов в некоторых наборах инструкций процессора).
Когда заходит речь о виртуализации, необходимо сказать, что существует не единственный способ достичь нужного эффекта. Фактически имеется несколько вариантов достижения одного и того же результата путем использования разных уровней абстракции. В этом разделе мы рассмотрим три наиболее общих метода виртуализации в Linux и оценим их относительные преимущества и недостатки. Отметим, что иногда для обозначения одного и того же метода виртуализации используются различные термины. Мы будем использовать наиболее употребительные, указывая на возможность употребления других вариантов. Вероятно самым сложным способом виртуализации является эмуляция аппаратуры. В этом методе в хост-системе создается виртуальная машина, которая моделирует какую-то другую аппаратную архитектуру, как это показано на рисунке 1. Рисунок 1. Эмуляция аппаратуры использует виртуальную машину для моделирования требуемого аппаратного обеспечения
Но эмуляция аппаратуры имеет и свои преимущества. Например, в этом случае вы имеете возможность без внесения каких-либо изменений запустить операционную систему, разработанную для PowerPC® на хосте, работающем на процессоре ARM. Вы даже можете запустить несколько виртуальных машин, моделирующих различные процессоры. Полная виртуализация, которую также называют естественной (native virtualization), - это другой интересный метод виртуализации. Эта модель использует виртуальную машину, которая выступает как посредник между гостевой операционной системой и реальным оборудованием (см. Рисунок 2). Слово "посредник" в данном случае играет ключевую роль, поскольку VMM располагается между гостевой ОС и реальным оборудованием. Некоторые инструкции защищенного режима должны перехватываться и обрабатываться внутри гипервизора, поскольку аппаратура не доступна непосредственно из операционных систем, доступ к ней предоставляется через гипервизор. Рисунок 2. Полная виртуализация использует программу-гипервизор для разделения доступа к нижележащему оборудованию
Полная виртуализация работает быстрее, чем эмуляция аппаратуры, но производительность все же ниже, чем на реальной аппаратуре, из-за посредничества гипервизора. Самое большое преимущество полной виртуализации состоит в том, что гостевая операционная система может быть запущена без какой-либо модификации. Единственное ограничение состоит в том, что она должна поддерживать реальное физическое оборудование (например, PowerPC). Паравиртуализация - это другой популярный метод, который имеет некоторое сходство с полной виртуализацией. Этот метод тоже использует гипервизор для разделяемого доступа к оборудованию, но интегрирует код виртуализации в саму операционную систему (см. Рисунок 3). Этот подход позволяет избежать любой перекомпиляции или перехвата команд, поскольку операционная система сама участвует в процессе виртуализации. Рисунок 3. Паравиртуализация разделяет процесс с гостевой операционной системой Как я уже упоминал, паравиртуализация требует модификации гостевой операционной системы, что является недостатком. Однако в этом случае обеспечивается производительность, близкая к производительности невиртуализированной системы. Подобно полной виртуализации множество различных операционных систем могут поддерживаться одновременно.
Последний из рассматриваемых нами здесь вариантов, виртуализация уровня операционной системы, использует технику, отличающуюся тех способов, которые были рассмотрены ранее. В этом варианте виртуализируются серверы, запускаемые в операционной системе. В этом случае операционная система одна и просто изолируются один от другого сервера, работающие под ее управлением (см. Рисунок 4). Рисунок 4. При виртуализации уровня операционной системы изолируются сервера Виртуализация уровня операционной системы требует внесения изменений в ядро операционной системы, но зато позволяет достичь исходной ее производительности.
Зачем нужна виртуализация?Перед тем, как рассмотреть некоторые из реализаций виртуализации, доступных в Linux-системах, давайте скажем несколько слов о преимуществах виртуализации. С точки зрения бизнеса имеется множество причин для использования виртуализации. Большинство получаемых преимуществ вытекает из того, что принято называть консолидацией серверов. Проще говоря, если вы можете перевести несколько не полностью используемых систем на один сервер, вы получаете существенную экономию пространства, потребления энергии, охлаждения и упрощаете администрирование в силу того, что требуется поддерживать меньшее количество серверов. Поскольку трудно определить степень использования сервера, технология виртуализации поддерживает возможность так называемой "живой миграции" (live migration). Живая миграция позволяет операционной системе и ее приложениям быть перемещенными на новый сервер для балансировки нагрузки на имеющееся оборудование. Виртуализация важна также для разработчиков. Ядро Linux работает в общем адресном пространстве, что означает, что сбой в работе ядра или любого драйвера приводит к краху всей операционной системы. Виртуализация означает, что вы запускаете множество операционных систем, и, если одна из них рушится из-за какой-то ошибки, гипервизор и другие операционные системы продолжают работать. Это может сделать отладку ядра подобной отладке пользовательских приложений.
В таблице 1 приведен список нескольких проектов виртуализации для Linux, причем в основном перечисляются проекты с открытым исходным кодом. Таблица 1. Проекты виртуализации для Linux-систем
Информацию о других решениях вы сможете найти по ссылкам в разделе Ресурсы.
Bochs - это программа-имитатор, моделирующая компьютер архитектуры x86, которая портируема и может запускаться на многих аппаратных платформах, включая x86, PowerPC, Alpha, SPARC и MIPS. Особенность, которая делает Bochs особо интересным проектом, заключается в том, что он(а) моделирует не только процессор, но и периферийное оборудование, такое как клавиатура, мышь, видео-оборудование, сетевые карты и так далее. Bochs можно сконфигурировать для моделирования старого Intel® 386, или его последователей, таких как 486, Pentium, Pentium Pro или 64-битных вариантов. Он(а) может эмулировать даже необязательные наборы графических инструкций вроде MMX и 3DNow. Используя Bochs, вы можете запустить под Linux любой из дистрибутивов Linux, Microsoft® Windows® 95/98/NT/2000 (и множество приложений), и даже операционные системы семейства Berkeley Software Distribution (BSD) - FreeBSD, OpenBSD и так далее. QEMU - это другой эмулятор, подобный Bochs, но имеющий несколько малосущественных отличий. QEMU поддерживает два режима эмуляции. Первый - режим полной эмуляции системы (Full System Emulation). Этот режим подобен Bochs в том, что в этом случае моделируется весь персональный компьютер (PC) с процессором и периферией. Имеется возможность, используя динамическую трансляцию, смоделировать различные процессорные архитектуры, такие как x86, x86_64, ARM, SPARC, PowerPC и MIPS, причем с достаточно приемлемыми скоростями работы. В этом режиме, используя в качестве базовой ОС Linux, Solaris или FreeBSD, вы можете сэмулировать операционные системы семейства Windows (включая XP) и Linux. Поддерживается множество других комбинаций операционных систем (дополнительную информацию ищите в секции Ресурсы). QEMU включает также другой режим, который называется пользовательским режимом эмуляции (User Mode Emulation). В этом режиме, который работает только в том случае, когда базовой ОС является Linux, могут быть запущены приложения (бинарные файлы), созданные для других архитектур. Например, можно запустить на исполнение в ОС Linux, работающей на x86, бинарный файл, скомпилированный для архитектуры MIPS. В настоящее время в этом режиме поддерживаются архитектуры ARM, SPARC и PowerPC, а поддержка еще нескольких находится в процессе разработки. VMware - это коммерческое решение по методу полной виртуализации. Гирервизор располагается между гостевой операционной системой и физическим оборудованием как дополнительный уровень абстракции. Этот уровень абстракции позволяет любой операционной системе работать с оборудованием, не обращая внимания на присутствие любой другой гостевой операционной системы. VMware виртуализирует также имеющиеся устройства ввода-вывода и добавляет к гипервизору драйверы высоко-производительных устройств. Вся виртуализируемая система (включая гостевую ОС, виртуальную машину и виртуальное оборудование) хранится в виде файла, в силу чего легко и быстро можно перенести ее на другой хост, например, для балансировки нагрузки. Хотя система z от IBM (IBM System zTM) появилась относительно недавно, фактически она является наследницей предыдущих разработок, история которых восходит к 1960-м годам. Компьютеры линейки System/360 поддерживали виртуализацию на основе виртуальных машин уже в 1965. Интересно, что System z сохраняет обратную совместимость с линейкой System/360. z/VM ® - это гипервизор операционной системы для System z. Его ядром является программа управления (Control Program - CP), которая обеспечивает виртуализацию физических ресурсов для гостевых операционных систем, в качестве которой может выступать, например, Linux (смотри Рисунок 5). При этом имеется возможность виртуализировать многопроцессорные системы и другие виды ресурсов для различных гостевых операционных систем. Рисунок 5. Виртуализация уровня ОС с использованием z/VM Система z/VM может также виртуально моделировать работу гостевой локальной вычислительной сети (ЛВС) для тех гостевых операционных систем, которые хотят взаимодействовать друг с другом. ЛВС моделируется полностью в гипервизоре, что обеспечивает высокий уровень безопасности. Xen - это свободное решение с открытыми кодами от компании XenSource, реализующее паравиртуализацию уровня операционной системы. Вспомним, что в случае паравиртуализации и гипервизор, и операционная система участвуют в процессе виртуализации, что требует внесения изменений в ОС, но зато обеспечивает почти естественную производительность. Поскольку Xen требует внесения изменений в гостевую операционную систему, виртуализированы в Xen могут быть только ОС, соответствующим образом доработанные. С точки зрения Linux, которая придерживается принципа открытых кодов, это вполне приемлемый компромисс, поскольку результатом буде более высокое быстродействие, чем в случае полной виртуализации. Но с точки зрения обеспечения широты поддержки (имеется в виду поддержка операционных систем, не придерживающихся принципа открытых кодов), это очевидный недостаток. Windows может быть запущена в Xen, но только на системах, в которых запущена Intel Vanderpool или AMD Pacifica. Другие операционные системы, поддерживающие Xen - это Minix, Plan 9, NetBSD, FreeBSD и OpenSolaris.
User-mode Linux (UML) позволяет запускать в пользовательском пространстве одной операционной системы Linux другой экземпляр ОС Linux. Каждая гостевая Linux-система существует внутри процесса, запущенного на базовой операционной системе Linux (смотри Рисунок 6). Это обеспечивает возможность одновременного исполнения нескольких ядер Linux (с их собственными пользовательскими пространствами) в контексте одного (базового) ядра Linux. Рисунок 6. Linux, запущенный в User-mode Linux Для ядер Linux версии 2.6 UML включено в основную ветку ядра, но для того, им воспользоваться, необходимо задействовать его и перекомпилировать ядро. При этом, кроме всего прочего, обеспечивается виртуализация устройств. Это позволяет гостевой операционной системе получать доступ к имеющимся физическим устройствам, таким как блочные устройства (флоппи, CD-ROM и файловые системы, например), к консоли, сетевым устройствам, звуковому оборудованию и так далее. Отметим, что поскольку ядра гостевых ОС запускаются в пользовательском пространстве, они тоже должны быть скомпилированы специальным образом (хотя они могут относиться к другой версии ядра). Получаем две разных версии ядра - базовое ядро (которое работает непосредственно с физическим оборудованием) и гостевое ядро (которое запущено в пользовательском пространстве базового ядра). Можно даже получить многоуровневое вложение, когда в гостевом ядре запускается другое гостевое ядро.
Linux-VServer - это решение, обеспечивающее виртуализацию уровня операционной системы. Linux-VServer изменяет ядро Linux таким образом, что образуется множество пользовательских пространств, называемых виртуальными частными серверами (Virtual Private Servers - VPS), исполняющимися независимо один от другого. Linux-VServer обеспечивает изоляцию этих пользовательских пространств за счет модификации ядра Linux. Для того, чтобы изолировать индивидуальные пользовательские пространства
одно от другого, вводится понятие контекста. Контекст - это контейнер
для процессов заданной VPS, так что утилиты типа В Linux-VServer используется также особая форма утилиты Linux-VServer поддерживается для ядер Linux версий 2.4 и 2.6 и может работать на платформах x86, x86-64, SPARC, MIPS, ARM и PowerPC.
OpenVZ - это другой вариант виртуализации уровня операционной системы, похожий на Linux-VServer, но имеющий несколько интересных отличий. OpenVZ - это приспособленное для виртуализации (модифицированное) ядро, которое поддерживает изолированные пользовательские пространства, VPS, а также имеет набор пользовательских утилит для управления. Например, вы можете легко создавать новые VPS прямо из командной строки: Листинг 1. Создание VPS из командной строки
Вы можете также получить список всех существующих в данный момент VPS,
используя команду Для управления процессами в OpenVZ включен двухуровневый планировщик задач (диспетчер) ЦПУ. Этот диспетчер, во-первых, определяет, какой VPS должен получить доступ к ЦПУ. Когда это сделано, планировщик второго уровня запускает процесс на выполнение, устанавливая для него стандартные для Linux приоритеты. OpenVZ содержит также компонент, который называется beancounters (прим.переводчика : в буквальном переводе это что-то вреде "счетчика бобов"). Beancounter представляет собой набор параметров, определяющих выделение ресурсов для заданного VPS. Этот набор определяет, сколько памяти предоставляется VPS, какие средства межпроцессорного взаимодействия (IPC) доступны объектам, и так далее, задавая тем самым определенный уровень контроля над VPS. Уникальной особенностью OpenVZ является возможность задавать контрольные точки (to checkpoint) и переносить VPS с одного физического сервера на другой. Задание контрольной точки (Checkpointing) означает что состояние выполняющегося VPS "замораживается" и сохраняется в файле. Этот файл может быть перемещен на новый сервер, где этот VPS может быть восстановлен и запущен в работу с той же точки. OpenVZ поддерживает различные типы аппаратных архитектур, включая x86, x86-64 и PowerPC.
Аппаратная поддержка полной виртуализации и паравиртуализацииНапомню, что с точки зрения виртуализации архитектура IA-32 (x86) создает
несколько проблем. Некоторые инструкции привелигированного режима не могут
быть перехвачены. Другие возвращают различные результаты в зависимости от того,
в каком режиме они выполняются. Например, команда Фирма Intel разработала новую технологию виртуализации, которая будет поддерживать гипервизоры как для архитектуры x86 (VT-x), так и для Itanium® (VT-i). VT-x поддерживает две новых формы операций, одна - для VMM (root), а вторая - для гостевых операционных систем (non-root). Первая форма (root form) выполняется с полными привилегиями, а вторая лишена части привилегий (даже в кольце 0). Эта архитектура, кроме того, позволяет гибко определять инструкции, которые приводят к выходу VM (гостевой ОС) в VMM и сохранению состояния процессора. Добавлены и еще некоторые возможности; прочитать об этом вы можете в источниках, приведенных в разделе Ресурсы. Фирма AMD тоже разработала аппаратно-поддерживаемую технологию виртуализации
под названием Pacifica. Среди других особенностей Pacifica поддерживает блок
управления для гостевой операционной системы, который сохраняется при
выполнении специальных команд (maintains a control block for guest
operating systems that are saved on execution of special instructions).
По команде Эти новые технологии могут быть использованы в различных реализациях виртуализации, обсуждавшихся выше, включая Xen, VMware, User-mode Linux и других.
Виртуальная машина ядра Linux (Linux Kernel Virtual Machine - KVM)Одним из недавних новшеств в Linux является включение KVM в ядро Linux
(версии 2.6.20). KVM - это реализация варианта полной виртуализации,
превращающая ядро Linux в гипервизор за счет подключения соответствующего
модуля ядра. Этот модуль позволяет запускать другие гостевые операционные
системы в пользовательском пространстве базового ядра Linux (смотри Рисунок 7).
Модуль KVM в ядре экспортирует (предоставляет) виртуализированное оборудование
посредством символьного устройства Рисунок 7. Виртуализация посредством Kernel Virtual Machine (KVM) Модуль KVM добавляет к ядру новый режим исполнения. Если раньше ядра поддерживали режим ядра и режим пользователя, KVM вводит режим гостя. Гостевой режим используется для выполнения всех инструкций, не связанных с вводом-выводом, а операции ввода-вывода для гостевых систем исполняются в обычном пользовательском режиме. Включение KVM в ядро является очень интересным явлением в эволюции Linux, поскольку является первой технологией виртуализации, включенной в основную ветку ядра. Оно появилось в версии 2.6.20, но может быть в виде модуля включено и в ядрах версии 2.6.19. Его использование на аппаратном обеспечении, поддерживающем виртуализацию, позволяет запускать гостевые операционные системы Linux (в 32-х и 64-х битовом вариантах) и Windows (32-битовую). Если хотите больше узнать о KVM, смотрите раздел Ресурсы.
Виртуализация - это великолепное новшество, если термин "новшество" вообще можно применять к явлению, история которого насчитывает более четырех десятилетий. В исторической перспективе она встречается в разных контекстах, но в настоящее время в основном используется для виртуализации серверов и операционных систем. Подобно Linux, виртуализация предоставляет множество возможностей для повышения производительности, переносимости и приспособляемости компьютерных систем. Это означает, что вы можете выбрать подход, который наиболее соответствует вашим потребностям и используемому вами набору приложений. Обучение
Где найти продукты и технологии
Об авторе
Обсуждение статьи на форуме LOR
|