Linux Namespaces — изоляция процессов на уровне ядра

Oct, 24, 2025

🧩 Что такое Linux Namespaces

Namespaces — это механизм ядра Linux, обеспечивающий изоляцию ресурсов между процессами.
Он позволяет каждому процессу (или группе процессов) видеть собственную версию системы — свои PID, сеть, точки монтирования, пользователей и т.д.

📖 Проще говоря, namespace ограничивает видимость системных ресурсов внутри определённого контекста, создавая миниатюрную копию «мира Linux» для процессов.


⚙️ Основная идея

Когда процесс помещён в namespace, ядро переопределяет видимость системных структур, таких как:

  • таблицы процессов,
  • сетевые интерфейсы,
  • файловые точки монтирования,
  • идентификаторы пользователей.

Это обеспечивает логическую изоляцию, которая является фундаментом для технологий вроде Docker, LXC и Kubernetes.


🧱 Типы пространств имён

NamespaceСистемный ключИзолируетПример использования
PIDCLONE_NEWPIDТаблицу процессовКонтейнер видит только свои процессы
NETCLONE_NEWNETСетевые интерфейсы, маршрутыСобственные интерфейсы eth0, lo
UTSCLONE_NEWUTSИмя хоста и доменРазные hostname внутри контейнеров
MNTCLONE_NEWNSТочки монтированияИзолированные файловые системы
IPCCLONE_NEWIPCОчереди сообщений, семафорыИзоляция межпроцессных коммуникаций
USERCLONE_NEWUSERUID/GIDПривилегии root внутри контейнера
CGROUPCLONE_NEWCGROUPКонтрольные группыУправление ресурсами контейнера

🔬 Пример использования

Создадим новый процесс с изолированным пространством имён:

sudo unshare --uts --pid --net --mount --fork /bin/bash

Теперь внутри оболочки:

  • hostname будет локальным для этого окружения,
  • ps покажет ограниченный список процессов,
  • сеть будет отделена от основной системы.

🧠 Как это работает в ядре

Ядро Linux ассоциирует с каждым процессом структуру task_struct, где указатели на пространства имён хранятся в виде ссылок.
Каждый namespace имеет собственный идентификатор и набор объектов, управляемый системой через системные вызовы:

  • clone() — создание нового процесса с namespace,
  • setns() — присоединение к уже существующему,
  • unshare() — выделение новых пространств без порождения процесса.

🔒 Практическая роль

Namespaces обеспечивают:

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

📚 Источники:

Linux Namespaces — изоляция процессов на уровне ядра | Aleksandr Suprun