Виртуализацию все понимают по-разному. Сейчас это, прежде всего, означает виртуализацию серверов или хостинг нескольких независимых операционных систем на одном компьютере. В данной статье рассматриваются основные принципы виртуализации и обсуждаются пути их реализации. Также рассматриваются и некоторые другие способы виртуализации, например, виртуализация ОС в Linux.
Виртуализировать означает взять нечто одной формы и заставить его казаться другой формы. Виртуализировать компьютер означает заставить компьютер казаться сразу несколькими компьютерами или совершенно другим компьютером.
Виртуализацией также называется ситуация, когда несколько компьютеров представляются как один отдельный компьютер. Обычно это называют серверным кластером или grid computing.
Давайте начнем с истоков виртуализации.
Обзор истории виртуализации
Виртуализация тема не новая. Фактически ей уже более четырех десятилетий. Наиболее раннее использование виртуализации включали IBM® 7044, Compatible Time Sharing System (CTSS), разработанная Массачусетским Технологическим Институтом (Massachusetts Institute of Technology – MIT) на IBM 704 и проект Atlas Университета Манчестера (один из первых суперкомпьютеров в мире), которые начали прокладывать путь в соответствии с требованиями сопровождения и запросами пользователей.
Виртуализация оборудования
IBM признала важность виртуализации еще в 1960-х вместе с развитием мэйнфрэйма System/360™ Model 67. Model 67 виртуализировала все интерфейсы оборудования через Virtual Machine Monitor или VMM. На заре вычислительной эры операционную систему называли supervisor. Когда стало возможным запускать одну операционную систему на другой операционной системе, появился термин hypervisor (гипервизор) (был введен в 1970-х).
VMM запускается непосредственно на основном оборудовании, позволяющем множество виртуальных машин (VM). Каждая VM может тогда обладать своей собственной операционной системой. В первое время это была CMS (Conversational Monitor System). VM продолжает развиваться, и сейчас можно обнаружить, что она работает на мэйнфрэйме System z9™. Это обеспечивает обратную совместимость, вплоть до уровня System/360.
Виртуализация процессора
Другое раннее использование виртуализации, в данном случае симуляция процессора, это P-code (или pseudo-code) машина. P-code — это машинный язык, который выполняется на виртуальной машине, а не на реальном оборудовании. P-code был прославлен в начале 1970-х Pascal system в Калифорнийском Университете, Сан Диего (University of California, San Diego — UCSD), которая компилировала программы на Pascal в P-code и потом выполняла их на P-code виртуальной машине. Это позволило программам на P-code быть высоко портируемыми и работать везде, где есть доступ к виртуальной машине P-code.
Такая же концепция была использована в 1960-е для Basic Combined Programming Language (BCPL), прародителя языка C. В этом случае компилятор перевел бы код BCPL во вспомогательный машинный код, названный O-code. В качестве второго шага O-code был переведен в родной язык для заданной машины. Такая модель используется современными компиляторами для обеспечения гибкости портирующих компиляторов для новых принимающих архитектур (разделяя front-end и back-end с помощью вспомогательного языка).
Командная виртуализация
Наиболее новый аспект виртуализации назван командная виртуализация или бинарная виртуализация. В этой модели виртуальные команды переводятся (транслируются) на физические команды основного оборудования. Обычно это происходит динамически. Поскольку код исполняемый, переводится сегмент кода. Если происходит разветвление, то новый сегмент кода забирается и переводится. Это похоже на операции кэширования, когда блоки команд перемещаются из памяти в быструю локальную кэш-память для выполнения.
Свежий пример такой модели был использован в Crusoe central processing unit (CPU), разработанный Transmeta. Эта архитектура использует бинарную трансляцию под торговой маркой Code Morphing. Похожим примером может служить сканирование кода исполняющей среды runtime посредством полной виртуализации решений с целью найти и перенаправить привилегированные команды (чтобы работать в командном окружении конкретного процессора).
Типы виртуализации
Когда производится виртуализация, существует не единственный способ ее осуществления. Фактически есть несколько путей, с помощью которых достигаются одинаковые результаты через разные уровни абстракции. В этой главе вам будут представлены три самых общих метода виртуализации в Linux и проанализированы их относительные преимущества и недостатки. Иногда используются различные термины для описания одного и того же метода виртуализации. Здесь мы будем использовать самые общие понятия, ссылаясь на другие для общей согласованности.
Эмуляция оборудования
Возможно самая сложная виртуализация обеспечивается эмуляцией аппаратных средств. В этом методе VM аппаратных средств создается на хост-системе, чтобы эмулировать интересующее оборудование, как показано на Рисунке 1.
Рисунок 1. Эмуляция оборудования использует VM, чтобы моделировать необходимые аппаратные средства
Как вы могли предполагать, главная проблема при эмуляции аппаратных средств состоит в том, что процесс может стать мучительно медленным. Поскольку каждая команда должна моделироваться на основных аппаратных средствах, замедление в 100 раз является обычным. Для высокоточных эмуляций, которые включают точность цикла, моделируемые каналы центрального процессора и политику кэширования, фактическая скорость может быть в 1000 раз меньше.
Эмуляция аппаратных средств действительно имеет свои преимущества. Например, используя эмуляцию аппаратных средств, вы можете управлять неизмененной операционной системой, предназначенной для PowerPC® на системе с ARM процессором. Вы можете даже управлять многочисленными виртуальными машинами, каждая из которых будет моделировать другой процессор.
Полная виртуализация
Полная виртуализация, по-другому известная как родная виртуализация, является другим интересным способом виртуализации. Эта модель использует виртуальную машину, которая осуществляет связь между гостевой операционной системой и родными аппаратными средствами (см. Рисунок 2). “Посредничать” здесь является ключевым словом, поскольку VMM осуществляет посредничество между гостевой операционной системой и собственно оборудованием. Внутри гипервизора должна быть установлена и настроена определенная защита, потому что основные аппаратные средства не принадлежат операционной системе, а разделяются гипервизором.
Рисунок 2. Полная виртуализация использует гипервизор, чтобы разделять основные аппаратные средства
Полная виртуализация работает быстрее, чем эмуляция оборудования, но производительность меньше, чем у просто оборудования из-за посредничества гипервизора. Наибольшее преимущество полной виртуализации состоит в том, что в операционную систему не вносится изменений. Единственное ограничение состоит в том, что операционная система должна поддерживать основные аппаратные средства (например, PowerPC).
Паравиртуализация
Паравиртуализация — это другой популярный способ, который имеет некоторые сходства с полной виртуализацией. Этот метод использует гипервизор для разделения доступа к основным аппаратным средствам, но объединяет код, касающийся виртуализации, в непосредственно операционную систему (см. Рисунок 3). Этот подход устраняет потребность в любой перекомпиляции или перехватывании, потому что сами операционные системы кооперируются в процессе виртуализации.
Рисунок 3. Паравиртуализация разделяет процесс с гостевой операционной системой
Как уже замечалось, паравиртуализация требует, чтобы гостевая операционная система была изменена для гипервизора, и это является недостатком метода. Но зато паравиртуализация предлагает производительность почти как у реальной не виртуализированной системы. Как и при полной виртуализации, одновременно могут поддерживаться многочисленные различные операционные системы.
Виртуализация уровня операционной системы
Последний метод, который мы рассмотрим, виртуализация на уровне операционной системы, использует технику, отличную от предыдущих. Эта техника виртуализирует серверы непосредственно над операционной системой. Этот метод поддерживает единственную операционную систему и просто изолирует независимые серверы друг от друга (см. Рисунок 4).
Рисунок 4. Виртуализация уровня операционной системы изолирует серверы
Виртуализация уровня операционной системы требует внесения изменений в ядро операционной системы, но при этом преимуществом является родная производительность.
Почему важна виртуализация?
Прежде чем взглянуть на некоторые варианты виртуализации, доступные сегодня в Linux, давайте рассмотрим преимущества виртуализации.
Существует множество причин использования виртуализации для бизнес-решений. Большинство из них сводится к тому, что называется серверная консолидация. Проще говоря, если вы можете виртуализировать множество недостаточно использованных систем на отдельном сервере, то вам удастся сэкономить на мощности, месте, охлаждении и администрировании из-за наличия меньшего количества серверов. Поскольку бывает трудно определить нагрузку на сервер, процедура виртуализации поддерживает так называемую живую миграцию (live migration). Живая миграция позволяет операционной системе, которая перемещается на новый сервер, и ее приложениям сбалансировать нагрузку на доступном оборудовании.
Виртуализация также важна для разработчиков. Ядро Linux занимает единственное адресное пространство, что означает, что отказ ядра или любого драйвера приводит к аварии всей операционной системы. Виртуализация означает, что вы можете управлять несколькими операционными системами, и если одна из них терпит крах из-за ошибки, то гипервизор и другие операционные системы продолжают работать. Это может сделать отладку ядра подобной отладке пользовательских приложений.
Проекты виртуализации для Linux
В таблице 1 приведены некоторые возможности виртуализации для Linux, и внимание, прежде всего, уделяется решениям с открытым исходным кодом.
Таблица 1. Проекты виртуализации для Linux
Проект Тип Лицензия
Bochs Эмуляция LGPL
QEMU Эмуляция LGPL/GPL
VMware Полная виртуализация Проприетарное
z/VM Полная виртуализация Проприетарное
Xen Паравиртуализация GPL
UML Паравиртуализация GPL
Linux-VServer Виртуализация уровня операционной системы GPL
OpenVZ Виртуализация уровня операционной системы GPL
Bochs (эмуляция)
Bochs — это x86-компьютерный имитатор, который является переносимым и работает на разнообразных платформах, включая x86, PowerPC, Alpha, SPARC и MIPS. Bochs интересен, потому что моделируется не только процессор, а весь компьютер, включая периферийные устройства типа клавиатуры, мыши, графическое и видео оборудование, карточки сетевого интерфейса (NIC) и так далее.
Bochs может быть сконфигурирован как старинный Intel® 386 или его преемники, такие как 486, Pentium, Pentium Pro или 64-битовый. Bochs даже эмулирует дополнительные графические функции, такие как MMX или 3DNow.
Используя эмулятор Bochs, вы можете управлять любым дистрибутивом Linux на Linux, Microsoft® Windows® 95/98/nt/2000 (и многообразием приложений) на Linux и даже операционной системой Berkeley Software Distribution (BSD), FreeBSD, OpenBSD и так далее на Linux.
QEMU (эмуляция)
QEMU — другой эмулятор, он похож на Bochs, но имеются и некоторые отличия, которые стоит отметить. QEMU поддерживает два режима работы. Первый — режим Полной Эмуляции Системы. Этот режим похож на работу Bochs, где эмулируется персональный компьютер (PC) целиком, вместе с процессором и периферией. Этим способом имитируется множество различных архитектур процессоров, таких как x86, x86_64, ARM, SPARC, PowerPC и MIPS с разумной скоростью, используя динамический перевод. Этим способом вы можете эмулировать операционные системы Windows (включая XP) и Linux на Linux, Solaris и FreeBSD. Поддерживается также и множество других комбинаций операционных систем.
QEMU также поддерживает другой режим, именуемый “режим пользовательской эмуляции”. При таком способе, который осуществим только на Linux, можно запускать бинарники для разных архитектур. Это позволяет, например, выполнить бинарник для архитектуры MIPS на Linux, запущенном на x86. Другие архитектуры, поддерживаемые при таком режиме, включают ARM, SPARC и PowerPC, хотя большинство еще только разрабатывается.
VMware (полная виртуализация)
VMware — коммерческое решение для полной виртуализации. Гипервизор находится между гостевой операционной системой и непосредственно оборудованием как слой абстрагирования. Этот слой абстрагирования позволяет любой операционной системе работать на аппаратных средствах, не имея информации о какой-либо другой гостевой операционной системе.
VMware также виртуализирует в гипервизоре доступные устройства ввода/вывода и соответствующие драйверы для высокоэффективных устройств.
Вся виртуализированная среда сохраняется как файл, и это означает, что полная система (включая гостевую операционную систему, VM и виртуальное оборудование) может быть легко и быстро перенесена на другой сервер для распределения загрузки.
z/VM (полная виртуализация)
Несмотря на то, что IBM System z™ — это новый брэнд, фактически он имеет длинную историю, начиная с 1960-ых. System/360 поддерживала виртуализацию с использованием виртуальных машин еще в 1965. Интересно, что System z сохраняет обратную совместимость со старой линейкой System/360.
z/VM® — гипервизор операционный системы для System z. В нем — Программа Контроля (Control Program — CP), которая обеспечивает виртуализацию физических ресурсов для гостевой операционной системы, включая Linux (см. Рисунок 5). Это позволяет множеству процессоров и другим ресурсам виртуализироваться для множества гостевых операционных систем.
Рисунок 5. Виртуализация на уровне операционной системы с использованием z/VM
Z/VM может также эмулировать гостевую локальную сеть (LAN) виртуально для гостевых операционных систем, которые хотят общаться друг с другом. Это полностью эмулировано в гипервизоре, поэтому абсолютно безопасно.
Xen (паравиртуализация)
Xen — свободное решение с открытым исходным кодом для паравиртуализации на уровне операционной системы от XenSource. Вспомните, что при паравиртуализации гипервизор и операционная система объединяются при виртуализации, изменяя операционную систему, но зато приводя почти к родной производительности оборудования.
Поскольку Xen требует объединения (изменения гостевой операционной системы), только те операционные системы, которые должным образом исправлены, могут быть виртуализированы с помощью Xen. Так как Linux является сам по себе решением с открытым исходным кодом, то в данном случае это — разумный компромисс, потому что в результате вы имеете лучшую производительность, чем при полной виртуализации. Но для перспективы широкой поддержки (например, других операционных систем с закрытым исходным кодом) это обстоятельство является явным неудобством.
Windows можно запускать как гостевую систему на Xen, но только если он запущен на Intel Vanderpool или AMD Pacifica. Кроме того, Xen поддерживает другие операционные системы, включая Minix, Plan 9, NetBSD, FreeBSD и OpenSolaris.
User-mode Linux (паравиртуализация)
User-mode Linux (UML) позволяет операционной системе Linux запускать другой Linux в пространстве пользователя. Каждый гостевой Linux существует как процесс в ОС Linux хоста (см. Рисунок 6). Это позволяет многочисленным ядрам Linux (с их собственными пространствами пользователя) работать в контексте одного ядра Linux.
Рисунок 6. Хостинг Linux в User-mode Linux
В ядре Linux 2.6 UML находится в основном дереве ядра, но должен быть доступен и перекомпилирован для использования. Эти изменения обеспечивают, кроме всего прочего, устройство виртуализации. Это позволяет гостевым операционным системам разделять доступные физические устройства, такие как блочные устройства (гибкий диск, CD-ROM и файловую систему), консоли, устройства NIC, звуковые аппаратные средства и другие.
Заметим, что, так как гостевые ядра запускаются в пространстве приложений, они должны быть специально скомпилированы для такого использования (тем не менее, это могут быть разные версии ядра). Это приводит к так называемому ядру хоста (которое располагается на аппаратных средствах) и гостевому ядру (которое живет в пространстве пользователя ядра хоста). Эти ядра даже могут быть вложенными, позволяя гостевому ядру работать на другом гостевом ядре, которое, в свою очередь, работает на ядре хоста.
Linux-VServer (виртуализация уровня операционной системы)
Linux-VServer — решение для виртуализации уровня операционной системы. Linux-VServer виртуализирует ядро Linux так, чтобы многочисленные окружения пространства пользователя, иначе известные как Virtual Private Servers (VPS), работали независимо друг от друга. Linux-VServer достигает изоляции пользовательских пространств посредством ряда модификаций ядра Linux.
Чтобы изолировать индивидуальные пространства пользователя друг от друга, начните с понятия контекста. Контекст — контейнер для процессов данного VPS, такой, что инструменты типа ps знают только о процессах VPS. При начальной загрузке ядро определяет контекст по умолчанию. Также существует контекст для администрирования (чтобы видеть все исполняемые процессы). Как можно догадаться, чтобы осуществить этот способ виртуализации, изменены ядро и внутренние структуры данных.
Linux-VServer также использует chroot, чтобы изолировать корневой каталог для каждого VPS. Вспомните, что chroot позволяет определить новую корневую директорию, но требуются дополнительные функциональные возможности (названные Chroot-Barrier), чтобы VPS не мог выходить из изолированного корневого каталога в родительский каталог. Имея изолированный корневой каталог, каждый VPS имеет свой собственный список пользователей и пароль root’а.
Linux-VServer поддерживается как 2.4, так и 2.6 ядрами Linux, а также работает на ряде платформ, включая x86, x86-64, SPARC, MIPS, ARM и PowerPC.
OpenVZ (виртуализация уровня операционной системы)
OpenVZ — другой метод виртуализации уровня операционной системы, похожей на Linux-VServer, но имеющий некоторые интересные отличия. OpenVZ — модифицированное ядро, которое поддерживает изолированные пространства пользователя, VPS, с рядом пользовательских инструментов для управления. Например, можно легко создать новый VPS, используя команду:
Листинг 1. Создание VPS в командной строке
$ vzctl create 42 --ostemplate fedora-core-4
Creating VPS private area
VPS private area was created
$ vzctl start 42
Starting VPS ...
VPS is mounted
Также можно увидеть список созданных VPS, используя команду vzlist, аналогичную стандартной команде Linux ps.
Для управления процессами OpenVZ включает двухуровневый планировщик центрального процессора. Сначала планировщик определяет, какой из VPS должен получить доступ к центральному процессору. После этого планировщик второго уровня выбирает процесс, следуя стандартным приоритетам Linux.
OpenVZ также включает то, что называют beancounters . Beancounter состоит из большого количества параметров, которые определяют распределение ресурсов для данного VPS. Это обеспечивает уровень контроля над VPS, определяя, сколько доступно памяти, сколько доступно средств межпроцессного взаимодействия (IPC) и так далее.
Уникальная особенность OpenVZ — способность к введению контрольных точек (Checkpoint) и перемещению VPS с одного физического сервера на другой. Checkpointing означает, что состояние действующего VPS заморожено и сохранено в файле. Этот файл можно перенести на новый сервер и восстановить, чтобы вернуть VPS в рабочее состояние.
OpenVZ поддерживает множество архитектур, включая x86, x86-64 и PowerPC.
Поддержка оборудования для полной виртуализации и паравиртуализации
Напомним, что архитектура IA-32 (x86) создает некоторые проблемы при виртуализации. Некоторые привилегированные команды не перехватываются и могут возвратить разные результаты в зависимости от способа. Например, команда x86 STR следит за безопасным состоянием, но возвращаемое значение основано на специфическом запрашиваемом уровне привилегии. Виртуализация различных операционных систем на различных уровнях становится проблематичной. Например, x86 поддерживает четыре уровня защиты, где уровень 0 (самая высокая привилегия) обычно управляет операционной системой, уровни 1 и 2 — поддержкой служб операционной системы и уровень 3 (самый низкий уровень) поддерживает приложения. Вендоры признали этот недостаток (а также и другие) и произвели новые продукты, которые поддерживают и ускоряют виртуализацию.
Интел создает новую технологию виртуализации, которая поддержит гипервизоры и для архитектуры x86 (VT-x), и для архитектуры Itanium® (VT-i). VT-x поддерживает два новых типа операций, один для VMM (root) и другой для гостевой операционной системы (не-root). Операциям root’а дают полные привилегии, в то время как операции не-root’овые привилегий лишаются (даже для уровня 0). Архитектура также поддерживает гибкость в определении команд, которые заставляют VM (гостевую операционную систему) выходить к VMM и сохранению состояния процессора. Были добавлены и другие возможности;
AMD также создает основанную на оборудовании технологию виртуализации под названием Pacifica. Между прочим, Pacifica поддерживает блок контроля для гостевой операционной системы, который сохраняется при выполнении специальных команд. Команда VMRUN позволяет виртуальной машине (и связанной с ней гостевой операционной системе) работать, пока VMM не восстановит контроль (который является также конфигурируемым). Конфигурируемость позволяет VMM настраивать привилегии для каждой из гостевых ОС. Pacifica также исправляет адресную трансляцию между хостом и гостевым memory management unit (MMU).
Эти новые технологии могут использоваться множеством методов виртуализации, уже обсуждаемых здесь, включая Xen, VMware, User-mode Linux и других.
Linux KVM (Kernel Virtual Machine)
Одной из последних новостей в мире Linux стало включение KVM в ядро Linux (2.6.20). KVM — решение для полной виртуализации, которое является уникальным в том, что превращает ядро Linux в гипервизор, используя модуль ядра. Этот модуль позволяет другой гостевой операционной системе работать в пространстве пользователя ОС Linux хоста (см. Рисунок 7). Модуль KVM в ядре показывает виртуализированные аппаратные средства как символьное устройство /dev/kvm. Гостевая операционная система взаимодействует с модулем KVM, используя модифицированный QEMU-процесс для эмуляции оборудования персонального компьютера.
Рисунок 7. Виртуализация с использованием Kernel Virtual Machine (KVM)
Модуль KVM вводит в ядро новый способ исполнения. В то время как обычное ядро поддерживают режим ядра и режим пользователя, KVM представляет новый гостевой режим. Гостевой режим используется, чтобы выполнить все команды, не связанные с операциями ввода/вывода (I/O), в то время как нормальный пользовательский режим осуществляет ввод/вывод для гостевой ОС.
Введение KVM является интересным развитием Linux, поскольку представляет первую технологию виртуализации, включенной в основную ветку ядра Linux. Впервые это было осуществлено в версии 2.6.20, но как модуль может использоваться и в версии 2.6.19. Если его использовать на оборудовании, поддерживающем виртуализацию, то можно запускать гостевые операционные системы Linux (32-х и 64-х бит) и Windows (32-бит).
Резюме
Виртуализация — это новая великая вещь, если можно сказать “новая” о том, чему уже более четырех десятилетий. Исторически виртуализация использовалась во множестве различных ситуаций, но в настоящее время в основным применяется для виртуализации серверов и операционных систем. Также как Linux, виртуализация обеспечивает множество путей для повышения производительности, портируемости и гибкости. Это означает, что вы можете выбрать решение, которое будет лучше соответствовать вашим возможностям и вашим задачам.
Автор: M. Тим Джонс, инженер-консультант, Emulex
Источник: ibm.com