Какой механизм изоляции использовался в Linux до появления namespaces?

«Какой механизм изоляции использовался в Linux до появления namespaces?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

До появления пространств имён (namespaces) в ядре Linux для частичной изоляции использовался механизм chroot (change root).

Что делает chroot? Он изменяет корневой каталог (/) для процесса и его дочерних процессов на указанный каталог в файловой системе. Это создаёт иллюзию изолированной файловой системы.

Пример использования:

# Создаём минимальную файловую структуру для изоляции
mkdir -p /myjail/{bin,lib,lib64}
# Копируем необходимые бинарные файлы и библиотеки (например, bash)
cp /bin/bash /myjail/bin/
cp /lib/x86_64-linux-gnu/libtinfo.so.6 /myjail/lib/
cp /lib/x86_64-linux-gnu/libc.so.6 /myjail/lib/
cp /lib64/ld-linux-x86-64.so.2 /myjail/lib64/

# Запускаем процесс в изолированном окружении
sudo chroot /myjail /bin/bash
# Теперь для этого bash корень файловой системы — это /myjail

Ключевые ограничения chroot по сравнению с namespaces:

  • Неполная изоляция: Процесс видит все запущенные процессы (ps aux), сетевые интерфейсы, пользователей и т.д.
  • Уязвимости безопасности: Привилегированный процесс может "сбежать" из chroot.
  • Сложность настройки: Требуется ручное копирование всех необходимых библиотек и файлов.

Namespaces (cgroups, PID, network, mount, user и др.), появившиеся позже, обеспечивают полную изоляцию на уровне ядра, что и стало фундаментом для современных контейнеров (Docker, LXC).