ядро: поддержка пространств имен

15

Мне интересно, что именно означает «поддержка пространств имен» в ядре Linux. Я использую ядро ​​3.11.1 (самое новое стабильное ядро ​​на данный момент).

Если я решу отключить его, замечу ли я какие-либо изменения в моей системе?

И в случае, если кто-то решит использовать пространства имен, достаточно ли его просто скомпилировать NAMESPACES=Yв ядре или ему также нужны инструменты пользовательского пространства?

Мартин Вегтер
источник
5
Пространства имен здесь достаточно хорошо объяснены: lwn.net/Articles/531114 (не ответ, потому что я не отвечаю на ваши вопросы - я указываю вам на кучу текста)
Дроберт

Ответы:

21

В двух словах, пространства имен обеспечивают способ построения виртуальной системы Linux внутри более крупной системы Linux. Это отличается от запуска виртуальной машины, которая выполняется как непривилегированный процесс: виртуальная машина отображается как один процесс на хосте, тогда как процессы, выполняющиеся в пространстве имен, все еще выполняются на хост-системе.

Виртуальная система, работающая внутри большей системы, называется контейнером . Идея контейнера заключается в том, что процессы, выполняющиеся внутри контейнера, считают, что они являются единственными процессами в системе. В частности, пользователь root внутри контейнера не имеет привилегий root вне контейнера (обратите внимание, что это верно только в достаточно последних версиях ядра).

Пространства имен виртуализируют одну функцию за раз. Некоторые примеры типов пространств имен:

  • Пользовательские пространства имен - это позволяет процессам вести себя так, как если бы они работали как разные пользователи внутри и вне пространства имен. В частности, процессы, выполняющиеся с UID 0 внутри пространства имен, имеют привилегии суперпользователя только в отношении процессов, выполняющихся в одном и том же пространстве имен.
    Начиная с ядра Linux 3.8, непривилегированные пользователи могут создавать пространства имен пользователей. Это позволяет обычному пользователю использовать функции, зарезервированные для root (например, изменение таблиц маршрутизации или настройка возможностей).
  • Пространства имен PID - процессы внутри пространства имен PID не могут уничтожать или отслеживать процессы вне этого пространства имен.
  • Смонтировать пространства имен - это позволяет процессам иметь собственное представление о файловой системе. Это представление может быть частичным, позволяя скрывать некоторые фрагменты файловой системы и перекомпоновывать фрагменты, чтобы деревья каталогов появлялись в разных местах. Пространства имен монтирования обобщают традиционную функцию Unix chroot , которая позволяет ограничивать процессы определенным поддеревом.
  • Сетевые пространства имен - позволяют разделять сетевые ресурсы (сетевые устройства) и, таким образом, повышают изоляцию процессов.

Пространства имен полагаются на ядро ​​для обеспечения изоляции между пространствами имен. Это довольно сложно сделать правильно, поэтому все еще могут быть ошибки безопасности. Риск ошибок безопасности будет основной причиной, по которой эта функция не будет включена. Еще одна причина не включать его - это когда вы делаете небольшое ядро ​​для встроенного устройства. В ядре общего назначения, которое вы устанавливаете на типичном сервере или рабочей станции, пространства имен должны быть включены, как и любая другая зрелая функция ядра.

Есть еще несколько приложений, которые используют пространства имен. Вот некоторые из них:

  • LXC хорошо зарекомендовал себя. Он полагается на cgroups для предоставления контейнеров.
  • virt-sandbox - более свежий проект для песочницы.
  • Последние версии Chromium также используют пространства имен для песочницы, где это возможно.
  • UWSGI рамка для кластерных приложений используют пространство имен для улучшения песочницы.

Смотрите серию статей LWN Майкла Керриска для получения дополнительной информации.

Жиль "ТАК - прекрати быть злым"
источник
6

Пространство имен ядра Linux - это концепция, используемая для изоляции группы процессов от других в отношении доступа к системному ресурсу. Например, два разных пространства имен PID могут содержать процессы с одинаковыми PID, но совершенно разными образами процессов. Они часто используются в виртуализации на уровне ОС, в которой одно ядро ​​одновременно работает с различными операционными системами - все они должны быть основаны на Linux (потому что они разделяют ядро, очевидно), но могут иметь разные дистрибутивы и версии. Смотрите, например, LXC .

Вы можете заметить его отключение, например, в системах на основе systemd, поскольку systemd может использовать пространства имен для своей функции контейнера . Следовательно, многое зависит от того, какой дистрибутив вы используете и что вы собираетесь делать с системой.

Как и в случае почти всех функций ядра, вам определенно нужны какие-то программы пользовательского пространства - даже если вы общались с ядром через специальные файлы (я не уверен, что вы можете это сделать), обычно гораздо лучше полагаться на специализированные инструменты, поскольку они Предложить дружественный API.

peterph
источник
1

Чтобы привести пример использования пространства имен, в системах с поддержкой SELinux (MLS или Strict). Пространство имен обычно используется для создания отдельных /tmpи / или /homeкаталогов для каждого пользователя. Эти каталоги видны только: пользователю, пользователям с одинаковой меткой, ядру и пользователям с привилегированным доступом. Директория пространства имен /tmpпомечается SELinux-MLS, чтобы соответствовать метке SELinux-MLS пользователя. В этом случае /tmpкаталог, который видит пользователь, может быть действительно смонтирован где-то, кроме /tmp( /var/user-tmp). Пользователь, однако, видит только /tmpте файлы, которые созданы из-за активности пользователя. пользователь никогда не увидит никаких файлов, /tmpкоторые являются продуктом других пользователей.

guestUserX
источник