Человек, работая за компьютером, постоянно запускает разные программы. У программистов количество приложений, необходимых для работы, может исчисляться десятками. Более того, иногда приходится запускать программы, которые работают только в другой операционной системе, отличной от той, в которой работает программист.
В качестве примера можно привести проекты на Хекслете, где в рамках задания студенту нужно записать, что происходит в терминале. Эта задача становится трудновыполнимой, если ваша основная система — Windows. Программа, которая записывает терминал — asciinema, работает только в Linux. Как можно решить эту проблему? И почему нельзя просто взять и запустить программу из одной ОС в другой операционной системе?
Начнём с того, что программы, которые мы пишем, не взаимодействуют напрямую с железом. Например, когда мы вводим символы на клавиатуре, их сначала обрабатывает специальный драйвер, встроенный в операционную систему, и только потом они попадают в поле ввода и отображаются. В данном случае обработка настолько быстрая, что мы даже не задумываемся о ней. То же самое в отображении: мы запускаем множество разных процессов, просто двигая курсор мыши. Одна из главных задач операционных систем — предоставить возможность программам взаимодействовать с железом компьютера, и в разных операционных системах для этого используются разные функции.
Операционные системы — одни из самых сложных программ, если не самые сложные. Они разрабатывались разными людьми и в разное время. Логично, что подходы к работе с устройствами в них кардинально отличаются. Это одна из основных причин, почему нельзя просто скопировать программу в другую операционную систему и запустить её там. В качестве примера, не связанного с железом, можно сказать, что графические оболочки разных ОС тоже полностью отличаются. Например, в Linux нет понятий «Кнопка пуск» или «трей». В некоторых реализациях отсутствуют даже привычные нам всем окна.
Но всё же у разработчиков часто возникает потребность запуска программ, работающих только в одной ОС, и эта проблема имеет решение.
Самый очевидный способ — купить второй компьютер, но это дорогое удовольствие. Второй вариант — поставить Linux рядом со своей основной операционной системой. Такая установка может завершиться неудачей, так как операционные системы, как правило, не ожидают, что рядом с ними будет работать другая похожая программа. Но если всё получилось, во время старта компьютера вы сможете выбрать ОС для загрузки. Существует также и третий путь — виртуализация, о ней и поговорим.
Узнайте больше об операционных системах У нас есть курс по операционным системам. Зарегистрированные пользователи могут пройти его бесплатно. Другие бесплатные курсы можно найти по ссылке.
Что такое виртуализация
Виртуализация позволяет запускать в текущей операционной системе программы, созданные для другой операционной системы. Это возможно благодаря виртуальной машине, которая работает внутри текущей операционной системы. На виртуальную машину устанавливается любая нужная в данный момент ОС. Стоит сказать, что виртуальных машин может быть много, каждая из них при этом выглядит как отдельный компьютер со своими характеристиками.
Виртуализация имеет очень богатую историю, а первая операционная система с её поддержкой появилась еще в 1968 году. Тогда же программисты поняли, что если можно запустить одну виртуальную машину, значит можно запустить и вторую, и третью. Возникла потребность управлять множеством таких машин, и появился первый гипервизор. По сути, это операционная система для управления виртуальными машинами.
Например, у нас есть две виртуальные машины, которые мы хотим использовать одновременно. Каждая из них должна иметь свой виртуальный жесткий диск и оперативную память. Логично, что кто-то должен следить за тем, чтобы одна из операционных систем случайно не начала записывать данные в области памяти, которые использует другая виртуальная машина. Этим как раз и занимается гипервизор: он изолирует и разделяет ресурсы виртуальных машин.
Операционная система (или компьютер), внутри которой запускается виртуальная машина, называется хост-системой (host), а ОС, работающую в виртуальном окружении, называют гостевой (guest).
Гипервизоры, по большому счёту, делятся на два типа: которые работают внутри операционной системы хоста, и для запуска которых хостовая ОС не нужна. Последние умеют работать прямо на голом железе. На настольных компьютерах наибольшее распространение получил первый тип.
В качестве примеров гипервизоров первого типа можно привести: VMware Workstation, QEMU и VirtualBox. А ко второму типу относится, например, автономный гипервизор VMware ESX.
Какие существуют виды виртуализации
Виртуализацию делят на три вида в зависимости от подхода к её реализации.
Программная виртуализация
Этот вид также подразделяется на несколько подвидов. В статье мы не будем подробно рассматривать каждый из них, так как в настоящее время программная виртуализация используется не так широко. Виртуальные машины на её основе значительно менее производительные по сравнению с другими видами виртуализации. Если интересно с чем это связано, подробнее можно почитать в Википедии.
Аппаратная виртуализация
Для её работы требуется поддержка со стороны процессора. Наибольшее распространение получили технологии Intel-VT и AMD-V, в настоящее время большинство процессоров для домашних компьютеров поддерживают одну из них. Аппаратная виртуализация не получила бы такого широкого распространения, если бы не преимущества, которые обеспечивает данный подход. Эти преимущества описаны ниже.
Первое преимущество: при аппаратной виртуализации виртуальные машины управляются гипервизором напрямую, в отличие от программной виртуализации, где, например, решение о выделении памяти для виртуальной машины сначала принимает операционная система хоста, и только после подтверждения гипервизор может предоставить ей ресурсы. Благодаря этому производительность гостевых ОС значительно повышается и достигает эффективности, сравнимой с реальным компьютером с такой же конфигурацией.
Второе преимущество: так как конфигурация виртуальной машины полностью эмулируется гипервизором, установщик операционной системы не нужно модифицировать. Выбираем нужные устройства в настройках, подключаем любой стандартный установочный образ нужной операционной системы и запускаем виртуальную машину. Более того, если у вас ещё сохранился процессор с 32-битной архитектурой, с помощью аппаратной виртуализации можно настроить виртуальную машину с 64-битным процессором и установить соответствующую ОС. Независимость от платформы хоста открывает поистине бесконечные возможности для экспериментов.
Контейнеризация или контейнерная виртуализация
Это виртуализация на уровне операционной системы. Если аппаратная виртуализация полностью эмулирует оборудование и позволяет запускать любые ОС, внутри контейнера можно запустить только аналогичную хосту операционную систему. Преимуществом этого подхода является скорость, с которой создаётся контейнер — секунды, тогда как для запуска виртуальной машины счёт времени идёт на минуты. Так происходит потому, что полноценной виртуальной машине нужно сначала инициализировать всё оборудование, запустить эмуляцию и только после этого начать загружать операционную систему. При контейнеризации ОС по факту уже работает. Остаётся только создать замкнутую среду — тот самый контейнер, в котором будет запущен ещё один экземпляр операционной системы.
Контейнер представляет собой всего лишь один процесс, внутри которого выполняется операционная система. Она существует в своём собственном мире, со своей сетью, своим диском, своей файловой системой и так далее. Эту виртуализацию применяют на уровне сервисов, составляющих части программного продукта. Наиболее известные проекты: OpenVZ, Docker, LXC.Так как Docker очень широко применятся в разработке, у нас есть подробный гайд о том, что это такое, как с ним работать и какие он даёт преимущества — Как и для чего использовать Docker.
Дополнительные возможности виртуализации
В начале 2000-x компания VMWare быстро захватила корпоративный рынок, выпустив гипервизор ESX Server и создав тем самым конкурентную среду. Начиная с этого момента технологии виртуализации стали стремительно развиваться. Огромное количество предприятий начали использовать виртуализацию для решения разных задач.
Резервное копирование
Виртуальная машина по сути представляет из себя набор файлов конфигурации и жесткого диска, а оперативную память тоже можно сохранить в виде файла. Учитывая эти особенности и возможность «заморозить» работу виртуальной машины, стало возможным делать бэкапы виртуальных серверов целиком. Потом, в случае поломки сервера, можно восстановить его из резервной копии. При этом не важно, будет он работать физически на этом же железе или новом, главное, чтобы был установлен нужный гипервизор. Помните, что аппаратная виртуализация даёт независимость от хост-платформы?
Возможность «заморозить» (поставить на паузу) работу виртуальной машины можно использовать для быстрого переключения между окружениями. Допустим, вы разрабатываете приложение для Windows. У вас открыто окно соответствующего редактора, запущены вспомогательные процессы и так далее. Но в тоже время вам нужно работать над другим проектом с совершенно другим окружением и в другой операционной системе.
Работая в виртуальной среде, можно поставить виртуальную машину на паузу и поработать над другим проектом. А когда нужно будет вернуться к первому, достаточно просто оживить виртуальную машину и продолжить работу с того места, на котором вы остановились. Так сохраняется контекст и экономится время, так как всё нужное, вплоть до интерфейса окон, уже настроено и правильно расположено на экране.
Быстрое создание среды для разработки
Современные веб-проекты требуют установки и настройки большого количества инструментария, библиотек и их зависимостей, серверов баз данных и так далее. Контейнеризация позволяет свести множество действий к запуску пары команд в терминале.
Виртуализация серверов
Так как на одном физическом сервере может располагаться множество виртуальных машин, на которых запущены другие серверы, расходы на их содержание значительно упали. В данный момент можно очень дешево арендовать ресурсы такого виртуального сервера VPS. На таких серверах, например, часто хостятся сайты.
Резюме
- Программы пишутся для конкретной операционной системы. Они используют особенности этих ОС при работе с устройствами и интерфейсом. Нельзя просто скопировать программу и запустить в другом окружении.
- Виртуализация при помощи гипервизора позволяет запускать одну операционную систему внутри другой на отдельной виртуальной машине и решает проблему запуска программ, которые не работают в текущей ОС.
- Существует три вида виртуализации — аппаратная, программная и контейнерная. Аппаратная виртуализация имеет много преимуществ перед программной, и её поддерживают все современные процессоры.
- Контейнеризация позволяет быстро развернуть окружение для разработки.