Был такой популярный фильм Кристофера Нолана «Начало» (который на самом деле Inception — «внедрение»). Речь в нем шла про сон внутри сна, который происходит тоже внутри сна. И сейчас мы поговорим о виртуальных машинах, которые как раз являются «компьютером внутри компьютера» (а внутри компьютера еще бывают контейнеры, которые тоже являются компьютерами).

Зачем делают такие матрешки из вложенных реальностей, какие виртуальные машины бывают и кто их применяет — обсудим в этой статье.

Зачем нужны виртуальные машины

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

Зачем такое вообще нужно?

  1. Облачные серверы. Вы берете сверхмощный сервер и ставите на него софт для запуска виртуальных машин. А потом начинаете продавать доступ к ресурсам этого сервера. Клиенты получают доступ, и им создается виртуальная машина с нужной операционной системой и заданным количеством ресурсов. Такие системы виртуализации нужны для бизнеса и поставщиков сервисных услуг.
  2. Виртуальные машины отдельных языков программирования. Некоторые языки программирования работают так: вы пишете код, который затем компилируется в специальный файл, предназначенный для исполнения в виртуальной машине определенного типа. Звучит сложно, но на деле встречается повсеместно. Например, язык Java — программы транслируются в специальный код, предназначенный для исполнения на виртуальной Java-машине.
  3. Безопасность. Запустить программу внутри виртуальной машины — это почти как запуск программы на отдельном компьютере. Это значит, что в случае проблем с безопасностью — например, через ошибку в запущенной программе кто-то получил доступ к компьютеру — хакер окажется заперт в песочнице, из которой некуда деваться. Взломщик «сидит» внутри виртуальной машины и не может получить доступ к данным и программам за ее пределами.
  4. Дистрибуция ПО. Серверные программы не всегда просто запустить — обычно нужно прописывать дополнительные настройки в разные файлы конфигурации, создавать пользователей ОС, прописывать им права и делать множество других тонких вещей. Дистрибуция серверного софта в виде виртуальных машин помогает упростить (или вовсе исключить) предварительную настройку — все необходимые конфигурационные файлы и параметры запуска ПО можно включить в виртуальную машину и запускать программу в готовой рабочей среде.

Какие бывают виды виртуальных машин

Их принято делить на три больших группы, отличающиеся по «глубине» виртулизационного процесса. Ниже небольшой обзор виртуальных машин и видов виртуализации.

Полная виртуализация

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

Еще эту штуку очень любят тестировщики. Например, чтобы на компьютере запустить 10 разных версий Windows и 20 разных версий Linux, а в них проверить работу программы.

Полная виртуализация — штука интересная, но она подходит не для всех целей, например, не годится для облаков. Поэтому обсудим два других, более облачных типа.

Виртуализация с доступом к железу

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

Этим методом организации работы операционной системы пользуются многие облачные решения, про которые вы точно слышали хоть краем уха: Xen, Hyper-V, KVM, Virtualbox.

Все эти продукты используют для построения крутых и надежных облаков для запуска виртуальных машин под нужды клиентов. Основное преимущество виртуализации с доступом к железу — скорость: запросы гостевых ОС можно выполнять напрямую на железе, без затратных процессов эмуляции.

Виртуализация уровня операционной системы

«Народный» облачный метод виртуализации — наиболее популярный подход для запуска софта в облаке и дистрибуции серверных программ. В этом случае жесткой виртуализации не происходит. Ядро хозяйской операционной системы выделяет несколько независимых пространств прямо на уровне хозяйской ОС и пускает в эти пространства несколько других программ на выполнение. При этом каждой программе предоставляется своя изолированная среда.

Звучит похоже на кое-что, не так ли? Именно, этот подход широко применяется в контейнеризации приложений. Это LXS, OpenVZ, jails и, конечно же, всенародно любимый Docker, сделавший применение виртуализации повсеместной практикой.

Виртуализация на уровне ОС позволяет контролировать поведение гостевых контейнеров извне, жестко определяя политики доступа гостей к ресурсам и данным.

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

Контейнеризация позволяет использовать одну операционную систему

И как выбрать виртуальную машину?

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

А контейнеризация и виртуализация уровня ОС — то, что нужно сегодня абсолютно всем. Без контейнеров сегодня не обходится разработка ни одной крупной системы. Контейнеры настолько плотно вошли в мир серверного ПО, что стали обязательным требованием к программистам при найме на работу.