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

В каком namespace существуют системные ресурсы

1.6 Junior🔥 141 комментариев
#Kubernetes

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

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

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

Пространства имён (Namespaces) в Linux: системные ресурсы

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

Ключевые типы Namespace в Linux

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

  1. PID (Process ID): Изолирует дерево процессов. Процессы в разных PID namespace имеют свои независимые наборы идентификаторов (PID). Процесс может иметь PID=1 внутри своего namespace, но совсем другой PID в родительском namespace.

  2. Network (net): Изолирует сетевые ресурсы: сетевые интерфейсы, таблицы маршрутизации, правила iptables, порты. Контейнер в своём net namespace может иметь свой lo и eth0, невидимые хосту.

  3. Mount (mnt): Изолирует точки монтирования файловой системы. Процесс видит свой собственный корень файловой системы (/) и набор смонтированных файловых систем.

  4. UTS (Unix Timesharing System): Изолирует системные идентификаторы nodename (имя хоста) и domainname. Позволяет контейнеру иметь собственное hostname.

  5. IPC (Inter-Process Communication): Изолирует объекты межпроцессного взаимодействия, такие как очереди сообщений, сегменты разделяемой памяти и семафоры.

  6. User: Изолирует таблицы идентификаторов пользователей и групп. Пользователь и группа с UID/GID=1000 внутри контейнера могут быть отображены на UID/GID=5000 на хосте для повышения безопасности.

  7. Cgroup: Изолирует представление о группе управления ресурсами (cgroup) процесса, позволяя контейнеру видеть только своё поддерево cgroup.

  8. Time (начиная с ядра 5.6): Позволяет изолировать системные часы для контейнера, давая возможность смещать или изменять скорость времени внутри него (для тестирования, отладки).

Как это работает: Init Namespace и создание новых

  • Исходное пространство (Root/Init Namespace): При загрузке системы ядро создаёт одно пространство каждого типа по умолчанию (init namespace). Все процессы системы стартуют здесь.
  • Создание новых пространств: С помощью системного вызова clone() (с флагами типа CLONE_NEWPID, CLONE_NEWNET и др.) или unshare() можно создать новый процесс в новых изолированных пространствах имён.

Пример создания нового PID и UTS namespace с помощью утилиты unshare:

# Запускаем оболочку bash в новых PID и UTS namespaces.
# --fork необходим для корректной работы нового PID namespace.
# --mount-proc смонтирует новый procfs, чтобы команды вроде 'ps' работали корректно.
sudo unshare --pid --uts --fork --mount-proc /bin/bash

# Теперь внутри этой оболочки:
hostname my-new-container  # Меняем hostname только в этом UTS namespace.
ps aux  # Видим только несколько процессов (в основном, наш bash и ps). PID 1 — это наш bash.

Просмотр привязки процессов к namespace: Каждому namespace соответствует файл в директории /proc/<PID>/ns/.

# Просмотр namespace текущего процесса (самого bash)
ls -la /proc/$$/ns/
# Выведет что-то вроде:
# lrwxrwxrwx 1 root root 0 Apr 10 12:00 cgroup -> 'cgroup:[4026531835]'
# lrwxrwxrwx 1 root root 0 Apr 10 12:00 ipc -> 'ipc:[4026531839]'
# lrwxrwxrwx 1 root root 0 Apr 10 12:00 mnt -> 'mnt:[4026531840]'
# lrwxrwxrwx 1 root root 0 Apr 10 12:00 net -> 'net:[4026531992]'
# lrwxrwxrwx 1 root root 0 Apr 10 12:00 pid -> 'pid:[4026531836]'
# ...
# Число в квадратных скобках — уникальный идентификатор namespace. Процессы с одинаковым ID находятся в одном namespace.

# Для просмотра namespace другого процесса (например, контейнера Docker)
docker inspect --format '{{.State.Pid}}' <container_name>  # Узнаем PID процесса контейнера на хосте
ls -la /proc/<CONTAINER_PID>/ns/

Практическое значение для DevOps

  • Основа контейнеризации (Docker, containerd): Контейнер — это, по сути, процесс (или группа процессов), запущенный в своём наборе изолированных namespace, часто комбинируемых с cgroups для ограничения ресурсов.
  • Безопасность: Изоляция снижает атакуемую поверхность. Компрометация процесса в контейнере не даёт прямого доступа к сетевому стеку хоста или файловой системе (если не смонтировано явно).
  • Управляемость: Позволяет запускать несколько экземпляров одного приложения (с одним сетевым портом, одним hostname) на одной машине без конфликтов.
  • Масштабирование: Namespaces — низкоуровневый строительный блок, позволяющий оркестраторам (Kubernetes) безопасно запускать сотни рабочих нагрузок на одном узле.

Таким образом, системные ресурсы не существуют в каком-то одном namespace, а распределены по множеству изолированных экземпляров пространств имён. Init namespace — это корневое пространство хоста, от которого "отпочковываются" все остальные для обеспечения изоляции контейнеров и других процессов.