Linux, как запускать процессы с разными взглядами на файловую систему

276
eskhool

Мне нужно запустить несколько экземпляров процесса с разными конфигурациями. Однако этот процесс жестко запрограммирован для чтения конфигурации из определенного файла (не говоря уже о его закрытом источнике). Также процесс периодически записывает конфигурацию обратно в файл.

Я попытался запустить процесс с помощью скрипта после перемещения правильного файла конфигурации для этого экземпляра, но это не удалось, потому что экземпляры переопределяют файл конфигурации на месте друг для друга.

По сути, мне нужен эквивалент запуска в других средах, но на уровне файловой системы.

РЕДАКТИРОВАТЬ: Каждый процесс выполняется как независимый пользователь, но ищет файл конфигурации в общем месте. Спасибо

0
Положить его в контейнер Docker? Это не так эффективно, как пространства имен, но очень легко сделать. wvxvw 6 лет назад 0

2 ответа на вопрос

1
dirkt

Посмотрите на пространства имен, в частности для монтирования. Возможно, вам придется реплицировать корневую файловую систему, поэтому также обратите внимание на оверлеи FS и / или привязки монтирования.

Другой вариант - использовать LD_PRELOADи перехватить openвызов, чтобы вы могли заменить файл конфигурации (или другие файлы) на нужные вам пути.

Инструмент userpace называется unshare, так что вы делаете что-то вроде

$ mkdir dir1 $ mkdir dir2 $ touch dir1/foo.conf $ touch dir2/foo.conf $ rm conf/foo.conf $ sudo unshare -m /bin/bash # mount --bind dir1 conf # su your_userid $ ls conf foo.conf 

и так же для dir2т. д. Скрипт по мере необходимости.

Существуют ли инструменты пользовательского пространства для монтирования пространств имен? Я гуглил повсюду без особой удачи ... если бы вы могли добавить некоторые подробности о том, как это сделать в ответе (Ubuntu 16.04, если это важно), это было бы здорово eskhool 6 лет назад 0
Я также попытался использовать решение bindfs ... fusermount, поскольку каждый процесс запускается другим пользователем, но общее местоположение становится недоступным для другого пользователя. eskhool 6 лет назад 0
0
davidgo

В зависимости от программы вы можете настроить каждый экземпляр в своей собственной (chroot) тюрьме - вам может понадобиться использовать bind mounts, чтобы он также имел доступ к общим частям системы.

Тюрьма chroot создает виртуальный корень в каталоге (обычно с помощью команды chroot). Связывание монтируется перед созданием джейла, чтобы сделать копию частей файловой системы видимой как подкаталоги корневого каталога джейла.

Другой альтернативой может быть использование какой-либо виртуализации - я считаю, что контейнеры Docker будут делать то, что вы хотите (но я с ними мало играл). Конечно, KVM мог бы сделать это, но он обнаружил, что он будет слишком большим - то есть полный vm на экземпляр - чтобы сделать его практичным.

chroot звучит как излишнее требование и виртуализация, как docker и даже более того ... поиграл со всем вышеперечисленным, но потребовал бы большого количества связывания общих ресурсов, чтобы процесс выполнял свои обычные функции ... как использование пушки убить муху :) eskhool 6 лет назад 0

Похожие вопросы