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

Entmystifizierung von Namespaces und Containern in Linux

Container haben die Welt im Sturm erobert. Egal, ob Sie an Kubernetes, Docker, CoreOS, Silverblue oder Flatpak denken, wenn Sie den Begriff hören, es ist klar, dass moderne Anwendungen aus Gründen der Bequemlichkeit, Sicherheit und Skalierbarkeit in Containern ausgeführt werden.

Container können jedoch verwirrend sein. Was bedeutet es, in einem Container zu laufen? Wie können Prozesse in einem Container mit dem Rest des Computers interagieren, auf dem sie ausgeführt werden? Open Source mag keine Geheimnisse, daher erklärt dieser Artikel das Backend der Container-Technologie, genau wie mein Artikel über Flatpak ein gemeinsames Frontend erklärt hat.

Namespaces

Namespaces sind in der Programmierwelt weit verbreitet. Wenn Sie sich in den hochtechnischen Bereichen der Computerwelt aufhalten, haben Sie wahrscheinlich Code wie diesen gesehen:

using namespace std;

Oder Sie haben dies vielleicht schon in XML gesehen:

<book xmlns="http://docbook.org/ns/docbook" xml:lang="en">

Diese Art von Ausdrücken stellt Kontext für Befehle bereit, die später in einer Quellcodedatei verwendet werden. Der einzige Grund, warum C++ zum Beispiel weiß, was Programmierer meinen, wenn sie cout eingeben liegt daran, dass C++ den cout kennt Namensraum ist ein sinnvolles Wort.

Linux-Container

  • Was sind Linux-Container?
  • Eine Einführung in die Containerterminologie
  • Download:Einführung in Container
  • Kubernetes-Operatoren:Automatisierung der Container-Orchestrierungsplattform
  • eBook:Kubernetes-Muster zum Entwerfen cloudnativer Apps
  • Was ist Kubernetes?

Wenn Ihnen das zu technisch ist, um es sich vorzustellen, werden Sie vielleicht überrascht sein zu erfahren, dass wir alle auch im wirklichen Leben jeden Tag Namensräume verwenden. Wir nennen sie nicht Namespaces, aber wir verwenden das Konzept ständig. Zum Beispiel hat der Ausdruck „Ich bin ein Fan des Unternehmens“ eine Bedeutung in einem IT-Unternehmen, das großen Unternehmen (die gemeinhin als „Unternehmen“ bezeichnet werden) dient, aber er kann auf einer Science-Fiction-Konferenz eine andere Bedeutung haben. Die Frage "Welcher Motor läuft?" hat eine Bedeutung in einer Garage und eine andere Bedeutung in der Webentwicklung. Wir deklarieren nicht immer einen Namespace in lockeren Gesprächen, weil wir Menschen sind und unser Gehirn sich schnell anpassen kann, um den Kontext zu bestimmen, aber für Computer muss der Namespace explizit deklariert werden.

Bei Containern definiert ein Namensraum die Grenzen des "Bewusstseins" eines Prozesses darüber, was sonst noch um ihn herum läuft.

lsns

Sie wissen es vielleicht nicht, aber Ihr Linux-Rechner verwaltet stillschweigend verschiedene Namensräume, die für bestimmte Prozesse spezifisch sind. Durch die Verwendung einer aktuellen Version von util-linux Paket können Sie vorhandene Namespaces auf Ihrer Maschine auflisten:

$ lsns
        NS TYPE   NPROCS   PID USER    COMMAND
4026531835 cgroup     85  1571 seth /usr/lib/systemd/systemd --user
4026531836 pid        85  1571 seth /usr/lib/systemd/systemd --user
4026531837 user       80  1571 seth /usr/lib/systemd/systemd --user
4026532601 user        1  6266 seth /usr/lib64/firefox/firefox [...]
4026532928 net         1  7164 seth /usr/lib64/firefox/firefox [...]
[...]

Wenn Ihre Version von util-linux stellt die lsns nicht bereit Befehl, können Sie Namespace-Einträge in /proc sehen :

