← Назад к вопросам

Какие знаешь пространства, которые изолирует namespace в Linux?

2.2 Middle🔥 182 комментариев
#Linux и администрирование#Docker и контейнеризация

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пространства (namespaces) в Linux: полный обзор изоляции

В Linux namespaces — это фундаментальный механизм ядра для обеспечения изоляции различных системных ресурсов между группами процессов. Это ключевая технология, лежащая в основе контейнеризации (Docker, LXC) и современных облачных сред. Каждый тип namespace изолирует определённый аспект системы, позволяя процессам в разных namespace иметь собственное независимое представление об этом ресурсе. Вот полный перечень основных пространств:

PID (Process ID) namespace

Изолирует пространство идентификаторов процессов. Процессы в разных PID namespace имеют свои собственные наборы PID, начинающиеся с 1. Это позволяет изолированному процессу "видеть" себя как PID 1 (как init/systemd), не видя процессы хостовой системы.

# Пример создания нового PID namespace
unshare --fork --pid --mount-proc bash
ps aux  # Покажет только процессы внутри нового namespace

Mount (mnt) namespace

Изолирует точки монтирования файловых систем. Процессы могут иметь разные представления о смонтированных файловых системах, что позволяет создавать изолированные корневые файловые системы (rootfs).

# Создание нового mount namespace с частной файловой системой
unshare --mount --root /tmp/container_root bash
mount -t proc proc /proc  # Монтируем proc только внутри namespace

Network (net) namespace

Изолирует сетевые стеки: сетевые интерфейсы, таблицы маршрутизации, правила iptables/nftables, порты. Это основа сетевой изоляции контейнеров.

# Создание изолированной сети
ip netns add mynetns
ip netns exec mynetns ip link list  # Покажет только интерфейсы внутри namespace

UTS (Unix Time-sharing System) namespace

Изолирует системные идентификаторы — имя хоста (hostname) и доменное имя (domainname). Позволяет контейнеру иметь собственное hostname, независимое от хостового.

# Изменение hostname только внутри namespace
unshare --uts bash
hostname mycontainer  # Не повлияет на основной хост

IPC (Inter-Process Communication) namespace

Изолирует межпроцессное взаимодействие: сегменты System V IPC и очереди сообщений POSIX. Процессы в разных IPC namespace не могут общаться через эти механизмы.

# Изоляция IPC ресурсов
unshare --ipc bash
ipcs  # Покажет только IPC объекты внутри namespace

User namespace

Изолирует пространство пользователей и групп. Позволяет отображать UID/GID внутри контейнера на другие UID/GID на хосте. Это критически важно для безопасности, так как процесс может иметь root-привилегии внутри namespace, будучи непривилегированным пользователем на хосте.

# Создание namespace с отображением пользователей
unshare --user --map-root-user bash
id  # Покажет root внутри namespace, но на хосте это обычный пользователь

Cgroup namespace

Изолирует представление о cgroup-иерархии. Позволяет процессам видеть только свою часть иерархии cgroup, скрывая общую структуру контроллеров cgroup хоста.

Time namespace

Новейший тип (добавлен в ядро 5.6), изолирует системные часы. Позволяет настраивать независимые смещения времени для контейнеров, что полезно для отладки, тестирования или изоляции временных атак.

Практическое применение и важные особенности:

  1. Комбинированное использование: Namespaces обычно используются вместе. Например, типичный контейнер создаётся с комбинацией PID, Mount, Network, UTS, IPC и User namespace.

  2. Иерархия и наследование: Namespaces могут быть вложенными — дочерние процессы наследуют namespace родителя, но могут создавать свои собственные.

  3. Управление через системные вызовы:

    • clone() — создание процесса в новых namespace
    • unshare() — отсоединение от текущих namespace
    • setns() — присоединение к существующему namespace
  4. Инструментарий:

    • lsns — просмотр существующих namespace
    • nsenter — вход в существующий namespace
    • /proc/<pid>/ns/ — символические ссылки на namespace процесса

Ключевое значение для DevOps: Понимание namespace необходимо для эффективной работы с контейнерами, оркестраторами (Kubernetes), обеспечения безопасности (через User namespace) и отладки сложных сценариев изоляции. Например, при проблемах с сетевым соединением в контейнере нужно понимать, что он работает в отдельном Network namespace со своими правилами маршрутизации и firewall.