GNU/Linux >> Znalost Linux >  >> Linux

Demystifikace jmenných prostorů a kontejnerů v Linuxu

Kontejnery vzaly svět útokem. Ať už si vybavíte Kubernetes, Docker, CoreOS, Silverblue nebo Flatpak, když uslyšíte tento termín, je jasné, že moderní aplikace běží v kontejnerech kvůli pohodlí, zabezpečení a škálovatelnosti.

Pochopení kontejnerů však může být matoucí. Co to znamená běžet v kontejneru? Jak mohou procesy v kontejneru interagovat se zbytkem počítače, na kterém běží? Open source nemá rád záhady, takže tento článek vysvětluje backend technologie kontejnerů, stejně jako můj článek na Flatpak vysvětlil běžný frontend.

Jmenné prostory

Jmenné prostory jsou ve světě programování běžné. Pokud pobýváte ve vysoce technických místech počítačového světa, pak jste pravděpodobně viděli kód jako tento:

using namespace std;

Nebo jste to možná viděli v XML:

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

Tyto druhy frází poskytují kontext pro příkazy použité později v souboru zdrojového kódu. Jediný důvod, proč C++ například ví, co programátoři myslí, když zadají cout je to proto, že C++ zná cout jmenný prostor je smysluplné slovo.

Linuxové kontejnery

  • Co jsou kontejnery systému Linux?
  • Úvod do terminologie kontejnerů
  • Stáhnout:Containers Primer
  • Operátoři Kubernetes:Automatizace platformy pro orchestraci kontejnerů
  • eKniha:Vzory Kubernetes pro navrhování cloudových nativních aplikací
  • Co je Kubernetes?

Pokud je to pro vás příliš technické, abyste si to dokázali představit, možná vás překvapí, že všichni používáme jmenné prostory každý den i v reálném životě. Neříkáme jim jmenné prostory, ale tento koncept používáme neustále. Například fráze „Jsem fanouškem Enterprise“ má jeden význam v IT společnosti, která slouží velkým podnikům (které se běžně nazývají „podniky“), ale na konferenci sci-fi může mít jiný význam. Otázka "jaký motor běží?" má jeden význam v garáži a jiný význam ve vývoji webu. V běžné konverzaci ne vždy deklarujeme jmenný prostor, protože jsme lidé a náš mozek se dokáže rychle přizpůsobit, aby určil kontext, ale u počítačů musí být jmenný prostor deklarován explicitně.

U kontejnerů je jmenný prostor tím, co definuje hranice „uvědomění“ procesu o tom, co kolem něj běží.

lsns

Možná si to neuvědomujete, ale váš počítač s Linuxem tiše udržuje různé jmenné prostory specifické pro dané procesy. Pomocí nejnovější verze util-linux balíčku, můžete vypsat existující jmenné prostory na vašem počítači:

$ 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 [...]
[...]

Pokud je vaše verze util-linux neposkytuje lsns můžete vidět položky jmenného prostoru v /proc :

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

Každý proces běžící na vašem počítači se systémem Linux je vyčíslen pomocí ID procesu (PID). Každému PID je přiřazen jmenný prostor. PID ve stejném jmenném prostoru mohou mít k sobě navzájem přístup, protože jsou naprogramovány tak, aby fungovaly v daném jmenném prostoru. PID v různých jmenných prostorech nemohou ve výchozím nastavení vzájemně interagovat, protože běží v jiném kontextu neboli jmenném prostoru . To je důvod, proč proces běžící v "kontejneru" pod jedním jmenným prostorem nemůže přistupovat k informacím mimo svůj kontejner nebo k informacím běžícím v jiném kontejneru.

Vytvoření nového jmenného prostoru

Obvyklou funkcí softwaru zabývajícího se kontejnery je automatická správa jmenného prostoru. Lidský administrátor spouštějící novou kontejnerizovanou aplikaci nebo prostředí nemusí používat lsns zkontrolovat, které jmenné prostory existují, a poté ručně vytvořit nový; software využívající jmenné prostory PID to dělá automaticky s pomocí linuxového jádra. Tento proces však můžete napodobit ručně, abyste lépe porozuměli tomu, co se děje v zákulisí.

Nejprve musíte identifikovat proces, který není běžící na vašem počítači. V tomto příkladu použiji Z shell (Zsh), protože na svém počítači spouštím shell Bash. Pokud na počítači používáte Zsh, použijte Bash nebo tcsh nebo nějaký jiný shell, který aktuálně nepoužíváte. Cílem je najít něco, co můžete dokázat, že nefunguje. Pomocí pidof můžete dokázat, že něco nefunguje příkaz, který se dotáže vašeho systému, aby zjistil PID libovolné aplikace, kterou pojmenujete:

