GNU/Linux >> Linux Esercitazione >  >> Linux

Demistificare gli spazi dei nomi e i contenitori in Linux

I container hanno preso d'assalto il mondo. Che tu pensi a Kubernetes, Docker, CoreOS, Silverblue o Flatpak quando senti il ​​termine, è chiaro che le applicazioni moderne vengono eseguite in container per comodità, sicurezza e scalabilità.

Tuttavia, i contenitori possono essere fonte di confusione da capire. Cosa significa eseguire in un container? In che modo i processi in un contenitore possono interagire con il resto del computer su cui sono in esecuzione? L'open source non ama il mistero, quindi questo articolo spiega il backend della tecnologia dei container, proprio come il mio articolo su Flatpak spiegava un frontend comune.

Spazi dei nomi

I namespace sono comuni nel mondo della programmazione. Se risiedi nei luoghi altamente tecnici del mondo dei computer, probabilmente hai visto codice come questo:

using namespace std;

Oppure potresti averlo visto in XML:

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

Questi tipi di frasi forniscono il contesto per i comandi utilizzati successivamente in un file di codice sorgente. L'unico motivo per cui il C++ sa, ad esempio, cosa intendono i programmatori quando digitano cout è perché C++ conosce il cout namespace è una parola significativa.

Contenitori Linux

  • Cosa sono i container Linux?
  • Un'introduzione alla terminologia dei contenitori
  • Download:Primer sui contenitori
  • Operatori Kubernetes:automatizzare la piattaforma di orchestrazione dei container
  • eBook:modelli Kubernetes per la progettazione di app cloud native
  • Cos'è Kubernetes?

Se è troppo tecnico per te da immaginare, potresti essere sorpreso di apprendere che tutti noi usiamo gli spazi dei nomi ogni giorno anche nella vita reale. Non li chiamiamo namespace, ma usiamo il concetto tutto il tempo. Ad esempio, la frase "Sono un fan dell'impresa" ha un significato in un'azienda IT che serve grandi aziende (che sono comunemente chiamate "imprese"), ma potrebbe avere un significato diverso in una convention di fantascienza. La domanda "che motore è in funzione?" ha un significato in un garage e un significato diverso nello sviluppo web. Non sempre dichiariamo uno spazio dei nomi in una conversazione casuale perché siamo umani e il nostro cervello può adattarsi rapidamente per determinare il contesto, ma per i computer lo spazio dei nomi deve essere dichiarato esplicitamente.

Per i contenitori, uno spazio dei nomi è ciò che definisce i confini della "consapevolezza" di un processo di ciò che lo circonda.

lsns

Potresti non rendertene conto, ma la tua macchina Linux mantiene silenziosamente diversi spazi dei nomi specifici per determinati processi. Utilizzando una versione recente di util-linux pacchetto, puoi elencare gli spazi dei nomi esistenti sulla tua macchina:

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

Se la tua versione di util-linux non fornisce gli lsns comando, puoi vedere le voci dello spazio dei nomi in /proc :

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

Ogni processo in esecuzione sulla tua macchina Linux è enumerato con un ID processo (PID). A ogni PID viene assegnato uno spazio dei nomi. I PID nello stesso spazio dei nomi possono avere accesso l'uno all'altro perché sono programmati per funzionare all'interno di un determinato spazio dei nomi. I PID in spazi dei nomi diversi non sono in grado di interagire tra loro per impostazione predefinita perché vengono eseguiti in un contesto o spazio dei nomi diverso . Questo è il motivo per cui un processo in esecuzione in un "contenitore" in uno spazio dei nomi non può accedere alle informazioni al di fuori del suo contenitore o alle informazioni in esecuzione all'interno di un contenitore diverso.

Creazione di un nuovo spazio dei nomi

Una caratteristica comune del software che si occupa di container è la gestione automatica dello spazio dei nomi. Un amministratore umano che avvia una nuova applicazione o un nuovo ambiente containerizzato non deve utilizzare lsns per verificare quali namespace esistono e quindi crearne uno nuovo manualmente; il software che utilizza gli spazi dei nomi PID lo fa automaticamente con l'aiuto del kernel Linux. Tuttavia, puoi imitare il processo manualmente per ottenere una migliore comprensione di ciò che sta accadendo dietro le quinte.

Innanzitutto, devi identificare un processo che non è in esecuzione sul tuo computer. Per questo esempio, userò la shell Z (Zsh) perché sto eseguendo la shell Bash sulla mia macchina. Se esegui Zsh sul tuo computer, usa Bash o tcsh o qualche altra shell che non stai attualmente eseguendo. L'obiettivo è trovare qualcosa che puoi dimostrare che non è in esecuzione. Puoi provare che qualcosa non funziona con pidof comando, che interroga il tuo sistema per scoprire il PID di qualsiasi applicazione nominata:

