namespaces(7) обзор пространств имён Linux

ОПИСАНИЕ

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

В Linux предоставляются следующие пространства имён:

Пространство имёнКонстантаИзолирует
IPCCLONE_NEWIPCSystem V IPC, очереди сообщений POSIX
NetworkCLONE_NEWNETсетевые устройства, стеки, порты …
MountCLONE_NEWNSточки монтирования
PIDCLONE_NEWPIDID процессов
UserCLONE_NEWUSERID пользователей и групп
UTSCLONE_NEWUTSимя узла и доменное имя NIS

В этой странице описаны различные пространства имён и связанные с ними файлы в /proc, а также кратко представлен программный интерфейс.

Программный интерфейс пространств имён

и различные файлы в /proc описаны далее. В API пространств имён имеются следующие системные вызовы:
clone(2)
Системный вызов clone(2) создаёт новый процесс. Если в аргументе flags указан один или несколько флагов CLONE_NEW*, перечисленных далее, то для каждого флага создаётся новое пространство имён, и дочерний процесс становится членом этих пространств имён (данный системный вызов также служит для других целей, не относящихся к пространствам имён).
setns(2)
Системный вызов setns(2) позволяет вызывающему процессу присоединиться к существующему пространству имён. Требуемое пространство имён указывается через файловый дескриптор, который ссылается на один из файлов /proc/[pid]/ns, описанных далее.
unshare(2)
Системный вызов unshare(2) перемещает вызывающий процесс в новое пространство имён. Если в аргументе flags указан один или несколько флагов CLONE_NEW*, перечисленных далее, то для каждого флага создаётся новое пространство имён, и дочерний процесс становится членом этих пространств имён (данный системный вызов также служит для других целей, не относящихся к пространствам имён).

Для создания новых пространств имён с помощью clone(2) и unshare(2), в большинстве случаев, требуется мандат CAP_SYS_ADMIN. Для пространств имён user сделано исключение: начиная с Linux 3.8 для создания пространства имён user прав не требуется.

Каталог /proc/[pid]/ns/

Для каждого процесса в /proc/[pid]/ns/ есть подкаталог, в котором содержится по одной записи на каждое пространство имён, через которые ими можно управлять с помощью setns().

$ ls -l /proc/$$/ns
total 0
lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 mnt -> mnt:[4026531840]
lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 net -> net:[4026531956]
lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 pid -> pid:[4026531836]
lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 user -> user:[4026531837]
lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 uts -> uts:[4026531838]

При привязке монтирования (bind mounting) (смотрите mount(2)) одного из файлов этого каталога в другое место в файловой системе данное пространство имён процесса с pid не удаляется, даже если все процессы в пространстве имён завершились.

При открытии одного из файлов этого каталога (или файла, который был привязан монтированием в один из этих файлов) возвращается файловый описатель соответствующего пространства имён процесса заданного pid. Пока этот файловый дескриптор остаётся открытым, пространство имён будет оставаться действующим, даже если все процессы в пространстве имён завершились. Файловый дескриптор может быть передан в setns(2).

В Linux 3.7 и старее эти файлы видимы как жёсткие ссылки. Начиная с Linux 3.8 они представляются символьными ссылками. Если два процесса имеют одно пространство имён, то значения inode их символьных ссылок /proc/[pid]/ns/xxx одинаковы; приложение может проверить это через поле stat.st_ino, возвращаемое stat(2). Содержимое этой символьной ссылки представляет собой строку с типом пространства имён и значением inode:

$ readlink /proc/$$/ns/uts
uts:[4026531838]

В этом подкаталоге содержатся следующие файлы:

/proc/[pid]/ns/ipc (начиная с Linux 3.0)
Данный файл является описателем пространства имён IPC этого процесса.
/proc/[pid]/ns/mnt (начиная с Linux 3.8)
Данный файл является описателем пространства имён mount этого процесса.
/proc/[pid]/ns/net (начиная с Linux 3.0)
Данный файл является описателем пространства имён network этого процесса.
/proc/[pid]/ns/pid (начиная с Linux 3.8)
Данный файл является описателем пространства имён PID этого процесса.
/proc/[pid]/ns/user (начиная с Linux 3.8)
Данный файл является описателем пространства имён user этого процесса.
/proc/[pid]/ns/uts (начиная с Linux 3.0)
Данный файл является описателем пространства имён UTS этого процесса.

Пространства имён IPC (CLONE_NEWIPC)

Пространства имён IPC изолируют определённые ресурсы IPC, а именно IPC-объекты System V (смотрите svipc(7)) и (начиная с Linux 2.6.30) очереди сообщений POSIX (смотрите mq_overview(7)). Общая характеристика этих механизмов IPC в том, что объекты IPC распознаются механизмами не как пути файловой системы.

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

Следующие интерфейсы /proc отличаются в каждом пространстве имён IPC:

*
Интерфейсы очереди сообщений POSIX в /proc/sys/fs/mqueue.
*
IPC-интерфейсы System V в /proc/sys/kernel, а именно: msgmax, msgmnb, msgmni, sem, shmall, shmmax, shmmni и shm_rmid_forced.
*
IPC-интерфейсы System V в /proc/sysvipc.

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

Для использования пространств имён IPC требуется, чтобы ядро было собрано с параметром CONFIG_IPC_NS.

Пространства имён network (CLONE_NEWNET)

Пространства имён network изолируют системные ресурсы, относящиеся к сети: сетевые устройства, стеки протоколов IPv4 и IPv6, таблицы маршрутизации IP, межсетевые экраны, каталог /proc/net, каталог /sys/class/net, номера портов (сокеты) и тому подобное. Физическое сетевое устройство может находиться только в одном пространстве имён network. Пара виртуальных сетевых устройств («veth») предоставляет канальную абстракцию, которая может использоваться для создания туннелей между пространствами имён network и может использоваться для создания моста к физическому сетевому устройству в другом пространстве имён.

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

Для использования пространств имён network требуется, чтобы ядро было собрано с параметром CONFIG_NET_NS.

Пространства имён mount (CLONE_NEWNS)

Пространства имён mount изолируют набор точек монтирования файловой системы, то есть процессы в разных пространствах имён mount могут иметь различный вид иерархии файловой системы. Набор точек монтирования в пространстве имён mount изменяется с помощью mount(2) и umount(2).

В файле /proc/[pid]/mounts (начиная с Linux 2.4.19) содержится список всех смонтированных файловых систем в пространстве имён mount процесса. Формат файла описан в fstab(5). Начиная с ядра версии 2.6.15, этот файл можно опрашивать: после открытия файла на чтение, изменение в этом файле (т. е., монтирование или размонтирование файловой системы) заставляет select(2) пометить файловый дескриптор как доступный для чтения, а poll(2) и epoll_wait(2) помечают файл как имеющий ошибочное состояние.

Через файл /proc/[pid]/mountstats (начиная с Linux 2.6.17) экспортируется информация (статистика, параметры настройки) о точках монтирования в пространстве имён mount процесса. Этот файл доступен только для чтения владельцу процесса. Строки в файле имеют вид:

device /dev/sda7 mounted on /home with fstype ext3 [statistics]
(       1      )            ( 2 )             (3 ) (4)

Поля каждой строки:

(1)
Имя смонтированного устройства (или «nodevice», если нет соответствующего устройства).
(2)
Точка монтирования в дереве файловой системы.
(3)
Тип файловой системы.
(4)
Необязательная статистика и информация о настройке. В настоящее время (Linux версии 2.6.26), в этом поле доступна только информация об экспортируемых файловых системах NFS.

Пространства имён PID (CLONE_NEWPID)

Смотрите pid_namespaces(7).

Пространства имён user (CLONE_NEWUSER)

Смотрите user_namespaces(7).

Пространства имён UTS (CLONE_NEWUTS)

Пространства имён UTS изолируют два системных идентификатора: имя узла и доменное имя NIS. Эти идентификаторы задаются с помощью sethostname(2) и setdomainname(2), и могут быть получены с помощью uname(2), gethostname(2) и getdomainname(2).

Для использования пространств имён UTS требуется, чтобы ядро было собрано с параметром CONFIG_UTS_NS.

СООТВЕТСТВИЕ СТАНДАРТАМ

Пространства имён есть только в Linux.

ПРИМЕР

Смотрите user_namespaces(7).