GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Die 7 am häufigsten verwendeten Linux-Namespaces

Ich möchte einige Beispiele geben, um die technischen Definitionen rund um Namespaces zu verdeutlichen . Wikipedia hat die folgende Definition:

Namespaces sind eine Funktion des Linux-Kernels, die Kernelressourcen so partitioniert, dass eine Gruppe von Prozessen eine Gruppe von Ressourcen sieht und eine andere Gruppe von Prozessen eine andere Gruppe von Ressourcen sieht. Die Funktion funktioniert, indem sie denselben Namensraum für eine Gruppe von Ressourcen und Prozessen hat, aber diese Namensräume beziehen sich auf unterschiedliche Ressourcen.

Diese Definition ist für einige Leute ziemlich schwer zu verdauen, also hilft vielleicht diese Analogie. Denken Sie an mein Mehrfamilienhaus. Technisch gesehen handelt es sich um zwei unterschiedliche Gebäude mit eigenen Eingängen. Allerdings werden die Parkgarage, der Fitnessraum, der Pool und die Gemeinschaftsräume geteilt. Die Gebäude haben ihre eigenen Namen, City Place und Stadtplatz 2 . Sie haben ihre eigenen Straßenadressen, Stockwerke und Aufzüge. Dennoch sind sie mit demselben physischen Komplex verbunden.

Der physische Komplex ist die gleiche Idee wie ein Computer. Zwei Namespaces (oder mehr) können sich auf demselben physischen Computer befinden, und ähnlich wie das Wohnhaus können Namespaces entweder den Zugriff auf bestimmte Ressourcen teilen oder exklusiven Zugriff haben.

Es gibt sieben gängige Arten von Namespaces, die heute weit verbreitet sind. Lassen Sie uns anhand der Wohnung als Leitfaden eine Zusammenfassung der Funktionen der einzelnen Typen durchgehen. Nachfolgend finden Sie eine kurze Übersicht über jeden Namespace-Typ. In nachfolgenden Artikeln zeigen wir anhand von Beispielen, wie jeder Namespace funktioniert.

Prozessisolierung (PID-Namensraum)

Eine PID , oder Prozess-ID hilft einem System, eine bestimmte Aufgabe auf einem Computer zu verfolgen. Wenn Sie Firefox auf Ihrem Computer starten, wird ihm eine PID zugeordnet. Um sicherzustellen, dass der Computer ordnungsgemäß mit einer Aufgabe interagiert, wird die Aufgabe durch die PID referenziert. Nehmen wir an, Sie haben Firefox und den Brave Browser gleichzeitig geöffnet. Sie starten Ihre bevorzugte Suchmaschine wie DuckDuckGo in jedem Browser und suchen nach Katzenbildern in einem und Hundebilder in dem anderen. Beide Browser stellen eine ähnliche Anfrage an dieselbe Website. Wie stellt der Computer sicher, dass die richtigen Suchergebnisse an den richtigen Browser zurückgegeben werden? Einer der Hauptwege besteht darin, die Anforderungen der einzelnen PIDs zu verfolgen und die Ergebnisse dann an den Anforderungsprozess zurückzugeben.

"Großartig, ich habe mich verlaufen", sagst du. Was hat das mit Mehrfamilienhäusern und Namensräumen zu tun? Angenommen, Sie möchten identische Kopien einer Software ausführen. Manche Software wurde nicht dafür geschrieben, mehr als eine Kopie gleichzeitig zu öffnen. Um dies zu erreichen, müssen Sie möglicherweise die PID isolieren, damit sie nicht weiß, was außerhalb ihrer eigenen Prozesse vor sich geht. Hier kann die Prozessisolierung Abhilfe schaffen.

