Вопрос или проблема
Я хочу запустить несколько процессов с разными представлениями на /some/path
, чтобы один видел /other/path1
, а другой видел /other/path2
.
Я узнал, что это можно сделать с помощью unshare
и mount --bind
. Но я нахожусь внутри непривилегированного контейнера, который не позволяет выполнять необходимые системные вызовы.
Есть ли какие-либо альтернативные методы для этого? Может быть, какой-то инструмент, который может перехватить системный вызов open
?
Я нашел отличный инструмент под названием proot, который может сделать именно то, что мне нужно.
Он также предоставляет статически скомпилированный бинарный файл, который можно просто использовать.
PRoot — это реализация в пользовательском пространстве chroot, mount –bind и binfmt_misc. Это означает, что пользователям не нужны никакие привилегии или настройки, чтобы использовать произвольный каталог в качестве новой корневой файловой системы, делать файлы доступными в другой части иерархии файловой системы или прозрачным образом выполнять программы, скомпилированные для другой архитектуры ЦП через QEMU в пользовательском режиме. Также разработчики могут использовать PRoot как универсальный механизм инструментирования процессов Linux благодаря его механизму расширения, см. CARE для примера. Технически PRoot полагается на ptrace, непривилегированный системный вызов, доступный в каждом ядре Linux.
Ответ или решение
Альтернативы привязки в пространстве имен внутри непривилегированного контейнера Docker
Когда речь заходит о создании изолированных сред для запуска различных процессов с разными представлениями одной и той же директории, многие пользователи сталкиваются с ограничениями, накладываемыми непривилегированными контейнерами Docker. В частности, стандартные методы, такие как использование unshare
и команды mount --bind
, невозможны из-за ограниченного доступа к необходимым системным вызовам. Однако существует подход, который может оказаться полезным для решения этой задачи – это использование инструмента PRoot.
Что такое PRoot?
PRoot — это пользовательская реализация chroot
, mount --bind
и binfmt_misc
, обеспечивающая множество возможностей, которые обычно требуют повышенных привилегий. Поскольку PRoot работает в пространстве пользователя и использует системный вызов ptrace
, его можно использовать для создания изолированных сред без необходимости в доступе с повышенными правами.
Вот несколько ключевых характеристик PRoot:
- Изоляция: PRoot позволяет запускать программы в директории, которая рассматривается как корневая (root) файловая система, без фактического изменения корневой файловой системы системы или контейнера.
- Переопределение путей: Можно легко перенаправить доступ к файлам из одного каталога в другой, обеспечивая разные виды доступа для различных процессов.
- Поддержка различных архитектур: PRoot может использоваться в сочетании с QEMU для запуска программ, скомпилированных для других архитектур, что увеличивает его гибкость.
Как использовать PRoot в непривилегированном контейнере?
-
Установка PRoot: Скачайте статически скомпилированный бинарный файл PRoot с официального сайта и разместите его в доступном для выполнения месте в вашем контейнере.
-
Запуск процессов с различными путями: Для запуска процесса с различными путями используйте синтаксис PRoot, чтобы определить, какие директории будут доступны для разных процессов. Например:
proot -r /path/to/new/root -b /other/path1:/some/path command1 proot -r /path/to/new/root -b /other/path2:/some/path command2
Здесь
-r
указывает на новую корневую файловую систему, а-b
позволяет связать указанную директорию с местоположением в новой корневой файловой системе, таким образом позволяя различным экземплярам видеть разные виды на/some/path
. -
Мониторинг и отладка: PRoot также может быть использован для анализа и отладки процессов благодаря поддержке инструментов для их инъекции.
Заключение
PRoot предоставляет мощный набор инструментов для работы в непривилегированных контейнерах Docker, позволяя создавать гибкие и изолированные среды с различными представлениями файловых систем. Это решение подходит как для разработчиков, так и для системных администраторов, работающих с контейнеризированными приложениями. Используйте PRoot для достижения OF системного контроля и гибкости, не прибегая к привилегированным операциям, тем самым улучшая безопасность и управляемость ваших контейнеров.