Il comando chroot, abbreviazione di “change root”, è utilizzato su GNU/Linux per cambiare la cartella radice (root directory) per un processo e per i suoi processi figli. Permette di creare un ambiente a sé in cui un programma o un utente possono operare, con una struttura di directory distinta da quella del sistema principale. Quando si esegue il comando chroot, si specifica una nuova directory che diventa la radice (“/”) per il processo avviato all’interno di quella directory. Da quel momento in poi, il processo e tutti i suoi figli vedranno quella directory come se fosse la radice del sistema, senza poter accedere alle directory al di fuori di essa, salvo che non siano esplicitamente montate. In questo articolo vediamo come chroot sia una sorta di “coltellino svizzero” per recuperare sistemi Linux che, per varie ragioni, non si avviano più.
L’uso di chroot per la manutenzione e il ripristino dei sistemi Linux
Quando ci si trova dinanzi a un sistema Linux che rifiuta di avviarsi, è facile cadere nella tentazione di reinstallare tutto da zero. Esiste tuttavia una tecnica potente, ma spesso sottovalutata, che può riportare in vita il sistema senza perdere configurazioni o dati: essa fa appunto leva sul comando chroot.
La capacità di chroot, che permette di eseguire comandi in un ambiente “di appoggio” con un file system alternativo, risulta davvero eccellente per il recupero dei sistemi che non si avviano correttamente. Si può ad esempio accedere a un sistema Linux danneggiato montato da una distribuzione live in esecuzione su una chiavetta USB o da un altro computer per poi effettuare aggiornamenti, correzioni sui pacchetti corrotti e rigenerare file di avvio critici.
Quando utilizzare chroot
È possibile guardare all’utilizzo di chroot in molteplici scenari:
- Sistema che non si avvia dopo un aggiornamento fallito.
- File di configurazione critici danneggiati.
- Bootloader corrotto.
- Recupero di password root perse.
In termini di requisiti, è necessario disporre di un ambiente Linux funzionante, ad esempio una live USB (Ubuntu, Linux Mint,…) e dell’accesso root a tale ambiente, in maniera tale da poter impartire comandi sudo
. Come secondo passo, è ovviamente indispensabile identificare le partizioni del sistema danneggiato.
Come recuperare un sistema Linux che non si avvia più
Per cominciare, è necessario avviare il sistema da una chiavetta USB contenente una distribuzione Linux live, così come spiegato in precedenza. In alternativa, è possibile collegare l’unità con il sistema Linux danneggiato a un altro computer funzionante che esegue “il pinguino”.
Avvalendosi dei comandi lsblk
, fdisk -l
o gparted
si può andare alla ricerca delle partizioni del sistema non avviabile, contenute nel percorso /dev
. In particolare, si devono cercare la directory root e la cartella /boot
.
Supponiamo, per esempio, che /dev/DEVICE1
monti la partizione principale (root) e che /dev/DEVICE2
monti la partizione /boot
.
Con i comandi che seguono creiamo dapprima le directory di appoggio per effettuare il recupero del sistema Linux:
sudo mkdir -p /mnt/rescue
sudo mkdir -p /mnt/rescue/boot
Montiamo quindi le partizioni del sistema che manifesta problemi attestandole sui percorsi appena creati:
sudo mount /dev/DEVICE1 /mnt/rescue
sudo mount /dev/DEVICE2 /mnt/rescue/boot
Montaggio dei file system virtuali
I comandi di seguito consentono di montare vari file system necessari per il corretto funzionamento di un sistema operativo Linux, nel contesto di ripristino o di recupero.
Si comincia col montare il file system proc
(che contiene informazioni sui processi in esecuzione e altre informazioni di sistema) dalla posizione /proc
nella nuova directory /mnt/rescue/proc
. In questo modo chroot potrà avere visibilità sulle informazioni relative ai processi del sistema originale.
Si prosegue montando il file system sysfs
, che fornisce informazioni sul kernel e sui dispositivi hardware; la directory /dev
, dove sono situati i file dei dispositivi hardware; il file system devpts
, che gestisce i terminali virtuali, come quelli utilizzati per le sessioni di login.
sudo mount -t proc /proc /mnt/rescue/proc
sudo mount -t sysfs /sys /mnt/rescue/sys
sudo mount --bind /dev /mnt/rescue/dev
sudo mount -t devpts devpts /mnt/rescue/dev/pts
Accesso al sistema con chroot
Adesso, digitando il comando seguente, diventa possibile gestire il sistema Linux danneggiato, operando dall’istanza live in esecuzione. Si possono quindi impartire tutti i comandi come se il sistema fosse realmente avviato dall’installazione originale:
sudo chroot /mnt/rescue /bin/bash
Casi d’uso e comandi utili
In un ambiente GNU/Linux, spno disponibili molteplici comandi utili per risolvere problemi comuni legati a broken packages, alla rigenerazione di initramfs o alla reinstallazione del bootloader GRUB. Giusto per fare qualche esempio.
Per gestire il caso dei broken packages o di aggiornamenti incompleti, sui sistemi Debian/Ubuntu si possono eseguire i seguenti comandi:
apt update
per aggiornare l’elenco dei pacchetti, seguito da apt upgrade
per installare gli aggiornamenti disponibili. Se ci sono broken packages, dpkg --configure -a
può essere utilizzato per sistemare i pacchetti non configurati correttamente, mentre apt --fix-broken install
risolve automaticamente le dipendenze mancanti o i pacchetti “rotti”.
Nel caso di un sistema che non si avvia correttamente, potrebbe essere necessario rigenerare initramfs utilizzando il comando update-initramfs -u -k all
, che aggiorna il file di inizializzazione per tutti i kernel disponibili. initramfs (Initial RAM File System) è un file system temporaneo caricato in memoria all’avvio del sistema operativo Linux. Contiene i file necessari per avviare il sistema, come i driver di base e gli script di inizializzazione, prima che sia montato il vero e proprio file system del sistema operativo.
Infine, se il sistema ha problemi con il bootloader, è possibile reinstallare GRUB con il comando grub-install /dev/DEVICE
, seguito da update-grub
per aggiornare la configurazione del bootloader. Al posto di DEVICE
bisogna assicurarsi di specificare il nome dell’unità di avvio principale.
Per approfondire l’argomento, date un’occhiata al post di Samuel Lampa e a questo articolo di TurnKey.