Um es anders auszudrücken, um auf unser Wohnhaus zurückzukommen, die einzelnen Wohnungen in der Anlage ähneln dem PID-Namensraum. Jeder Haushalt im Apartmentkomplex möchte seinen Fernseher einschalten und eine Vielzahl von Inhalten ansehen. Stellen Sie sich in einem albernen Paralleluniversum vor, dass, wenn eine einzelne Person im Wohnhaus ihren Fernseher einschaltet, niemand sonst fernsehen könnte, weil der Kabelanbieter sonst nicht wüsste, auf welchem ​​Fernseher „The Office“ und auf welchem ​​„The Lehrling." Namensräume würden es der Kabelgesellschaft ermöglichen, jeden Haushalt zu isolieren und jedem Bewohner unterschiedliche Programme bereitzustellen, da es nicht länger wichtig ist, was andere Personen in Ihrem Komplex sehen.

[ Erfahren Sie mehr über PID-Namespaces. ]

Netzwerkschnittstellen (Netznamespace)

Jeder Computer, der mit einem Netzwerk (z. B. dem Internet) verbunden ist, benötigt eine IP-Adresse. Dies ist eine eindeutige Nummer, die es Computern ermöglicht, effektiv zu kommunizieren. Wenn auf eine bestimmte Art von Ressource zugegriffen wird, beispielsweise eine Webseite, wird ein bestimmter Port für diese Kommunikation verwendet. Dies liegt daran, dass ein Computer einen Webserver, einen Spieleserver und möglicherweise einen E-Mail-Server auf demselben Host hosten kann. Die Ports können 80 oder 443 für Webverkehr, 8888 für Spielverkehr und 25 für E-Mail sein. Wenn ich https:// in meinen Browser eingebe, übersetzt der Computer dies, um den Datenverkehr an Port 443 an die IP-Adresse xxx.xxx.xxx.xxx des Browsers zu senden . Der Server am anderen Ende antwortet dann mit dem entsprechenden Inhalt über die Quell-IP-Adresse. Wie bereits erwähnt, unterstützen einige Technologie-Stacks nicht mehrere Instanzen der Software, die gleichzeitig ausgeführt werden. Anders als bei der PID-Isolation erwartet jedoch eine Software wie ein E-Mail-Server, wenn sie eine Verbindung empfängt, dass sie sich auf einem bestimmten Port befindet. Selbst wenn Sie die PID isolieren, würde auf dem E-Mail-Server nur eine einzige Instanz ausgeführt, da Port 25 bereits verwendet wird. Netzwerk-Namespaces ermöglichen Prozessen innerhalb jeder Namespace-Instanz den Zugriff auf eine neue IP-Adresse zusammen mit dem vollständigen Bereich von Ports. Somit könnten Sie mehrere Versionen eines E-Mail-Servers ausführen, der Port 25 überwacht, ohne dass es zu Softwarekonflikten kommt.

In meinem Gebäudeszenario sind die Gebäude mit demselben physischen Komplex verbunden und sind Spiegelbilder voneinander. Das bedeutet, dass in jedem Gebäude gleich viele Wohnflächen vorhanden sind. Darüber hinaus folgen sie demselben Wohnungsnummerierungsschema. Das bedeutet, dass jedes Gebäude beispielsweise die Einheit 707 hat. In diesem Beispiel ist die IP-Adresse wie die Straßenadresse der Wohnhäuser und die Wohnungsnummer ist der Port. Jeder Apartmentkomplex ist Teil desselben physischen Gebäudes, aber sie haben unterschiedliche Straßenadressen. Da die Gebäude nicht physisch getrennt sind, ohne diesen net namespace ein Unternehmen, das eine Rechnung an Steve Ovens, 123 Fake Street Unit 707 sendet möglicherweise nie eine Antwort erhalten, weil sie an die falsche Adresse ging. Wahrscheinlicher ist, dass die Post aufgrund der Mehrdeutigkeit der Adresse einfach nicht versuchen würde, den Brief zuzustellen. Net-Namespaces ermöglichen uns jedoch 123 Fake Street und 125 Fake Street im selben physischen Gebäude.

[ Erfahren Sie mehr über Netznamensräume. ]

Unix-Timesharing-System (uts-Namensraum)

