Namespaces
Механизм ядра, изолирующий глобальные системные ресурсы для группы процессов. Каждый процесс видит собственный набор: PID, сеть, точки монтирования, UID/GID, hostname и др. Основа для контейнерных технологий (Docker, LXC, Podman, Kubernetes).
Типы пространств имён
| Namespace | Флаг clone | Изолирует | Введён в ядре |
|---|---|---|---|
| Mount | CLONE_NEWNS | Точки монтирования | 2.4.19 |
| UTS | CLONE_NEWUTS | hostname, domainname | 2.6.19 |
| IPC | CLONE_NEWIPC | System V IPC, POSIX message queues | 2.6.19 |
| PID | CLONE_NEWPID | Дерево PID | 2.6.24 |
| Network | CLONE_NEWNET | Сетевые устройства, стек, порты, маршруты | 2.6.29 |
| User | CLONE_NEWUSER | UID/GID, capabilities | 3.8 |
| Cgroup | CLONE_NEWCGROUP | Корень cgroup-иерархии | 4.6 |
| Time | CLONE_NEWTIME | CLOCK_MONOTONIC, CLOCK_BOOTTIME | 5.6 |
Системные вызовы
clone(2)/clone3(2)— создать процесс в новых namespaces (флагиCLONE_NEW*).unshare(2)— отделить вызывающий процесс в новые namespaces.setns(2)— присоединить процесс к существующему namespace по fd из/proc/[pid]/ns/<type>.ioctl_ns(2)— навигация по иерархии user/PID namespaces.
Пример
sudo unshare --uts --pid --net --mount --fork /bin/bash
Внутри:
hostnameлокальный;psвидит только процессы нового PID namespace;- сетевой стек отдельный (без интерфейсов, кроме настроенных вручную).
Представление в /proc
Каждый namespace представлен symlink в /proc/[pid]/ns/:
/proc/self/ns/mnt -> mnt:[4026531840]
/proc/self/ns/pid -> pid:[4026531836]
/proc/self/ns/net -> net:[4026531992]
/proc/self/ns/user -> user:[4026531837]
Inode в скобках — идентификатор namespace; одинаковый inode означает один и тот же namespace.