
Gibt es einen Namespace (Prozess, Benutzer usw.), der Umgebungsvariablen isoliert?
Wenn ja, was passiert, wenn Sie unshare
…? Werden sie geklont? Was passiert, wenn ein Prozess eine vorhandene Variable ändert?
EDIT: Ich verwende Ubuntu
Antwort1
Sie benötigen keinen Namespace, um Umgebungsvariablen zu isolieren. Sie sind bereits für jeden Prozess isoliert und privat. Das Ändern einer Umgebungsvariablen in einem untergeordneten Prozess wird NICHT auf den übergeordneten Prozess übertragen.
Umgebungsvariablen sind in Unix einfach eine Reihe von Zeichenfolgen, die im Adressraum eines Prozesses gespeichert sind. Wenn sich ein Prozess aufspaltet, „erben“ seine untergeordneten Prozesse eine Kopie davon zusammen mit dem gesamten Adressraum, und wenn ein Programm ein anderes ausführt (und den gesamten Inhalt des Adressraums ersetzt), müssen sie explizit als envp
Argument an den execve(2)
Systemaufruf übergeben werden, wenn sie erhalten bleiben sollen.
Wenn Sie einen Prozess mit einemleerUmgebung, können Sie es starten als
env - cmd ...
das einfach aufruft execve("/path/to/cmd", ["cmd", ..., NULL], [NULL])
.
Oder führen Sie es mit einer Umgebung aus, die nur Folgendes enthält FOO=bar
:
env - FOO=bar cmd ...
Weder die Systemaufrufe ( clone(2)
, unshare(2)
, setns(2)
), die den Namespace beeinflussen, noch Befehlszeilenprogramme wie unshare(1)
berücksichtigen oder beeinflussen die Umgebung in irgendeiner besonderen Weise.
Hinweis: So funktioniert es unter Unix, nicht nach einem Naturgesetz. Auf anderen Systemen wie plan9 (wo das Konzept des Namespaces entstand, wo aber alle Namespaces im GrundemontierenNamespaces, da alles dort eine Datei/ein System ist) dieUmfeldist nur ein Dateisystem, das standardmäßig eingehängt wird /env
und im Gegensatz zu Unixgeteiltstandardmäßigzwischen Eltern und Kind.
Antwort2
Umgebungsvariablen bash
sind nur auf eine bestimmte Instanz der Shell beschränkt, es besteht daher keine Notwendigkeit, separate Namespaces für sie zu definieren.
Sie können dies deutlich sehen, wenn Sie zwei Terminalfenster gleichzeitig öffnen (in einer Desktop-Umgebung). Erstellen Sie in einem davon eine neue Umgebungsvariable, z. B.:
TEST_VAR=34
Es wird nicht in der bash
Sitzung im anderen Terminalfenster angezeigt.