Dieser Namensraum ist leider nach heutigen Maßstäben benannt. Es stammt aus den Anfängen von Unix und hat damit zu tun, wie Informationen für einen bestimmten Systemaufruf gespeichert wurden. Heute ist dieses Detail weitgehend in Vergessenheit geraten, und was Sie wirklich wissen müssen, ist, dass der UTS-Namespace die Trennung von Hostnamen zulässt. Hostnamen sind oft nur eine Annehmlichkeit. Wie bereits erwähnt, erfolgt mit einigen Ausnahmen die meiste Kommunikation zu und von einem Host über die IP-Adresse und die Portnummer. Es macht uns Menschen jedoch das Leben viel leichter, wenn wir einem Prozess eine Art Namen geben. Das Durchsuchen von Protokolldateien ist beispielsweise viel einfacher, wenn ein Hostname identifiziert wird. Nicht zuletzt, weil sich IPs in einer dynamischen Umgebung ändern können.

In unserer Gebäudeanalogie ähnelt der Hostname dem Namen des Wohnhauses. Dem Taxifahrer sagen, dass ich im City Place wohne Wohnungen ist in der Regel effektiver als die Angabe der tatsächlichen Adresse. Mehrere Hostnamen auf einem einzigen physischen Host zu haben, ist eine große Hilfe in großen containerisierten Umgebungen.

[ Erfahren Sie mehr über uts-Namespaces. ]

Benutzernamensraum

Jedes Computersystem hat eine Möglichkeit zu verfolgen, welcher Benutzer welche Datei(en) besitzt. Dadurch kann das System den Zugriff auf sensible Systemdateien einschränken. Es verhindert auch, dass Personen, die denselben Computer verwenden, auf die Dateien der anderen zugreifen. Dem Endbenutzer wird angezeigt, dass die Dateien einem Anmeldenamen wie stratus gehören . Für den Computer ist dies jedoch nur eine willkürliche Kombination alphanumerischer Zeichen. Um diese Berechtigungen korrekt nachzuverfolgen, gibt es einen Prozess zur Zuordnung des Benutzers stratus zu einer bestimmten Benutzeridentifikationsnummer (UID), wie z. B. 1001. Diese UID wird dann auf die Metadaten der Datei angewendet. Dadurch können Sie Ihren Benutzernamen in stratus1 ändern ohne dass das System eine erhebliche Menge an Metadatenaktualisierungen durchführen muss. Die Zuordnungsdatei wird aktualisiert, sodass UID 1001 dann stratus1 zugeordnet wird statt stratus . Der Eintrag wird an einer einzigen (oder wenigen) Stellen geändert.

Stellen Sie sich das ähnlich wie die Briefkästen auf dem Boden meines Wohnhauses vor. Jedem Postfach sind ein Name oder mehrere Namen zugeordnet. Wenn mir jemand Post zustellen möchte, legt er die Post zum Beispiel in Box 707. Sollte ich mich entscheiden, meinen Namen zu ändern oder den Namen meiner Frau zum Postfach hinzuzufügen, ändert sich nichts. Die Mail geht immer noch an denselben Ort, nur die autorisierten Personen können diese Dateien einsehen, und mein Schlüssel zum Entsperren der Box bleibt unverändert.

[ Erfahren Sie mehr über Benutzernamensräume. ]

Mount (mnt-Namensraum)

Der Mount-Namespace wird verwendet, um Mount-Punkte zu isolieren, sodass Prozesse in unterschiedlichen Namespaces die Dateien der anderen nicht anzeigen können. Wenn Sie mit dem Chroot-Befehl vertraut sind, funktioniert er ähnlich.

In unserer Analogie werde ich ein wenig von der Wohnung abweichen. Nehmen wir an, zwei Personen heiraten. In diesem Szenario gibt es eine Reihe von Dingen, die normalerweise geteilt werden. Sie setzen wahrscheinlich ihren Namen in die Adressliste, Sie haben möglicherweise beide Namen auf den Rechnungen, haben beide Namen auf allen Autobesitzern und fügen sie Ihren Kreditkarten hinzu usw. In diesem Sinne teilen Sie denselben Mount-Punkt mit dem andere Person. Ihr Guthaben kann jedoch getrennt sein, sie können ihre eigenen Steuern zahlen und so weiter. Ihre Sozialversicherungsnummer (Sozialversicherungsnummer für unsere Freunde in den USA) bleibt von Ihrer getrennt und umgekehrt. Auch wenn Ihr Partner die finanzielle Situation ähnlich sieht, wird es nicht genau dieselbe sein. Sie haben keine wirkliche Möglichkeit, finanzielle Angelegenheiten einzusehen, die rechtlich Ihr alleiniger Besitz sind.

