© Copyright 2026 Ferrantino Francesco

I container sono oggi al cuore di molti ambienti di sviluppo e produzione. Ma cosa succede sotto il cofano?




Prima di arrivare a Docker, Podman o Kubernetes è utile capire i meccanismi di base messi a disposizione dal kernel Linux. In questo percorso partiamo da chroot il più semplice e storico.

I container moderni si basano su due funzionalità fondamentali del kernel Linux:
  • namespaces che isolano processi, rete, filesystem e altri componenti del sistema
  • cgroups che permettono di assegnare e limitare l’uso delle risorse come CPU, RAM e I/O

Prima di questi meccanismi si usava chroot per limitare la visione del filesystem ma non garantisce isolamento di rete, processi o sicurezza.

chroot (change root) modifica la root directory di un dato processo e di conseguenza di tutti i child di quel processo. Un processo avviato con chroot vede solo una parte limitata del filesystem come se fosse il suo intero sistema. Questo metodo però non isola rete, processi o risorse: è quindi utile come sandbox di base ma non offre la sicurezza e l'isolamento necessari per i container moderni.

Esempio: Creiamo una directory che fungerà da nuova root:
frank@laptop01:~$ mkdir /home/frank/box

BusyBox è indispensabile in chroot perché chroot cambia solo la root del filesystem e non fornisce alcun comando o shell. Senza BusyBox dentro la chroot non avremmo strumenti per interagire con l’ambiente. BusyBox fornisce una userland minimale (shell e comandi di base) che rende la chroot utilizzabile pur senza aggiungere isolamento o sicurezza. All’interno di una chroot non esistono automaticamente shell, comandi o strumenti di base: tutto ciò che serve deve essere copiato manualmente. È importante sottolineare che BusyBox non migliora la sicurezza di chroot e non aggiunge isolamento: il suo ruolo è esclusivamente quello di rendere l’ambiente utilizzabile dal punto di vista dell’utente.

Installiamo BusyBox sull'host in Fedora Linux:
frank@laptop01:~$ sudo dnf install busybox
Verifichiamo il percorso del binario:
frank@laptop01:~$ which busybox
/usr/bin/busybox
Copiamo BusyBox nella directory del chroot:
frank@laptop01:~$ cp /usr/bin/busybox /home/frank/box

stress è uno strumento da riga di comando utilizzato per generare carico artificiale su CPU, memoria, I/O e processi. Viene usato per testare e osservare il comportamento del sistema sotto carico.

Installiamo Stress sull’host in Fedora Linux:
frank@laptop01:~$ sudo dnf install stress
Verifichiamo il percorso del binario:
frank@laptop01:~$ which stress
/usr/bin/stress
Copiamo il binario nel chroot:
frank@laptop01:~$ cp /usr/bin/stress /home/frank/box
Per vedere quali librerie usa:
frank@laptop01:~$ ldd /usr/bin/stress
        linux-vdso.so.1 (0x00007f35e92f8000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f35e91da000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f35e8fe6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f35e92fa000)
Ora crea le directory dentro il chroot:
frank@laptop01:~$ mkdir -p /home/frank/box/lib64
E copia le librerie:
frank@laptop01:~$ cp /usr/lib64/libm.so.6 /home/frank/box/lib64
frank@laptop01:~$ cp /usr/lib64/libc.so.6 /home/frank/box/lib64
frank@laptop01:~$ cp /usr/lib64/ld-linux-x86-64.so.2 /home/frank/box/lib64
Entriamo nel chroot avviando la shell ash di BusyBox:
frank@laptop01:~$ sudo chroot /home/frank/box /busybox ash

Con /busybox indichiamo che vogliamo eseguire BusyBox nella root del chroot che corrisponde alla cartella box e ash è il nome della shell di busybox.

Ora ci troviamo all'interno della nostra chroot e la cartella corrente è la root del filesystem:
/ # /busybox pwd
/
Per visualizzare i comandi BusyBox:

    / # /busybox
    
    oppure
    
    / # /busybox --list
