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
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.
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
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
- dall’interno del chroot:
/ # /busybox kill 10423 - oppure dall’esterno:
frank@laptop01:~$ sudo kill 10423
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.


