Введение

OpenVZ (Open Virtuozzo) - технология виртуализации на уровне операционной системы для Linux. Он позволяет физическому серверу запускать несколько изолированных экземпляров операционной системы, называемых контейнерами, виртуальными частными серверами (VPS) или виртуальными средами (VEs). OpenVZ похож на Solaris Containers и LXC.

OpenVZ по сравнению с другими технологиями виртуализации

В то время как технологии виртуализации, такие как VMware, Xen и KVM обеспечивают полную виртуализацию и могут запускать несколько операционных систем и различные версии ядра, OpenVZ использует одно ядро Linux и, следовательно, может запускать только Linux. Все контейнеры OpenVZ имеют одну и ту же архитектуру и версию ядра. Это может быть недостатком в ситуациях, когда гостям требуются другие версии ядра, чем у хоста. Однако, поскольку он не имеет накладных расходов настоящего гипервизора, он очень быстрый и эффективный. Распределение памяти с OpenVZ является мягким, поскольку память, не используемая в одной виртуальной среде, может быть использована другими или для кэширования диска. В то время как старые версии OpenVZ использовали общую файловую систему (где каждая виртуальная среда является просто каталогом файлов, изолированных с помощью chroot), текущие версии OpenVZ позволяют каждому контейнеру иметь свою собственную файловую систему.

Ядра

Ядро OpenVZ - это ядро Linux, модифицированное для добавления поддержки контейнеров OpenVZ. Модифицированное ядро обеспечивает виртуализацию, изоляцию, управление ресурсами и контрольные точки. С vzctl 4.0, OpenVZ может работать с не заправленными ядрами Linux 3.x, с уменьшенным набором функций.

Виртуализация и изоляция

Каждый контейнер является отдельным объектом и ведет себя в основном как физический сервер. Каждый имеет свои собственные: файлы, системные библиотеки, приложения, виртуализированные /proc и /sys, виртуализированные замки и т. д. Пользователи и группы Каждый контейнер имеет своего собственного корневого пользователя, а также других пользователей и групп. Дерево процессов Контейнер видит только свои собственные процессы (начиная с init). PID виртуализированы, так что init PID равен 1, как и должно быть. Сеть Виртуальное сетевое устройство, которое позволяет контейнеру иметь собственные IP-адреса, а также набор сетевых фильтров (iptables) и правил маршрутизации. Устройства При необходимости любой контейнер может получить доступ к реальным устройствам, таким как сетевые интерфейсы, последовательные порты, разделы дисков и т. Д. Объекты IPC Общая память, семафоры, сообщения.

Управление ресурсами

Управление ресурсами OpenVZ состоит из четырех компонентов: двух уровней дисковой квоты, справедливого планировщика процессора, планировщика ввода/вывода диска и пользовательских счетчиков (см. ниже). Эти ресурсы могут быть изменены во время запуска контейнера, устраняя необходимость перезагрузки. Каждый контейнер может иметь свои собственные квоты диска, измеряемые с точки зрения блоков диска и инодов (примерное количество файлов). В контейнере можно использовать стандартные инструменты для установки квоты дисков UNIX на пользователя и группу. Планировщик процессора Планировщик процессора в OpenVZ представляет собой двухуровневую реализацию стратегии планирования справедливой доли. На первом уровне планировщик решает, какому контейнеру отдать отрезок времени процессора, исходя из значений cpuunits на каждый контейнер. На втором уровне стандартный планировщик Linux решает, какой процесс будет запущен в этом контейнере, используя стандартные приоритеты процессов Linux. Можно установить различные значения для процессоров в каждом контейнере. Реальное время процессора будет распределено пропорционально этим значениям. Кроме того, OpenVZ предоставляет способы установки строгих ограничений процессора, таких как 10% от общего времени процессора (cpulimit), ограничение количества ядер процессора, доступных для контейнера (cpus), и привязка контейнера к определенному набору процессоров (cpumask). Планировщик ввода-вывода Похожий на CPU-планировщик, описанный выше, планировщик ввода-вывода в OpenVZ также имеет два уровня, используя CFQ I/O планировщик Йенса Аксбо на своем втором уровне. Каждому контейнеру присваивается приоритет ввода-вывода, и планировщик распределяет доступную полосу пропускания ввода-вывода в соответствии с присвоенными приоритетами. Таким образом, ни один контейнер не может насытить канал ввода/вывода. User Beancounters - это набор счетчиков, лимитов и гарантий на каждый контейнер, предназначенных для предотвращения монополизации системных ресурсов одним контейнером. В современных ядрах OpenVZ (на основе RHEL6 042stab*) есть два основных параметра, а другие являются необязательными. Другими ресурсами являются, в основном, память и различные объекты ядра, такие как межпроцессные коммуникации, сегменты общей памяти и сетевые буферы. Каждый ресурс можно увидеть из /proc/user beancounters и имеет пять связанных с ним значений: текущее использование, максимальное использование (на протяжении срока службы контейнера), барьер, лимит и счетчик отказов. Значение барьера и предела зависит от параметров; короче говоря, их можно рассматривать как мягкий предел и жесткий предел. Если какой-либо ресурс достигает предела, счетчик отказов для него увеличивается. Это позволяет владельцу обнаруживать проблемы, контролируя /proc/user beancounters в контейнере.

Контрольные пункты и миграция живых животных

Функция живой миграции и контрольных точек была выпущена для OpenVZ в середине апреля 2006 года. Это позволяет перемещать контейнер с одного физического сервера на другой без отключения контейнера. Процесс известен как контрольная точка: контейнер замораживается, и все его состояние сохраняется в файле на диске. Затем этот файл может быть передан на другую машину, и контейнер может быть разморожен (восстановлен) там; задержка составляет примерно несколько секунд. Поскольку состояние обычно полностью сохраняется, эта пауза может показаться обычной вычислительной задержкой.

Ограничения

По умолчанию, OpenVZ ограничивает доступ контейнера к реальным физическим устройствам (таким образом, делая контейнер аппаратно-независимым). Администратор OpenVZ может разрешить контейнерный доступ к различным реальным устройствам, таким как дисковые накопители, порты USB, устройства PCI или физические сетевые карты. /dev/loopN часто ограничивается в развертывании (поскольку устройства цикла используют потоки ядра, что может быть проблемой безопасности), что ограничивает возможность монтажа изображений диска. Идея состоит в том, чтобы использовать FUSE. OpenVZ ограничивается предоставлением только некоторых технологий VPN, основанных на PPP (таких как PPTP/L2TP) и TUN/TAP. IPsec поддерживается внутри контейнеров с ядра 2.6.32. Графический пользовательский интерфейс под названием EasyVZ был опробован в 2007 году, но он не прогрессировал дальше версии 0.1. До версии 3.4 Proxmox VE мог использоваться в качестве среды виртуализации сервера на основе OpenVZ с графическим интерфейсом, хотя более поздние версии переключились на LXC.