nsenter --root: символическая ссылка vs. обычный путь к директории

Вопрос или проблема

Я замечаю странное поведение для nsenter, для которого мне нужно объяснение.

Когда я вхожу в пространства имен другого процесса, созданного с помощью unshare, я наблюдаю различия в результате поведения в тех случаях, когда я указываю корневой каталог в качестве обычного пути, и в тех случаях, когда использую /proc/PID/root символическую ссылку.

Вот пример настройки.

  1. Подготовьте целевой процесс
sudo unshare --mount --mount-proc --pid --fork --root /tmp/jail bash

/tmp/jail содержит дистрибутив Linux (я подготовил его с помощью docker export с использованием образа ubuntu):

$ docker run ubuntu
# получаем ID контейнера
$ docker export 8c67e1fb5443 > ubuntu.tar
$ mkdir /tmp/jail && cd /tmp/jail && tar -xf ~/ubuntu.tar
  1. Из другого терминала попробуйте войти в пространства имен этого процесса
sudo nsenter --target=28716 --root=/tmp/jail --all bash
  1. Попробуйте команду ps

Здесь я наблюдаю ошибку:

root@ubuntu:/proc# ps
Ошибка, сделайте это: mount -t proc proc /proc

root@ubuntu:/proc# mount
mount: не удалось прочитать mtab: Нет такого файла или каталога

Однако, если я для nsenter указываю /proc/28716/root, это внезапно начинает работать.

$ sudo readlink /proc/28716/root
/tmp/jail

$ sudo nsenter --target=28716 --root=/proc/28716/root --all bash

root@ubuntu:.# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   4624  3712 ?        S+   21:04   0:00 bash
root          31  0.0  0.0   4624  3712 ?        S    21:10   0:00 bash
root          39  0.0  0.0   7060  2944 ?        R+   21:10   0:00 ps aux

root@ubuntu:.# mount
proc на /proc тип proc (rw,nosuid,nodev,noexec,relatime)

Каковы причины этого поведения? Почему символическая ссылка и обычный путь дают разные результаты, если они указывают на одну и ту же директорию?

$ sudo nsenter --target=28716 --root=/proc/28716/root --all bash  # РАБОТАЕТ ХОРОШО
$ sudo nsenter --target=28716 --root=/tmp/jail --all bash         # НЕ РАБОТАЕТ ХОРОШО

# где /proc/28716/root является символической ссылкой на /tmp/jail
6.8.0-49-generic
Ubuntu 24.04.1 LTS

Ответ или решение

Поведение nsenter при использовании --root: символическая ссылка против обычного пути

Когда речь заходит о работе с namespaces в Linux, команды как unshare и nsenter играют важную роль в управлении изоляцией процессов. Ваша ситуация, описывающая различия в поведении nsenter при указании пути /tmp/jail и символической ссылки /proc/PID/root, является наглядным примером тонкостей, касающихся работы с namespaces и взаимодействия с файловой системой.

1. Основная задача

Вы используете nsenter для входа в namespaces процесса, созданного с помощью unshare. При этом поведение системы варьируется в зависимости от того, вводите ли вы сам путь (/tmp/jail) или символическую ссылку (/proc/28716/root).

2. Объяснение проблемы

Разница между символической ссылкой и обычным путем

На первый взгляд, пути /tmp/jail и /proc/28716/root указывают на одно и то же место. Однако, использование символической ссылки имеет несколько важных нюансов:

  • Привилегии и контекст: Когда вы используете /proc/PID/root, вы фактически указываете на корневую файловую систему процесса, в которую вы хотите войти. Это позволяет использовать контекст прав и изоляции, в котором был создан процесс. В частности, когда процесс был запущен в специальном пространстве имен, указание пути через proc корректно перенаправляет все файлы, необходимые для работы.

  • Системные ограничения: Некоторые команды, такие как mount и ps, зависят от корректной инициализации и существования системных файлов. В вашем случае, команда ps требует наличия монтированной файловой системы /proc. При указании обычного пути (/tmp/jail), необходимо вручную монтировать proc, что не происходит автоматически. Однако, использование /proc/28716/root позволяет избежать этой необходимости, поскольку Linux автоматически обрабатывает контекст процесса.

Подробности об ошибках

При попытке выполнения команды ps после входа с --root=/tmp/jail, вы получили сообщение об ошибке, указывающее на отсутствие монтирования /proc. Это происходит потому, что при таком входе не происходит автоматического создания необходимых для работы процессов виртуальных файловых систем, что приводит к сбоям в работе.

3. Рекомендуемое решение

Чтобы избежать подобной путаницы и обеспечить корректную работу своих команд с nsenter:

  • Используйте proc для входа в namespaces: Как вы уже заметили, лучше использовать символику /proc/PID/root, чтобы обеспечить правильную изоляцию и доступ ко всем необходимым ресурсам. Это гарантирует, что все необходимые контексты и монтирования правильно установлены.

  • Изучите особенности вашего окружения: Работая с unshare и nsenter, важно понимать, как ваша система обрабатывает namespaces и монтирования. Настройка окружений может вызывать различные побочные эффекты, поэтому схему вашего рабочего окружения стоит внимательно проанализировать.

4. Заключение

Проблемы, возникающие из-за различий между символической ссылкой и обычным путем при использовании nsenter, подчеркивают важность правильного управления средой выполнения процессов в Linux. Использование proc для работы с namespaces не только облегчает взаимодействие, но и повышает надежность выполнения команд, что особенно важно при создании и управлении изолированными процессами. Понимание этих тонкостей — ключ к эффективной работе в среде Linux, особенно в области администрирования систем и разработки приложений.

Оцените материал
Добавить комментарий

Капча загружается...