Dasselbe gilt für Dateisystem-Einhängepunkte. Standardmäßig können verschiedene Mount-Namespaces den Inhalt des anderen nicht anzeigen. Was den Namensraum anbelangt, befindet er sich im Stammverzeichnis des Dateisystems, und es existiert nichts anderes. Sie können jedoch Teile eines zugrunde liegenden Dateisystems in den Mount-Namensraum einhängen und ihm dadurch erlauben, zusätzliche Informationen zu sehen.

[ Erfahren Sie mehr über mnt-Namespaces. ]

Interprozesskommunikation (IPC)

Dieser Namespace ist sehr technisch und komplex zu verstehen und zu beschreiben. So sehr, dass Marty Kalin eine Reihe von Artikeln auf Opensource.com veröffentlicht hat, in denen die Interprozesskommunikation (IPC) detailliert beschrieben wird. Wenn Sie wirklich interessiert sind, verweise ich Sie auf Martys Serie, da ich diesem Thema nicht gerecht werden konnte. IPCs handhaben die Kommunikation zwischen Prozessen, indem sie gemeinsam genutzte Speicherbereiche, Nachrichtenwarteschlangen und Semaphore verwenden. Wenn Ihnen das alles fremd vorkommt, machen Sie sich keine Sorgen, Sie sind nicht allein. Die häufigste Anwendung für diese Art der Verwaltung ist möglicherweise die Verwendung von Datenbanken.

Wenn wir uns einen einzelnen Aspekt von IPC, Shared Memory, näher anschauen, können wir ein grundlegendes Verständnis der Bedeutung bekommen. Wenn die Anwendung beim Programmieren einige Informationen vorübergehend verfolgen muss, fordert sie das Betriebssystem auf, seinem Prozess eine bestimmte Menge an Arbeitsspeicher (RAM) zuzuweisen. Sie können sich das ähnlich vorstellen, wie wenn Sie in einem Chat-Programm ein Gespräch mit jemandem beginnen. Standardmäßig gibt es nur zwei Empfänger, Sie selbst und die Person am anderen Ende, oder anders gedacht, das Betriebssystem und die Anwendung. Beide Teilnehmer können den gesamten Gesprächsverlauf sehen, aber niemand sonst. Wenn jedoch jemand Neues in den Chat eingeladen wird, kann auch er lesen und an der Diskussion teilnehmen. Shared Memory kann sich ähnlich verhalten und zwei oder mehr Programmen den Zugriff auf dieselben Informationen ermöglichen. Eine Änderung durch ein Programm wird sofort für das andere Programm sichtbar.

Cgroups

Für einen detaillierten Einblick in cgroups empfehle ich die Lektüre meiner Serie auf redhat.com. In dieser vierteiligen Serie gehe ich detailliert darauf ein, wie Cgroups funktionieren und wie Sie sie in die Praxis umsetzen können. Kurz gesagt, Cgroups sind ein Mechanismus zur Steuerung von Systemressourcen. Wenn eine Cgroup aktiv ist, kann sie die Menge an CPU, RAM, Block-I/O und einige andere Facetten steuern, die ein Prozess verbrauchen kann. Standardmäßig werden cgroups im virtuellen Dateisystem /sys/fs/cgroup erstellt . Das Erstellen eines anderen Cgroup-Namespace verschiebt im Wesentlichen das Stammverzeichnis der Cgroup. Wenn die cgroup beispielsweise /sys/fs/cgroup/mycgroup wäre , könnte eine neue Namespace-cgroup dies als Root-Verzeichnis verwenden. Der Host sieht möglicherweise /sys/fs/cgroup/mycgroup/{group1,group2,group3} aber das Erstellen eines neuen Cgroup-Namespace würde bedeuten, dass der neue Namespace nur {group1,group2,group3} sehen würde .

