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

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

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

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

2 ответа2

1

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

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

Инструмент пользовательского пространства называется 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 и т.д.

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .