Вопрос или проблема
Я замечаю странное поведение для nsenter
, для которого мне нужно объяснение.
Когда я вхожу в пространства имен другого процесса, созданного с помощью unshare
, я наблюдаю различия в результате поведения в тех случаях, когда я указываю корневой каталог в качестве обычного пути, и в тех случаях, когда использую /proc/PID/root
символическую ссылку.
Вот пример настройки.
- Подготовьте целевой процесс
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
- Из другого терминала попробуйте войти в пространства имен этого процесса
sudo nsenter --target=28716 --root=/tmp/jail --all bash
- Попробуйте команду
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, особенно в области администрирования систем и разработки приложений.