Sie fragen sich vielleicht, warum dies erforderlich sein könnte. Ein Teil davon ist sicherheitsrelevant. Wenn kein neuer Cgroup-Namespace erstellt wurde, besteht die Möglichkeit, dass Informationen durchsickern. Die Manpage sagt es am besten:

Es verhindert Informationslecks, bei denen Cgroup-Verzeichnispfade außerhalb eines Containers ansonsten für Prozesse im Container sichtbar wären. Solche Leaks könnten beispielsweise Informationen über das Container-Framework an containerisierte Anwendungen weitergeben.

In einer traditionellen Cgroup-Hierarchie besteht die Möglichkeit, dass eine verschachtelte Cgroup Zugriff auf ihren Vorfahren erhält. Das bedeutet, dass ein Prozess in /sys/fs/cgroup/mycgroup/group1 hat das Potenzial, alles zu lesen und/oder zu manipulieren, das unter mycgroup verschachtelt ist .

Wenn man schließlich speziell an Container denkt, ermöglichen Cgroup-Namespaces, dass Container unabhängig von Vorfahren-Cgroups sind. Dies ist wichtig für etwas wie OpenShift, das Container zwischen Hosts migrieren kann. Ohne die durch Namespaces bereitgestellte Isolation müssten die vollständigen cgroup-Pfadnamen auf einem neuen Host repliziert werden, wenn ein Container migriert wird. Da Pfade eindeutig sein müssen, helfen Cgroup-Namespaces dabei, Konflikte auf dem neuen Hostsystem zu vermeiden.

In Bezug auf die Gebäudeanalogie ähnelt eine Cgroup den Versorgungsunternehmen in jeder Einheit. Während Cgroups die Ressourcennutzung begrenzen können, können sie auch als Buchhalter fungieren. Während meine Wohnung mich also nicht daran hindert, eine bestimmte Menge Strom oder Wasser zu verbrauchen, verfolgt (und rechnet) sie definitiv meinen Verbrauch. Diese Nutzung ist nur ein winziger Teil der Nutzung des Gebäudes als Ganzes. Ich kenne weder den Gesamtverbrauch des Gebäudes (der Vorfahren meiner Wohnung), noch kann ich wissen, wie viel mein Nachbar verbraucht. Sie befinden sich in einem völlig anderen Cgroup-Namensraum.

[ Holen Sie sich dieses kostenlose E-Book:Verwalten Ihrer Kubernetes-Cluster für Dummies. ]

Abschluss

Hier haben Sie also einen kurzen Überblick über die sieben am häufigsten verwendeten Namespaces. Hoffentlich war meine Analogie nützlich und klar. In den nächsten Artikeln untersuche ich einige dieser Namespaces und wie sie manuell erstellt werden. Dadurch erhalten Sie ein besseres Verständnis für die Nützlichkeit von Namespaces. Im letzten Artikel fasse ich alles zusammen, einschließlich der Verwendung von cgroups, um zu erklären, wie Container „unter der Haube“ funktionieren.


Linux
  1. Welchen Linux-Terminalbefehl verwenden Sie am häufigsten?

  2. 80 meistgenutzte essentielle Linux-Anwendungen von 2021

  3. 25 am häufigsten verwendete Beispiele für Linux-IPTables-Regeln

  4. So lösen Sie die häufigsten Internetprobleme unter Linux

  5. So bereinigen Sie Caches, die vom Linux-Kernel verwendet werden

Linux DF-Befehl – ​​Die 3 am häufigsten verwendeten Optionen

5 der langweiligsten Befehle in Linux

Die 50 nützlichsten Linux-Befehle zum Ausführen im Terminal

Die 8 beliebtesten verfügbaren Linux-Distributionen

So finden Sie die PID und PPID eines Prozesses in Linux

Die 50 am häufigsten gestellten Fragen und Antworten zu Linux-Interviews