🧩 Что такое Linux Namespaces
Namespaces — это механизм ядра Linux, обеспечивающий изоляцию ресурсов между процессами.
Он позволяет каждому процессу (или группе процессов) видеть собственную версию системы — свои PID, сеть, точки монтирования, пользователей и т.д.
📖 Проще говоря, namespace ограничивает видимость системных ресурсов внутри определённого контекста, создавая миниатюрную копию «мира Linux» для процессов.
⚙️ Основная идея
Когда процесс помещён в namespace, ядро переопределяет видимость системных структур, таких как:
- таблицы процессов,
- сетевые интерфейсы,
- файловые точки монтирования,
- идентификаторы пользователей.
Это обеспечивает логическую изоляцию, которая является фундаментом для технологий вроде Docker, LXC и Kubernetes.
🧱 Типы пространств имён
| Namespace | Системный ключ | Изолирует | Пример использования |
|---|---|---|---|
| PID | CLONE_NEWPID | Таблицу процессов | Контейнер видит только свои процессы |
| NET | CLONE_NEWNET | Сетевые интерфейсы, маршруты | Собственные интерфейсы eth0, lo |
| UTS | CLONE_NEWUTS | Имя хоста и домен | Разные hostname внутри контейнеров |
| MNT | CLONE_NEWNS | Точки монтирования | Изолированные файловые системы |
| IPC | CLONE_NEWIPC | Очереди сообщений, семафоры | Изоляция межпроцессных коммуникаций |
| USER | CLONE_NEWUSER | UID/GID | Привилегии root внутри контейнера |
| CGROUP | CLONE_NEWCGROUP | Контрольные группы | Управление ресурсами контейнера |
🔬 Пример использования
Создадим новый процесс с изолированным пространством имён:
sudo unshare --uts --pid --net --mount --fork /bin/bash
Теперь внутри оболочки:
hostnameбудет локальным для этого окружения,psпокажет ограниченный список процессов,- сеть будет отделена от основной системы.
🧠 Как это работает в ядре
Ядро Linux ассоциирует с каждым процессом структуру task_struct, где указатели на пространства имён хранятся в виде ссылок.
Каждый namespace имеет собственный идентификатор и набор объектов, управляемый системой через системные вызовы:
clone()— создание нового процесса с namespace,setns()— присоединение к уже существующему,unshare()— выделение новых пространств без порождения процесса.
🔒 Практическая роль
Namespaces обеспечивают:
- изоляцию между приложениями;
- безопасность — ограничение доступа к глобальным ресурсам;
- гибкость контейнеров — каждый контейнер работает как мини-система;
- совместимость — ядро остаётся общим, ресурсы разделяются логически.
📚 Источники:
- Linux Namespaces Part 1–4 — ifeanyi.co
- man 7 namespaces
- man 2 clone