$ pidof zsh
$ sudo pidof zsh

Dokud není vráceno žádné PID, aplikace, na kterou jste se dotazovali, není spuštěna.

Zrušit sdílení

zrušit sdílení příkaz spustí program ve jmenném prostoru nesdílený z jeho nadřazeného procesu. K dispozici je mnoho druhů jmenných prostorů, přečtěte si proto zrušení sdílení manuálová stránka pro všechny dostupné možnosti.

Chcete-li vytvořit nový jmenný prostor pro váš testovací příkaz:

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

Protože Zsh je interaktivní shell, po spuštění vás pohodlně přenese do svého jmenného prostoru. Ne všechny procesy to dělají, protože některé procesy běží na pozadí, takže se zobrazí výzva ve svém nativním jmenném prostoru. Dokud zůstanete v relaci Zsh, můžete se podívat na PID vašeho nového rozvětveného procesu, že jste opustili obvyklý jmenný prostor:

% pidof zsh
pid 1

Pokud víte něco o ID procesů Linuxu, pak víte, že PID 1 je vždy vyhrazeno, většinou z povahy zaváděcího procesu, pro inicializační aplikaci (systemd na většině distribucí mimo Slackware, Devuan a možná i některé přizpůsobené instalace Archu) . Je téměř nemožné, aby Zsh nebo jakákoli aplikace, která není aplikací pro inicializaci spouštění, byla PID 1 (protože bez systému init by počítač nevěděl, jak se zavést). Přesto, pokud váš shell v této ukázce ví, Zsh zabírá slot PID 1.

Navzdory tomu, co vám váš shell nyní říká, PID 1 ve vašem systému není byl nahrazen. Otevřete druhý terminál nebo kartu terminálu na vašem počítači a podívejte se na PID 1:

$ ps 1
init

A pak najděte PID Zsh:

$ pidof zsh
7723

Jak můžete vidět, váš "hostitelský" systém vidí celkový obraz a chápe, že Zsh ve skutečnosti běží jako nějaký PID s vysokým číslem (pravděpodobně to nebude 7723 na vašem počítači, leda shodou okolností). Zsh se považuje za PID 1 pouze proto, že jeho rozsah je omezen na (nebo obsahuje uvnitř) svého jmenného prostoru. Jakmile rozdělíte proces do jeho vlastního jmenného prostoru, jeho podřízené procesy jsou číslovány od 1, ale pouze v rámci tohoto jmenného prostoru.

Jmenné prostory spolu s dalšími technologiemi, jako jsou cgroups a další, tvoří základ kontejnerizace. Pochopení toho, že jmenné prostory existují v kontextu širšího jmenného prostoru hostitelského prostředí (v této ukázce je to váš počítač, ale ve skutečném světě je hostitelem obvykle server nebo hybridní cloud), vám může pomoci pochopit, jak a proč kontejnerové aplikace fungují. jak to dělají. Například kontejner, na kterém běží blog Wordpress, „neví“, že neběží v kontejneru; ví, že má přístup k jádru a nějaké paměti RAM a jakýmkoli konfiguračním souborům, které jste mu poskytli, ale pravděpodobně nemá přístup k vašemu domovskému adresáři ani k žádnému adresáři, ke kterému jste mu výslovně neudělili oprávnění. Kromě toho, nekontrolovaný proces v tomto blogovém softwaru nemůže ovlivnit žádný jiný proces ve vašem systému, protože pokud ví, "strom" PID se vrací pouze k 1 a 1 je kontejner, ve kterém běží.

Kontejnery jsou výkonnou funkcí Linuxu a každým dnem jsou populárnější. Nyní, když rozumíte, jak fungují, zkuste prozkoumat technologii kontejnerů, jako je Kubernetes, Silverblue nebo Flatpak, a uvidíte, co můžete dělat s kontejnerovými aplikacemi. Kontejnery jsou linuxové, takže je spusťte, pečlivě si je prohlédněte a učte se za pochodu.


Linux
  1. Linux – Sysfs a Devtmpfs?

  2. Jak vytvořit a spustit kontejnery LXC Linux pomocí příkazů LXC

  3. Zobrazení/manipulace jmenných prostorů připojení v Linuxu

  1. Linuxové jmenné prostory

  2. Linuxové příkazy:jobs, bg a fg

  3. 6 zdrojů a 3 tipy, které vám pomohou vstoupit do světa linuxových kontejnerů

  1. Jaký je rozdíl mezi linuxovým kontejnerem a obrázkem?

  2. Co je Docker (a Linux kontejnery?)

  3. Linux – Kernel:Podpora jmenných prostorů?