$ pidof zsh
$ sudo pidof zsh

Finché non viene restituito alcun PID, l'applicazione che hai interrogato non è in esecuzione.

Annulla condivisione

L'annullamento della condivisione comando esegue un programma in uno spazio dei nomi non condiviso dal suo processo padre. Sono disponibili molti tipi di spazi dei nomi, quindi leggi annulla condivisione pagina man per tutte le opzioni disponibili.

Per creare un nuovo spazio dei nomi per il comando di test:

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

Poiché Zsh è una shell interattiva, ti porta comodamente nel suo spazio dei nomi al momento del lancio. Non tutti i processi lo fanno, perché alcuni processi vengono eseguiti in background, lasciandoti a un prompt nel suo spazio dei nomi nativo. Finché rimani nella sessione Zsh, puoi vedere che hai lasciato il solito spazio dei nomi guardando il PID del tuo nuovo processo biforcato:

% pidof zsh
pid 1

Se sai qualcosa sugli ID di processo Linux, allora sai che PID 1 è sempre riservato, principalmente dalla natura del processo di avvio, per l'applicazione di inizializzazione (systemd sulla maggior parte delle distribuzioni al di fuori di Slackware, Devuan e forse alcune installazioni personalizzate di Arch) . È quasi impossibile che Zsh, o qualsiasi applicazione che non sia un'applicazione di inizializzazione di avvio, sia PID 1 (perché senza un sistema init, un computer non saprebbe come avviarsi). Tuttavia, per quanto ne sa la tua shell in questa dimostrazione, Zsh occupa lo slot PID 1.

Nonostante ciò che la tua shell ora ti dice, il PID 1 sul tuo sistema non stato sostituito. Apri un secondo terminale o scheda terminale sul tuo computer e guarda il PID 1:

$ ps 1
init

E poi trova il PID di Zsh:

$ pidof zsh
7723

Come puoi vedere, il tuo sistema "host" vede il quadro generale e capisce che Zsh è effettivamente in esecuzione come un PID con un numero elevato (probabilmente non sarà 7723 sul tuo computer, tranne che per coincidenza). Zsh si considera PID 1 solo perché il suo ambito è limitato a (o contenuto all'interno) il suo spazio dei nomi. Dopo aver biforcato un processo nel proprio spazio dei nomi, i suoi processi figli sono numerati a partire da 1, ma solo all'interno di quello spazio dei nomi.

Spazi dei nomi, insieme ad altre tecnologie come cgroups e altro ancora, costituiscono la base della containerizzazione. Comprendere che gli spazi dei nomi esistono nel contesto del più ampio spazio dei nomi di un ambiente host (in questa dimostrazione, quello è il tuo computer, ma nel mondo reale l'host è in genere un server o un cloud ibrido) può aiutarti a capire come e perché agiscono le applicazioni containerizzate il modo in cui lo fanno. Ad esempio, un contenitore che esegue un blog Wordpress non "sa" che non è in esecuzione in un contenitore; sa che ha accesso a un kernel e un po' di RAM e qualsiasi file di configurazione gli hai fornito, ma probabilmente non può accedere alla tua home directory oa qualsiasi directory a cui non gli hai dato specificamente il permesso di accedere. Inoltre, un processo incontrollato all'interno di quel software del blog non può influire su nessun altro processo sul tuo sistema, perché per quanto ne sa, l'"albero" PID torna solo a 1 e 1 è il contenitore in cui è in esecuzione.

I container sono una potente funzionalità di Linux e stanno diventando ogni giorno più popolari. Ora che hai capito come funzionano, prova a esplorare la tecnologia dei container come Kubernetes, Silverblue o Flatpak e guarda cosa puoi fare con le app containerizzate. I container sono Linux, quindi avviali, ispezionali attentamente e impara mentre procedi.


Linux
  1. Spazi dei nomi Linux

  2. Comandi Linux:job, bg e fg

  3. Qual è la differenza tra un container Linux e un'immagine?

  4. Linux:come elencare gli spazi dei nomi in Linux?

  5. Come creare e avviare container LXC Linux con i comandi LXC

Il mio terminale Linux ricco di funzionalità e minimale

Introduzione alla gestione dei container Linux

Kernel Linux e le sue funzioni

Installa e configura Ansible in Linux

Installazione e configurazione di Jenkins in Linux

Come installare e configurare i contenitori Linux LXC su CentOS / RHEL / Ubuntu