$ ls /proc/*/ns
1571
6266
7164
[...]
$ ls /proc/6266/ns
ipc net pid user uts [...]

Jeder Prozess, der auf Ihrem Linux-Rechner läuft, wird mit einer Prozess-ID (PID) aufgelistet. Jeder PID ist ein Namespace zugeordnet. PIDs im selben Namensraum können aufeinander zugreifen, da sie so programmiert sind, dass sie innerhalb eines bestimmten Namensraums arbeiten. PIDs in unterschiedlichen Namespaces können standardmäßig nicht miteinander interagieren, da sie in einem anderen Kontext oder Namespace ausgeführt werden . Aus diesem Grund kann ein Prozess, der in einem "Container" unter einem Namensraum läuft, nicht auf Informationen außerhalb seines Containers oder auf Informationen zugreifen, die in einem anderen Container laufen.

Neuen Namespace erstellen

Eine übliche Funktion von Software, die sich mit Containern befasst, ist die automatische Namensraumverwaltung. Ein menschlicher Administrator, der eine neue containerisierte Anwendung oder Umgebung startet, muss lsns nicht verwenden zu prüfen, welche Namespaces existieren und dann manuell einen neuen zu erstellen; die Software, die PID-Namensräume verwendet, tut dies automatisch mit Hilfe des Linux-Kernels. Sie können den Vorgang jedoch manuell nachahmen, um besser zu verstehen, was hinter den Kulissen passiert.

Zuerst müssen Sie einen Prozess identifizieren, der nicht ist auf Ihrem Computer läuft. In diesem Beispiel verwende ich die Z-Shell (Zsh), da ich die Bash-Shell auf meinem Computer ausführe. Wenn Sie Zsh auf Ihrem Computer ausführen, verwenden Sie Bash oder tcsh oder eine andere Shell, die Sie derzeit nicht ausführen. Das Ziel ist, etwas zu finden, von dem Sie beweisen können, dass es nicht läuft. Mit pidof können Sie nachweisen, dass etwas nicht läuft Befehl, der Ihr System abfragt, um die PID einer von Ihnen benannten Anwendung zu ermitteln:

$ pidof zsh
$ sudo pidof zsh

Solange keine PID zurückgegeben wird, läuft die von Ihnen abgefragte Anwendung nicht.

Freigabe aufheben

Die Freigabe aufheben Befehl führt ein Programm in einem Namespace unshared aus aus seinem übergeordneten Prozess. Es sind viele Arten von Namespaces verfügbar, also lesen Sie den Abschnitt Freigabe aufheben Manpage für alle verfügbaren Optionen.

So erstellen Sie einen neuen Namespace für Ihren Testbefehl:

$ sudo unshare --fork --pid --mount-proc zsh
%

Da Zsh eine interaktive Shell ist, bringt es Sie beim Start bequem in seinen Namensraum. Nicht alle Prozesse tun dies, da einige Prozesse im Hintergrund ausgeführt werden und Sie an einer Eingabeaufforderung in ihrem nativen Namespace zurückbleiben. Solange Sie in der Zsh-Sitzung bleiben, können Sie sehen, dass Sie den üblichen Namensraum verlassen haben, indem Sie sich die PID Ihres neuen gegabelten Prozesses ansehen:

% pidof zsh
pid 1

Wenn Sie etwas über Linux-Prozess-IDs wissen, dann wissen Sie, dass PID 1 immer reserviert ist, hauptsächlich aufgrund der Natur des Boot-Prozesses, für die Initialisierungsanwendung (systemd auf den meisten Distributionen außerhalb von Slackware, Devuan und vielleicht einigen angepassten Installationen von Arch). . Es ist nahezu unmöglich, dass Zsh oder jede Anwendung, die keine Boot-Initialisierungsanwendung ist, PID 1 ist (weil ein Computer ohne ein Init-System nicht wissen würde, wie er booten soll). Doch soweit Ihre Shell in dieser Demonstration weiß, belegt Zsh den PID 1-Slot.

Ungeachtet dessen, was Ihre Shell Ihnen jetzt sagt, hat PID 1 auf Ihrem System nicht ersetzt worden. Öffnen Sie ein zweites Terminal oder eine Terminal-Registerkarte auf Ihrem Computer und sehen Sie sich PID 1 an:

$ ps 1
init

Und dann finden Sie die PID von Zsh:

$ pidof zsh
7723

Wie Sie sehen können, sieht Ihr "Host"-System das Gesamtbild und versteht, dass Zsh tatsächlich als eine PID mit hoher Nummer ausgeführt wird (es wird wahrscheinlich nicht 7723 auf Ihrem Computer sein, außer durch Zufall). Zsh sieht sich selbst nur als PID 1, weil sein Geltungsbereich auf (oder enthalten) beschränkt ist innerhalb) seines Namensraums. Sobald Sie einen Prozess in seinen eigenen Namensraum verzweigt haben, werden seine untergeordneten Prozesse beginnend mit 1 nummeriert, aber nur innerhalb dieses Namensraums.

Namespaces, zusammen mit anderen Technologien wie cgroups und mehr bilden die Grundlage der Containerisierung. Wenn Sie verstehen, dass Namespaces im Kontext des breiteren Namespace einer Hostumgebung existieren (in dieser Demonstration ist das Ihr Computer, aber in der realen Welt ist der Host normalerweise ein Server oder eine Hybrid-Cloud), können Sie besser verstehen, wie und warum containerisierte Anwendungen funktionieren wie sie es tun. Beispielsweise „weiß“ ein Container, der einen Wordpress-Blog ausführt, nicht, dass er nicht in einem Container ausgeführt wird; Es weiß, dass es Zugriff auf einen Kernel und etwas RAM und die von Ihnen bereitgestellten Konfigurationsdateien hat, aber es kann wahrscheinlich nicht auf Ihr Home-Verzeichnis oder ein Verzeichnis zugreifen, für das Sie ihm keine ausdrückliche Zugriffsberechtigung erteilt haben. Darüber hinaus kann ein außer Kontrolle geratener Prozess innerhalb dieser Blog-Software keinen anderen Prozess auf Ihrem System beeinflussen, da der PID-„Baum“ soweit bekannt nur auf 1 zurückgeht und 1 der Container ist, in dem er ausgeführt wird.

Container sind ein leistungsstarkes Linux-Feature und werden jeden Tag beliebter. Nachdem Sie nun verstanden haben, wie sie funktionieren, erkunden Sie Container-Technologien wie Kubernetes, Silverblue oder Flatpak und sehen Sie, was Sie mit Container-Apps machen können. Container sind Linux, also starten Sie sie, überprüfen Sie sie sorgfältig und lernen Sie, während Sie gehen.


Linux
  1. Linux-Namespaces

  2. Linux-Befehle:jobs, bg und fg

  3. 6 Ressourcen und 3 Tipps, die Ihnen den Einstieg in die Welt der Linux-Container erleichtern

  4. Linux – Sysfs und Devtmpfs?

  5. Anzeigen/Manipulieren von Mount-Namespaces in Linux

Mein funktionsreiches und minimales Linux-Terminal

Einführung in die Verwaltung von Linux-Containern

Linux-Kernel und seine Funktionen

Installieren und konfigurieren Sie Ansible unter Linux

Installieren und Konfigurieren von Jenkins unter Linux

So installieren und richten Sie LXC-Linux-Container unter CentOS / RHEL / Ubuntu ein