В двух словах, пространства имен обеспечивают способ построения виртуальной системы Linux внутри более крупной системы Linux. Это отличается от запуска виртуальной машины, которая выполняется как непривилегированный процесс: виртуальная машина отображается как один процесс на хосте, тогда как процессы, выполняющиеся в пространстве имен, все еще выполняются на хост-системе.
Виртуальная система, работающая внутри большей системы, называется контейнером . Идея контейнера заключается в том, что процессы, выполняющиеся внутри контейнера, считают, что они являются единственными процессами в системе. В частности, пользователь root внутри контейнера не имеет привилегий root вне контейнера (обратите внимание, что это верно только в достаточно последних версиях ядра).
Пространства имен виртуализируют одну функцию за раз. Некоторые примеры типов пространств имен:
- Пользовательские пространства имен - это позволяет процессам вести себя так, как если бы они работали как разные пользователи внутри и вне пространства имен. В частности, процессы, выполняющиеся с UID 0 внутри пространства имен, имеют привилегии суперпользователя только в отношении процессов, выполняющихся в одном и том же пространстве имен.
Начиная с ядра Linux 3.8, непривилегированные пользователи могут создавать пространства имен пользователей. Это позволяет обычному пользователю использовать функции, зарезервированные для root (например, изменение таблиц маршрутизации или настройка возможностей).
- Пространства имен PID - процессы внутри пространства имен PID не могут уничтожать или отслеживать процессы вне этого пространства имен.
- Смонтировать пространства имен - это позволяет процессам иметь собственное представление о файловой системе. Это представление может быть частичным, позволяя скрывать некоторые фрагменты файловой системы и перекомпоновывать фрагменты, чтобы деревья каталогов появлялись в разных местах. Пространства имен монтирования обобщают традиционную функцию Unix chroot , которая позволяет ограничивать процессы определенным поддеревом.
- Сетевые пространства имен - позволяют разделять сетевые ресурсы (сетевые устройства) и, таким образом, повышают изоляцию процессов.
Пространства имен полагаются на ядро для обеспечения изоляции между пространствами имен. Это довольно сложно сделать правильно, поэтому все еще могут быть ошибки безопасности. Риск ошибок безопасности будет основной причиной, по которой эта функция не будет включена. Еще одна причина не включать его - это когда вы делаете небольшое ядро для встроенного устройства. В ядре общего назначения, которое вы устанавливаете на типичном сервере или рабочей станции, пространства имен должны быть включены, как и любая другая зрелая функция ядра.
Есть еще несколько приложений, которые используют пространства имен. Вот некоторые из них:
- LXC хорошо зарекомендовал себя. Он полагается на cgroups для предоставления контейнеров.
- virt-sandbox - более свежий проект для песочницы.
- Последние версии Chromium также используют пространства имен для песочницы, где это возможно.
- UWSGI рамка для кластерных приложений используют пространство имен для улучшения песочницы.
Смотрите серию статей LWN Майкла Керриска для получения дополнительной информации.