Namespaces (пространства имен) — это фундаментальная технология ядра Linux, позволяющая изолировать системные ресурсы на уровне процессов. В отличие от виртуальных машин, namespaces не эмулируют оборудование, а создают виртуальное представление глобальных ресурсов внутри одного экземпляра ядра. Это позволяет группе процессов иметь собственное представление о системе, не затрагивая хост и другие группы.
Ядро поддерживает восемь основных типов пространств имен: mnt (точки монтирования), pid (дерево процессов), net (сетевые стеки), ipc (межпроцессное взаимодействие), uts (имена хостов), user (ID пользователей), cgroup и time. Процесс, находящийся в конкретном namespace, видит только те ресурсы, которые к нему привязаны, например, собственный сетевой интерфейс eth0 или таблицу маршрутизации.
Как работает
Изоляция реализуется через системные вызовы clone(), unshare() и setns(). При создании контейнера в Docker или Podman ядро использует unshare() для выделения новых пространств имен. Это позволяет запускать приложения с правами root внутри контейнера, в то время как на хосте процесс остается непривилегированным за счет использования User Namespaces.
Технология является основой современной контейнеризации. Без namespaces было бы невозможно обеспечить независимость сетевых портов или файловых систем для сотен изолированных сред на одном сервере. Например, команда ip netns add позволяет создать полностью изолированный сетевой стек вручную для тестирования сетевых топологий.