Пространство имён (от ) — функция ядра Linux, позволяющая изолировать и виртуализировать глобальные системные ресурсы множества процессов. Примеры ресурсов, которые можно виртуализировать: идентификаторы процессов, имена узлов, идентификаторы пользователей, доступ к сетям, межпроцессное взаимодействие и файловые системы. Одной из основных целей поддержки пространств имён (наряду с контрольными группами) является реализация контейнеров — инструмента для виртуализации на уровне операционной системы, обеспечивающего изоляцию групп процессов и связанных с ними ресурсов от других.

История Идеи, лежащие в основе механизма пространств имён, исходят из ранних операционных систем. В Unix в 1979 году был добавлен системный вызов chroot() («смена корня») с целью обеспечить изоляцию части файловой системы и предоставить «площадку для тестирования», отделённую от основной системы.

Пространства имён появились в 2002 году в версии ядра 2.4.19. Дополнительные пространства имён были добавлены в 2006 году и продолжали добавляться в последующих выпусках. Достаточная функциональность для полной изоляции и безопасной работы контейнеров была завершена в ядре версии 3.8 с введением пространств имён пользователей, а с поддержкой изоляции пространств имён для контрольных групп в версии 4.6 обеспечены максимальные возможности по изоляции:

+Появление каждого пространства имёнПространство имёнВерсия ядраГодФайловая система (Mount)2.4.192002Изоляция имени узла (UTS)2.6.192006ID процессов (PID)2.6.242008Сети (Network) (net)2.6.292009Межпроцессное взаимодействие (IPC)2.6.302009Пользовательские ID (User)3.82013Изоляция контрольных групп4.62016

Виды пространства имён Linux-система при старте инициализирует один экземпляр каждого типа пространства имён, кроме пространства имён файловой системы. После инициализации можно создать или объединить дополнительные пространства имён.

Все пространства имён поддерживают вложенность, то есть между ними можно установить связь «родитель — потомок». Таким образом некоторые пространства наследуют все свойства от своего родительского пространства имён. Однако это верно не для всех пространств.

Функциональные возможности пространства имён одинаковы для всех типов: каждый процесс связан с пространством имён и может видеть или использовать только ресурсы, связанные с этим пространством имён, и, где это применимо, — с его потомками. Таким образом, каждый процесс (или его группа) может иметь уникальное представление о ресурсе. Изолированный ресурс зависит от типа пространства имён, созданного для данной группы процессов.

Файловая система (Mount) Пространство имён файловой системы — это независимое дерево файловой системы, ассоциированное с определённой группой процессов.

Каждое пространство имён предоставляет уникальный вид файловой системы для всех процессов, принадлежащих этому пространству.

При создании новых пространств можно установить флаг для копирования списка точек монтирования из родительского пространства. Однако последующие операции по монтированию и размонтированию в одном пространстве никак не сказываются на других пространствах (в том числе — и на родительском, и на потомке). Но между пространствами можно установить связь «ведущий — ведомый», и тогда все действия, связанные с монтированием, в пространстве ведущего распространяются и на пространства, помеченные как ведомые. Обратные операции, то есть операции в пространстве ведомого, никак не влияют на пространство ведущего. Такая возможность позволяет сразу монтировать новое устройство в несколько пространств имён файловой системы вместо его монтирования в каждом отдельном пространстве.

Пространство имён файловой системы было первым типом пространств имён, выполненных в версии Linux 2.4.19 в 2002 году.

UTS Пространство имён UTS (Unix Time Sharing) используется для изоляции двух конкретных элементов системы, относящихся к системному вызову uname().

Система характеризуется системным вызовом uname(). uname() возвращает структуру utsname, состоящую из 6 строк, описывающих текущую систему: sysname[], nodename[], release[], version[], machine[], domainname[]. При этом из них только два элемента изменяются во время выполнения, nodename[] и domainname[]. nodename[] это имя хоста системы, а domainname[] это доменное имя NIS. Пространство имён UTS изолирует эти два системных идентификатора nodename[] и domainname[]. В контейнеризации функция пространства имён UTS позволяет каждому контейнеру иметь свое имя хоста и имя домена.

Для существования нескольких экземпляров пространств имён UTS происходит выделение новых экземпляров структуры utsname в ядре для каждого экземпляра такого пространства и изменение системных вызовов, которые изменяют значения пространства, для поиска подходящего экземпляра структуры utsname в качестве текущего.

Пространство имён UTS впервые появилось сборке ядра Linux 2.6.19.

ID процессов (PID) Пространство имён PID изолирует пространство ID процессов, это означает, что процессы в различных пространствах могут иметь одинаковые ID. Однако в пространстве имён хоста все процессы имеют уникальные идентификаторы, таким образом необходимо разделять идентификатор внутри определённого пространства и снаружи этого пространства, то есть в хостовой машине.

