linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Процессы и ресурсы/namespaces

kb/processes ── Процессы и ресурсы ── advanced

Linux namespaces

Namespaces - механизм ядра, который даёт процессу собственный изолированный view на ресурс (сеть, mount-points, PID, UID, IPC, hostname, time). На них построены все контейнеры.

view as markdownaka: linux-namespaces, ns, namespace

Зачем нужны namespaces

Контейнеры - это не виртуальные машины. У них одно ядро с хостом. Изоляцию даёт связка двух механизмов:

  • cgroups - лимит «сколько ресурсов можно тратить»
  • namespaces - лимит «что видно процессу»

Семь типов

namespaceчто изолируетфлаг unshare/clone
mntmount points (свой набор смонтированных FS)CLONE_NEWNS
netинтерфейсы, маршруты, ARP, сокеты, файрволCLONE_NEWNET
pidдерево PID; PID 1 в ns ≠ PID 1 на хостеCLONE_NEWPID
userUID/GID; root внутри = unprivileged снаружиCLONE_NEWUSER
utshostname, domainnameCLONE_NEWUTS
ipcSystem V IPC, shared memoryCLONE_NEWIPC
cgroupview на cgroup-tree (видишь только своё поддерево)CLONE_NEWCGROUP
timeCLOCK_MONOTONIC offset (Linux 5.6+)CLONE_NEWTIME

Как создаются

Три способа:

  1. clone() / unshare() syscall - программа просит у ядра новый namespace
  2. ip netns add NAME - создаёт network namespace, монтирует /run/netns/NAME чтобы можно было сослаться (см. veth-pair)
  3. unshare CMD - обёртка которая делает unshare() + exec()

Что видно в /proc/<pid>/ns/

Каждый процесс - это набор namespace handle'ов в /proc/<pid>/ns/:

bash
ls -l /proc/self/ns/
# net   -> 'net:[4026531992]'
# mnt   -> 'mnt:[4026531840]'
# pid   -> 'pid:[4026531836]'
# ...

Число в скобках - inode-id namespace'а. Если у двух процессов одинаковый ID для net - они в одном network namespace. Это первичный способ диагностики «в каком ns я нахожусь».

Перейти в существующий namespace другого процесса - nsenter:

bash
sudo nsenter -t <pid> -n -p ip addr   # выполнить ip addr в net+pid ns процесса <pid>

Связь с Docker

Когда ты делаешь docker run image, Docker:

  1. unshare() со всеми флагами кроме time
  2. Создаёт veth-pair, один конец оставляет на хосте в bridge, другой кладёт в новый net-namespace
  3. Mount'ит overlay-FS как корень процесса
  4. Помещает процесс в cgroups для лимитов
  5. exec-нул бинарь из image

Всё. Никакой VM, никакого гипервизора - только namespaces + cgroups.

§ команды

bash
ls -l /proc/self/ns/

Все namespace'ы в которых сидит текущий процесс

bash
sudo ip netns add red && ip netns list

Создать новый network namespace и перечислить все

bash
sudo ip netns exec red ip addr

Выполнить команду внутри указанного network namespace

bash
sudo unshare --net --uts -- bash

Запустить bash в свежих net+uts namespace'ах

bash
sudo nsenter -t 1234 -a

Войти ВО ВСЕ namespace'ы процесса 1234 (-a: all)

§ см. также

  • process-and-pidПроцесс и PIDПроцесс - это запущенная программа со своим PID, памятью, открытыми дескрипторами и UID. Все процессы образуют дерево, корень - init (PID 1).
  • cgroupscgroups (v2)cgroups v2 - иерархическая виртуальная FS под `/sys/fs/cgroup` через которую ядро лимитирует CPU/память/I/O процессов. Docker/k8s/systemd пишут сюда.
  • veth-pairveth pairveth-pair - два связанных виртуальных Ethernet-интерфейса. Что заходит в один конец - выходит из другого. Базовый кирпич всех Linux-контейнерных сетей.
  • tmpfs-overlayfstmpfs и overlayfs - RAM-disk и слоиtmpfs - ФС в RAM (с swap'ом). Дефолт для /run, /dev/shm, часто /tmp. overlayfs - lower + upper = merged: RO-база + RW-слой над ней. Основа Docker (overlay2), Live-ISO, immutable distro.
  • chrootchroot - изоляция процесса в каталог`chroot()` - системный вызов меняющий apparent root каталог процесса (и его потомков). Лёгкая изоляция доступа к ФС. **НЕ заменяет [[namespaces]]/контейнеры** - root внутри chroot часто может выйти.
  • runc-and-runscrunc, runsc, kata - container runtimesrunc - стандартный OCI-runtime, namespaces+cgroups+seccomp. runsc/gVisor - userspace-ядро для дополнительной изоляции. kata - облегчённая VM на контейнер. Performance ↔ isolation trade-off.

§ упоминается в уроках

  • ›advanced-01-namespaces
  • ›beginner-06-users-and-groups
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки