Linux, wie Sie Prozesse mit unterschiedlichen Ansichten des Dateisystems ausführen

391
eskhool

Ich muss mehrere Instanzen eines Prozesses mit unterschiedlichen Konfigurationen ausführen. Dieser Prozess ist jedoch hartcodiert, um die Konfiguration aus einer bestimmten Datei zu lesen (natürlich nicht die geschlossene Quelle). Außerdem schreibt der Prozess die Konfiguration regelmäßig in die Datei zurück.

Ich habe versucht, den Prozess mit einem Skript zu starten, nachdem ich die richtige Konfigurationsdatei für diese Instanz verschoben habe. Dies schlägt jedoch fehl, da die Instanzen die Konfigurationsdatei gegenseitig überschreiben.

Im Wesentlichen brauche ich ein Äquivalent des Startens in verschiedenen Umgebungen, aber auf Dateisystemebene

BEARBEITEN: Jeder Prozess wird als unabhängiger Benutzer ausgeführt, sucht jedoch an einem gemeinsamen Ort nach einer Konfigurationsdatei. Danke

0
Legen Sie es in den Docker-Container? Dies ist nicht so effizient wie Namespaces, aber es ist sehr einfach. wvxvw vor 6 Jahren 0

2 Antworten auf die Frage

1
dirkt

Schauen Sie sich Namespaces an, insbesondere für Mounts. Möglicherweise müssen Sie das Root-Dateisystem replizieren. Schauen Sie sich auch die FS-Überlagerungen und / oder Bindungs-Mounts an.

Eine weitere Option besteht darin, LD_PRELOADden openAufruf zu verwenden und zu entführen, sodass Sie die Konfigurationsdatei (oder andere Dateien) durch die gewünschten Pfade ersetzen können.

Das Userspace-Tool wird aufgerufen unshare, also machen Sie so etwas

$ 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 

und ähnlich für dir2etc. Skript nach Bedarf.

Gibt es Userpace-Tools zum Einhängen von Namespaces? Ich habe überall ohne viel Glück gegoogelt ... Wenn Sie in der Antwort (ubuntu 16.04, wenn es darauf ankommt) ein paar Details dazu hinzufügen können, wäre das großartig eskhool vor 6 Jahren 0
Ich habe auch versucht, eine bindfs ... fusermount-Lösung zu verwenden, da jeder Prozess von einem anderen Benutzer ausgeführt wird, der gemeinsame Speicherort jedoch für den anderen Benutzer nicht zugänglich ist eskhool vor 6 Jahren 0
0
davidgo

Je nach Programm können Sie jede Instanz in einem eigenen Gefängnis (Chroot-Gefängnis) einrichten. Möglicherweise müssen Sie Bind-Mounts verwenden, um Zugriff auf allgemeine Teile des Systems zu erhalten.

Ein chroot-Gefängnis erstellt ein virtuelles Stammverzeichnis in einem Verzeichnis (normalerweise mit dem Befehl chroot). Bind-Mounts können vor dem Erstellen des Gefängnisses verwendet werden, um eine Kopie von Teilen des Dateisystems als Unterverzeichnisse des gerooteten Verzeichnisses sichtbar zu machen.

Eine andere Alternative wäre, eine Art Virtualisierung zu verwenden - ich glaube, Docker-Container würden das tun, was Sie wollen (aber ich habe nicht viel mit ihnen gespielt). Sicherlich könnte KVM es tun, aber es stellte sich heraus, dass es viel zu groß wäre - dh eine vollständige VM pro Instanz -, um es praktisch zu machen.

chroot klingt nach Overkill für die Anforderung und Virtualisierung wie Docker und alle noch mehr ... haben mit all dem oben genannten gespielt, würden aber eine Menge gemeinsamer Ressourcen einbinden, damit der Prozess seine normalen Funktionen erfüllt ... wie die Verwendung einer Kanone eine Fliege töten :) eskhool vor 6 Jahren 0