ОПИСАНИЕ
Пространства
имён
облекают
глобальный
системный
ресурс в
абстрактную
форму, в
которой он
представляется
процессам
внутри
пространства
имён таким
образом,
что
процессы
имеют свои
собственные
изолированные
экземпляры
глобального
ресурса.
Изменения
глобального
ресурса
видимы
другим
процессам,
которые
являются
членами
пространства
имён, и
невидимы
остальным
процессам.
Одно из
применений
пространств
имён —
реализация
контейнеров.
В Linux
предоставляются
следующие
пространства
имён:
| Пространство
имён |
Константа |
Изоляция |
| Cgroup |
CLONE_NEWCGROUP |
корневой
каталог cgroup |
| IPC |
CLONE_NEWIPC |
System V IPC, очереди
сообщений
POSIX |
| Network |
CLONE_NEWNET |
сетевые
устройства,
стеки,
порты … |
| Mount |
CLONE_NEWNS |
точки
монтирования |
| PID |
CLONE_NEWPID |
идентификаторы
процессов |
| User |
CLONE_NEWUSER |
Идентификаторы
пользователей
и групп |
| UTS |
CLONE_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*,
перечисленных
далее, то
для
каждого
флага
создаётся
новое
пространство
имён, и
дочерний
процесс
становится
членом
этих
пространств
имён
(данный
системный
вызов
также
служит для
других
целей, не
относящихся
к
пространствам
имён).
- ioctl(2)
- Для
получения
информации
о
пространствах
имё можно
использовать
различные
операции
ioctl(2). Их можно
найти в ioctl_ns(2).
Для
создания
новых
пространств
имён с
помощью clone(2)
и unshare(2), в
большинстве
случаев,
требуется
мандат CAP_SYS_ADMIN,
так как в
новом
пространстве
имён
создатель
будет
обладать
возможностью
изменять
глобальные
ресурсы,
которые
видимы
другим
процессам,
создаваемым
или
присоединяемым
к
пространству
имён со
временем.
Исключение
составляют
пользовательские
пространства
имён:
начиная с Linux 3.8
для
создания
пользовательского
пространства
имён
особых
прав не
требуется.
Каталог
/proc/[pid]/ns/
Для
каждого
процесса в
/proc/[pid]/ns/ есть
подкаталог,
в котором
содержится
по одной
записи на
каждое
пространство
имён, через
которые
ими можно
управлять
с помощью
setns().
$ ls -l /proc/$$/ns
total 0
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 cgroup -> cgroup:[4026531835]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 mnt -> mnt:[4026531840]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 net -> net:[4026531969]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid -> pid:[4026531836]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid_for_children -> pid:[4026531834]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 user -> user:[4026531837]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 uts -> uts:[4026531838]
При
привязке
монтирования
(bind mounting)
(смотрите
mount(2)) одного
из файлов
этого
каталога в
другое
место в
файловой
системе
данное
пространство
имён
процесса с
pid не
удаляется,
даже если
все
процессы в
пространстве
имён
завершились.
При
открытии
одного из
файлов
этого
каталога
(или файла,
который
был
привязан
монтированием
в один из
этих
файлов)
возвращается
файловый
описатель
соответствующего
пространства
имён
процесса
заданного
pid. Пока
этот
файловый
дескриптор
остаётся
открытым,
пространство
имён будет
оставаться
действующим,
даже если
все
процессы в
пространстве
имён
завершились.
Файловый
дескриптор
может быть
передан в
setns(2).
В Linux 3.7 и
старее эти
файлы
видимы как
жёсткие
ссылки.
Начиная с Linux 3.8
они
представляются
символьными
ссылками.
Если два
процесса
находятся
в одном
пространстве
имён, то
значения
идентификаторов
устройств
и номера
инод их
символьных
ссылок /proc/[pid]/ns/xxx
одинаковы;
приложение
может
проверить
это через
поля stat.st_dev и
stat.st_ino,
возвращаемые
stat(2).
Содержимое
этой
символьной
ссылки
представляет
собой
строку с
типом
пространства
имён и
значением
иноды:
$ readlink /proc/$$/ns/uts
uts:[4026531838]
В этом
подкаталоге
содержатся
символические
ссылки:
- /proc/[pid]/ns/cgroup
(начиная с Linux
4.6)
- Данный
файл
является
описателем
пространства
имён cgroup
этого
процесса.
- /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
этого
процесса.
Данный
описатель
постоянен
на
протяжении
всей жизни
процесса
(т. е.,
членство
пространства
имён PID
процесса
никогда не
меняется).
- /proc/[pid]/ns/pid_for_children
(начиная с Linux
4.12)
- Этот файл
является
описателем
пространства
имён PID
дочерних
процессов,
созданных
этим
процессом.
Он может
изменяться
послевызовов
unshare(2) и setns(2)
(смотрите
pid_namespaces(7)),
поэтому
файл может
отличаться
от /proc/[pid]/ns/pid.
Данные по
символьной
ссылке
появляются
только
после
создания в
пространстве
имён
первого
дочернего
процесса
(до этого
вызов readlink(2) с
символьной
ссылкой
вернёт
пустой
буфер).
- /proc/[pid]/ns/user
(начиная с Linux
3.8)
- Данный
файл
является
описателем
пространства
имён user
этого
процесса.
- /proc/[pid]/ns/uts
(начиная с Linux
3.0)
- Данный
файл
является
описателем
пространства
имён UTS
этого
процесса.
Право
разыменовывать
или читать
(readlink(2)) данные
символические
ссылки
определяется
проверкой
режима
доступа ptrace
PTRACE_MODE_READ_FSCREDS;
смотрите
ptrace(2).
Каталог
/proc/sys/user
Файлы в
каталоге
/proc/sys/user
(появился в
Linux начиная с
версии 4.9)
отражают
ограничения
на
количество
пространств
имён
различных
типов,
которые
могут быть
созданы.
Файлы:
- max_cgroup_namespaces
- Значение в
этом файле
определяет
ограничение
по каждому
пользователю
на
количество
пространств
имён cgroup,
которые
могут быть
созданы в
пространстве
имён
пользователя.
- max_ipc_namespaces
- Значение в
этом файле
определяет
ограничение
по каждому
пользователю
на
количество
пространств
имён ipc,
которые
могут быть
созданы в
пространстве
имён
пользователя.
- max_mnt_namespaces
- Значение в
этом файле
определяет
ограничение
по каждому
пользователю
на
количество
пространств
имён
монтирования,
которые
могут быть
созданы в
пространстве
имён
пользователя.
- max_net_namespaces
- Значение в
этом файле
определяет
ограничение
по каждому
пользователю
на
количество
сетевых
пространств
имён,
которые
могут быть
созданы в
пространстве
имён
пользователя.
- max_pid_namespaces
- Значение в
этом файле
определяет
ограничение
по каждому
пользователю
на
количество
пространств
имён pid,
которые
могут быть
созданы в
пространстве
имён
пользователя.
- max_user_namespaces
- Значение в
этом файле
определяет
ограничение
по каждому
пользователю
на
количество
пользовательских
пространств
имён,
которые
могут быть
созданы в
пространстве
имён
пользователя.
- max_uts_namespaces
- Значение в
этом файле
определяет
ограничение
по каждому
пользователю
на
количество
пространств
имён uts,
которые
могут быть
созданы в
пространстве
имён
пользователя.
Замечания
к этим
файлам:
- Значения в
этих
файлам
могут
изменяться
привилегированными
процессами.
- Значения,
отражаемые
в этих
файлах,
являются
ограничениями
пользовательского
пространства
имён, в
котором
располагается
открывающий
процесс.
- Ограничение
устанавливается
по каждому
пользователю
отдельно.
Каждый
пользователь
в одном
пространстве
имён
пользователя
может
создать
столько
пространств
имён,
сколько
допускается
это
ограничение.
- Ограничения
применяются
ко всем
пользователям,
даже
имеющим UID 0.
- Эти
ограничения
применяются
в
дополнении
к другим
накладываемым
ограничениям,
касающимся
каждого
пространства
имён
(например,
для
пользовательского
пространства
имён и
пространства
имён PID).
- При
достижении
этих
ограничений
вызовы clone(2) и
unshare(2)
завершаются
ошибкой
ENOSPC.
- Для
первоначального
пространства
пользовательского
пространства
имён
значение
по
умолчанию
в каждом
файле
равно
половине
ограничения
на
количество
нитей,
которые
могут быть
созданы
(/proc/sys/kernel/threads-max). В
всех
дочерних
пользовательских
пространств
имён
значение
по
умолчанию
каждого
файла
равно MAXINT.
- Когда
пространство
имён
создаётся,
этот
объект
также
учитывается
в
родительских
пространствах
имён. То
есть:
- +
- Каждое
пользовательское
пространство
имён имен
создателя
UID.
- +
- Когда
пространство
имён
создаётся,
это
учитывается
в UID
создателя
в каждом
родительском
пользовательском
пространстве
имён, и
ядро
проверяет,
что
соответствующее
ограничение
на
пространство
имён для UID
создателя
не
превысило
значение в
родительском
пространстве
имён.
- +
- Это
гарантирует,
что
созданием
нового
пользовательского
пространства
имён
нельзя
воспользоваться
для выхода
за
ограничения,
установленные
для
текущего
пользователя.
Пространства
имён 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.
Пространства
имён UTS (CLONE_NEWUTS)
Пространства
имён UTS
изолируют
два
системных
идентификатора:
имя узла и
доменное
имя NIS. Эти
идентификаторы
задаются с
помощью
sethostname(2) и setdomainname(2), и
могут быть
получены с
помощью uname(2),
gethostname(2) и getdomainname(2).
Для
использования
пространств
имён UTS
требуется,
чтобы ядро
было
собрано с
параметром
CONFIG_UTS_NS.
Время
жизни
пространства
имён
При
отсутствии
других
факторов,
пространство
имён
автоматически
удаляется,
когда
последний
процесс в
пространстве
имён
завершается
или
покидает
его. Однако
есть
несколько
факторов,
которые
могут
задержать
существование
пространства
имён даже
при
отсутствии
процессов
в нём. К
таким
факторам
относятся
следующие:
- Существуют
открытый
дескриптор
файла или
привязанное
монтирование
для
соответствующего
файла /proc/[pid]/ns/*.
- Пространство
имён
иерархично
(т. е.,
пространство
имён PID или
пользовательское)
и имеет
дочернее
пространство
имён.
- Это
пользовательское
пространство
имен,
которое
владеет
одним или
несколькими
непользовательскими
пространствами
имён.
- Это
пространство
имён PID и
существует
процесс,
который
ссылается
на
пространство
имён через
символьную
ссылку
/proc/[pid]/ns/pid_for_children.
- Это
пространство
имён IPC и
соответствующее
монтирование
файловой
системы mqueue
(смотрите
mq_overview(7))
ссылается
на это
пространство
имён.
- Это
пространство
имён PID и
соответствующее
монтирование
файловой
системы proc(5)
ссылается
на это
пространство
имён.