LXC Linux Containers часть №1. Базовая теория

Виртуализация на уровне ОС (LXC linux containers)

Оглавление

Это наименее требовательная к ресурсам технология виртуализации из существующих сегодня. В отличии от уже привычного варианта, когда виртуализируется оборудование, а не только среда,тут нет гипервизора и не производится эмуляция аппаратного обеспечения. Все экземпляры ОС — контейнеры, используют единое ядро хост-системы и напрямую обращаются к одному и тому же физическому оборудованию. За счет отсутствия слоя виртуализации, достигается максимальная производительность и наивысшая плотность виртуальных серверов на одном физическом. Данная техника работает только в открытых операционных системах таких как Linux (LXC, OpenVZ), FreeBSD (Jail), Solaris (Zones) что является как плюсом, так и минусом. С одной стороны, этим может воспользоваться каждый, но с другой стороны, нет поддержки закрытых ОС (Windows, MacOS). Так же, существует ряд проблем безопасности которым,будет посвящен отдельный раздел.

Что из себя представляет LXC

В первую очередь, хочется сказать, что LXC нельзя рассматривать как законченный продукт. Фактически, это набор из нескольких совершенно самостоятельный функций ядра Linux и пользовательских утилит, которые позволяет удобно, создавать и управлять изолированными контейнерами. Практически вся функциональность LXC представлена такими известными механизмами ядра как cgroups и namespaces.

cgroups (ControlGroups) — позволяет ограничить аппаратные ресурсы некоторого набора процессов. Под аппаратными ресурсами подразумеваются: процессорное время, память, дисковая и сетевая подсистема ввода-вывода. Набор или, другими словами, группа процессов может быть определена по различным критериям. Например, это может быть целая иерархия процессов получающая все лимиты родительского процесса. Кроме этого, возможен подсчет расходуемых группой ресурсов, заморозка (freezing) групп, создание контрольных точек (checkpointing) и их перезагрузка. Для управления этим полезным механизмом служит специальная библиотека libcgroup в состав которой входят такие утилиты как cgcreate, cgexec и некоторые другие.

Namespaces — пространства имен [1]. Эта механизм ядра, который позволяет изолировать процессы друг от друга. Изоляция может быть выполнена в шести контекстах (пространствах имен):

mnt — предоставляет процессам собственную, иерархию файловой системы и изолирует ее от других таких же иерархий. По аналогии с chroot.

pid— изолирует идентификаторы (ID) процессов одного пространства имен от процессов с такими же идентификаторами другого пространства.

net— предоставляет отдельным процессам логически изолированный от других стек сетевых протоколов, сетевой интерфейс, IP-адрес, таблицу маршрутизации, ARP и прочие реквизиты.

ipc — обеспечивает разделяемую память и взаимодействие между процессами,

uts — изоляция идентификаторов узла таких как имя хоста (hostname) и домена (domainname),

user — позволяет иметь один и тот же набор пользователей и групп в рамках разных пространств имен. В каждом контейнере, может быть свой root и любые другие пользователи и группы.

Каждое из этих пространств имен, имеет свою отдельную историю развития. Часть их функциональности появилась еще в ядре 2.6.19, а некоторые возможности добавились лишь в последних версиях (3.8 и выше). В прочем и сам LXC еще в активной разработке. Первый (1.0) стабильный релиз планируется выпустить в составе Ubuntu 14.04. И хотя, LXC уже давно обсуждается технической общественностью и активно используется, еще не все возможности доступны полностью, а API не стабилен. Именно по этой причине, возможности LXC могут сильно меняться от версии к версии.