AllInfo

Cosa sono gli spazi dei nomi Linux e a cosa servono?

Gli spazi dei nomi Linux sono la tecnologia alla base delle tecnologie container come Docker. Sono una funzionalità del kernel Linux che consente al sistema di limitare le risorse visualizzate dai processi containerizzati e che garantisce che nessuno di essi possa interferire con un altro.

Cosa sono gli spazi dei nomi?

Quando si eseguono molti processi e applicazioni diversi su un singolo server, come nel caso di strumenti di distribuzione come Kubernetes, è importante isolare ogni processo, principalmente per motivi di sicurezza.

Un contenitore non dovrebbe essere in grado di ottenere il controllo sulle risorse di un altro, perché se quel contenitore viene poi compromesso, potrebbe compromettere l'intero sistema. Questo metodo di attacco è simile a come funziona il bug della CPU Meltdown; diversi thread di un processore dovrebbero essere isolati l'uno dall'altro. Allo stesso modo, i processi in esecuzione su diversi sistemi virtuali (contenitori) dovrebbero essere isolati da altri contenitori.

Gli spazi dei nomi ottengono questo isolamento a livello di kernel. Simile a come funziona l'applicazione chroot, che imprigiona un processo in una directory radice diversa, gli spazi dei nomi separano altri aspetti del sistema. Sono disponibili sette namespace:

Per impostazione predefinita, qualsiasi processo che esegui utilizza gli spazi dei nomi globali , e anche la maggior parte dei processi sul tuo sistema, se non diversamente specificato.

Lavorare con gli spazi dei nomi

Puoi utilizzare il comando lsns (ls-namespaces) per visualizzare gli attuali namespace attivi nel tuo sistema. Questo comando deve essere eseguito come root, altrimenti l'elenco potrebbe essere incompleto.

< /p> Annuncio

Sopra c'è l'output di lsns da una nuova installazione di Ubuntu. Ogni spazio dei nomi è elencato insieme all'ID del processo, all'utente e al comando che lo ha creato. I sette spazi dei nomi generati da /sbin/init con PID 1 sono i sette spazi dei nomi globali. Gli unici altri spazi dei nomi sono gli spazi dei nomi mnt per i demoni di sistema, insieme al servizio Livepatch di Canonical.

Se lavorassi con i contenitori, questo elenco sarebbe molto più lungo. Puoi generare questo elenco in formato JSON con il flag -J , che puoi utilizzare molto più facilmente con un linguaggio di script.

Puoi modificare lo spazio dei nomi corrente con l'utilità nsenter. Questo comando ti permette di “inserire” lo spazio dei nomi di un altro processo, solitamente per scopi di debug. Può effettivamente eseguire qualsiasi comando in quello spazio dei nomi, ma per impostazione predefinita tenta solo di caricare una shell (/bin/bash di solito).

Si specifica un ID di processo, quindi ogni spazio dei nomi che si desidera inserire:

sudo nsenter -t PID –mount –net –pid //etc.

Ad esempio, il tentativo di inserire lo spazio dei nomi mount per kdevtmpfs ti caricherà in quello spazio dei nomi, ma successivamente fallirà perché non riesce a trovare /bin/bash, il che significa che in realtà ha funzionato, perché la directory radice apparente è stata modificata .

Pubblicità

Se lo spazio dei nomi mnt di tuo figlio include /bin/bash, puoi inserirlo e caricare una shell. Questa operazione può essere eseguita manualmente, ma deve essere eseguita tramite montaggi di bind, che possono manipolare l'albero delle directory e collegare i file negli spazi dei nomi mnt. Questo può portare ad alcuni casi d'uso interessanti, come far leggere a due processi contenuti diversi dallo stesso file.

Per creare nuovi spazi dei nomi, devi eseguire il fork da uno esistente (di solito globale) e specificare quali spazi dei nomi vuoi modificare. Questa operazione viene eseguita con il comando unshare, che esegue un comando con un nuovo spazio dei nomi “unshared” dal master.

Per annullare la condivisione dello spazio dei nomi del nome host, usa:

sudo unshare -u command

Se il comando viene lasciato vuoto, unshare esegue bash per impostazione predefinita. Questo crea un nuovo spazio dei nomi che verrà visualizzato nell'output di lsns:

< /p>

La schermata del multiplexer del terminale viene utilizzata qui per mantenere bash in esecuzione in background, altrimenti lo spazio dei nomi scomparirebbe alla chiusura del processo.

A meno che tu non stia eseguendo una programmazione di livello molto basso, probabilmente non dovrai toccare gli spazi dei nomi da solo. I programmi di containerizzazione come Docker gestiranno i dettagli per te e, nella maggior parte dei casi in cui è necessario l'isolamento dei processi, dovresti semplicemente utilizzare uno strumento esistente. Tuttavia, è importante capire come funzionano gli spazi dei nomi nel contesto della containerizzazione, specialmente se stai eseguendo una configurazione di basso livello dei tuoi container Docker o devi eseguire qualsiasi debug manuale.

Exit mobile version