В новом пространстве имён первый процесс является инициализирующим или init-процессом для этого пространства и имеет PID 1. При завершении init-процесса ядро завершает все процессы, принадлежащие одному пространству через сигнал SIGKILL.

Пространство имён ID процессов впервые появилось в версии ядра 2.6.24. Однако оно было отмечено как «экспериментальное», с тем чтобы предотвратить его широкое развертывание дистрибьюторами, в то время как некоторые остающиеся вопросы решаются.

Сети (Network) Пространство имён для сетей предоставляет изоляцию систем ресурсов, связанных с сетями: сетевое оборудование, стеки протоколов IPv4 и IPv6, таблицы IP-маршрутизации, файрволы, номера портов (сокеты) и другие.

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

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

Впервые появилось в версии ядра 2.6.24. Однако было полностью закончено только в версии 2.6.29.

Межпроцессное взаимодействие (IPC) System V IPC включает в себя семафоры, разделяемую память и очереди сообщений. Каждый ресурс межпроцессного взаимодействия должен иметь свой уникальный идентификатор (ID). Это позволяет процессам, взаимодействующим между собой, обращаться к общему ресурсу. И для изоляции таких ресурсов было создано пространство имён IPC.

Каждое пространство имён IPC имеет свой собственный набор идентификаторов System V IPC и свою собственную систему очередей сообщений POSIX. Объекты, созданные в этом пространстве имён, видны всем процессам, состоящим в этом пространстве, и не видны всем остальным процессам в других пространствах имён.

Новое пространство имён создаётся без каких-либо объектов, вместо копирования объектов от своего родительского пространства. Когда пространство имён IPC разрушается (то есть когда последний процесс, состоящий в этом пространстве, завершается), все IPC-объекты в этом пространстве автоматически уничтожаются.

Пространство имён IPC впервые было представлено в версии ядра 2.6.19 для семафоров и разделяемой памяти. В версии 2.6.30 также были добавлены очереди сообщений POSIX.

Пользовательские ID (User) Пространства имён пользователей изолируют ID пользователей и групп, корневой каталог, ключи и capabilities. Идентификаторы пользователя и группы процесса могут отличаться внутри и вне пространства имён пользователей. В частности, процесс может иметь непривилегированное ID пользователя вне пространства имён пользователей, пока в то же время иметь ID root внутри пространства, то есть процесс имеет полные привилегии для операций внутри пространства имён.

Пространства имён могу быть вложенными, это означает, что каждое пространство имён пользователя (за исключением инициализирующего пространства) имеет родительское пространство и может иметь ноль или несколько дочерних пространств. Ядро накладывает лимит в 32 вложенных уровня пространств имён пользователей начиная с версии 3.11.

Пространство имён пользователей впервые было представлено в версии ядра 3.8.

Контрольные группы (Cgroup) Пространство имён cgroup скрывает, к какой контрольной группе принадлежит процесс. В таком пространстве имён процесс, проверяя, к какой контрольной группе он относится, увидит путь относительно контрольной группы, установленной при создании. Таким образом, процесс считает, что принадлежит к корневой контрольной группе, а полный путь к контрольной группе оказывается скрыт. Пространство имён cgroup было представлено в версии ядра 4.6 в марте 2016.

Время (Time) Пространство имён времени позволяет процессам видеть различное системное время подобно тому, как пространство имён UTS изолирует имя хоста. Пространство имён времени было предложено в 2018 и стало доступно в версии ядра 5.6 (март 2020).

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

Изоляция процессов Технология контейнеризации обеспечивает изоляцию процессов путём переноса процессов, запущенных в контейнере, в собственное пространство имён и ограничения прав и видимости процессов, запущенных в других контейнерах и на самой хостовой машине. Этот механизм работает при поддержке пространства имён PID, которое изолирует пространство идентификаторов процесса контейнера от пространства хоста. Поскольку пространство имён PID иерархичное, то процесс может видеть только процессы в своём собственном пространстве имён, либо в его «дочернем» пространстве имён. Вследствие этого, после создания и присвоения пространства имён контейнеру, хостовая машина может видеть и взаимодействовать с пространством идентификаторов процесса контейнера, но процесс внутри контейнера не может видеть и что-либо делать с пространством хоста или другого контейнера.

Изоляция файловой системы Для достижения защищённости контейнеров и хостовой машины от нелегитимных процессов и модификаций с файловой системой необходима изоляция файловых систем.

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

Изоляция IPC Процессы, запущенные в контейнерах, должны быть ограничены так, чтобы они могли взаимодействовать только через определённый набор ресурсов IPC и им было запрещено вмешиваться в работу других контейнеров и хост-машины.

Технология контейнеризации достигает изоляции IPC использованием пространства имён IPС. Процесс в пространстве имён IPC не может писать или читать IPC-ресурсы, принадлежащие другому пространству имён. Технология контейнеризации присваивает свое пространство имён IPC каждому контейнеру, таким образом, не давая процессам в контейнере вмешиваться в другие контейнеры.

Изоляция сетей