Eseguiamo un semplice comando: / # /busybox ls busybox

A livello di filesystem non possiamo uscire ma possiamo vedere comunque i processi che stanno al di fuori di chroot.

Eseguiamo stress come demone per saturare la CPU:
/ # /stress --cpu 1 --vm 1 --vm-bytes 100M&

Usciamo dal chroot: / # exit
All’esterno possiamo vedere tranquillamente il processo:
frank@laptop01:~$ pstree -p | grep stress
           |               |-stress(10423)-+-stress(10424)
           |               |               `-stress(10425)

Il processo stress con PID 10423 è il processo padre e da esso vengono generati due processi figli con PID 10424 e 10425.

Usare pidstat per visualizzare l'uso della CPU e della RAM:
frank@laptop01:~$ pidstat -u -r -p 14902,14903,14904 1

  
Linux 6.17.11-300.fc43.x86_64 (laptop01) 16/12/2025 _x86_64_ (4 CPU)
Time UID PID %usr %system %guest %wait %CPU CPU Command
15:57:51 0 14902 0,00 0,00 0,00 0,00 0,00 1 stress
15:57:51 0 14903 99,00 0,00 0,00 0,00 99,00 2 stress
15:57:51 0 14904 34,00 63,00 0,00 0,00 97,00 0 stress
Time UID PID minflt/s majflt/s VSZ RSS %MEM Command
15:57:51 0 14902 0,00 0,00 3552 2192 0,03 stress
15:57:51 0 14903 0,00 0,00 3552 528 0,01 stress
15:57:51 0 14904 156478,00 0,00 105956 61372 0,77 stress
Attraverso pidstat è possibile verificare in modo immediato il consumo di CPU e RAM di un processo: la CPU viene osservata tramite la percentuale di utilizzo, mentre la memoria reale è rappresentata dal valore RSS, che indica la quantità di RAM effettivamente occupata.

INFO: monitorare i processi con htop

  • Premi F5 per attivare la Tree View (vista ad albero)
  • Premi F3 e cerca NOME_PROCESSO (esempio: stress) per visualizzare solo i processi interessati
  • Premi F2 -> Setup -> Display options per migliorare la leggibilità:
    • Tree View (se non attiva)
    • Show custom thread names
    • Highlight program path
Conosciuto il PID, il processo può essere terminato:
  • dall’interno del chroot:
    / # /busybox kill 10423
  • oppure dall’esterno:
    frank@laptop01:~$ sudo kill 10423
All’esterno possiamo vedere che il processo stress è scomparso:
frank@laptop01:~$ pstree -p | grep stress

L’utilizzo di stress rende evidente che chroot non isola né i processi né l’uso delle risorse. Il carico generato all’interno del chroot impatta direttamente il sistema host. È proprio da questi limiti che nascono i namespaces e i cgroups che vedremo nei prossimi articoli e che costituiscono le fondamenta dei container moderni.

Ferrantino Francesco

Ferrantino Francesco

Cookie Policy

Leggi  informativa Cookie Policy
Il "Sito" utilizza i Cookie per rendere i propri servizi semplici e efficienti per l’utenza che visiona le pagine di franksoft.it

Disclaimer

L'autore degli articoli non si assume nessuna responsabilità per eventuali danni ai vostri dispositivi. Tutto ciò che viene spiegato è puramente a scopo dimostrativo.
Il presente sito non costituisce testata giornalistica in quanto non ha carattere periodico ed è aggiornato secondo la mia disponibilità e la reperibilità dei materiali ivi contenuti. Pertanto, non può essere considerato in alcun modo un prodotto editoriale ai sensi della Legge n. 62 del 7/03/2001.

Licenza

Tutte le immagini presenti nel sito appartengono ai rispettivi titolari e sono utilizzate senza alcuno scopo di lucro. Ogni eventuale violazione del copyright non è intenzionale.
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Non opere derivate 4.0 Internazionale.  Licenza Creative Commons