fb-pixel
SupportHost italian

Come si usa il comando chroot su Linux

Vuoi sapere come usare il comando chroot per cambiare la root directory? In questa guida vedremo a cosa serve questo comando, come si usa in generale e come usarlo in un caso pratico.

Iniziamo!

A cosa serve il comando chroot?

Il comando chroot (che sta per change root) ci permette di modificare in modo apparente, la root di sistema, vale a dire la directory principale del sistema.

Definendo una nuova cartella come root, andiamo a creare un ambiente circoscritto: i processi non possono infatti accedere ai file o ai comandi che non sono contenuti nella nuova root. Trattandosi di un ambiente isolato dal resto del sistema, viene perciò definito chroot jail o prigione chroot.

Il comando chroot ci permette di creare un ambiente separato per diversi motivi, vediamo i principali.

  • Reinstallare il boot loader: se l’installazione del boot loader è fallita o ci sono file mancanti o corrotti, si può usare il comando chroot per reinstallarlo.
  • Aggiornare i pacchetti: in chroot si possono fare singoli aggiornamenti e downgrade del kernel in caso di problemi.
  • Resettare la password di root: uno dei metodi per recuperare la password di root è quello di usare una distribuzione live, come un USB bootable, fare il chroot e poi cambiare la password con il comando passwd.

Oltre che a risolvere problemi, il comando chroot ci permette semplicemente di creare un ambiente separato e quindi può essere usato in certi casi come alternativa a una macchina virtuale.

Come usare il comando chroot

Per prima cosa creiamo una cartella che sarà la nostra nuova root. Ci basta usare il comando mkdir, in questo modo:

mkdir chroot-jail

Ora proviamo a usare il comando chroot, seguito dal nome della cartella appena creata, in questo modo:

chroot chroot-jail

Avremo un errore come questo:

chroot: failed to run command ‘/usr/bin/bash’: No such file or directory

Questo succede perché la cartella che abbiamo creato è vuota, ma il comando chroot cerca di lanciare bash e, non trovandolo, restituisce questo errore.

La prima cosa da fare, quindi, è copiare dei programmi all’interno della nuova root. Non ci basterà però solo copiare gli eseguibili, ma dovremo anche copiare le librerie che questi programmi utilizzano per funzionare.

Per cominciare possiamo partire proprio dal copiare bash.

Ricreiamo quindi l’albero delle cartelle all’interno di chroot-jail:

  • creiamo la cartella usr
  • al suo interno creiamo le cartelle “bin” e “lib”.

Se usiamo il comando which seguito dal nome del comando possiamo risalire alla posizione dell’eseguibile.

which bash

Nel nostro caso, su Arch, l’output sarà:

/usr/bin/bash

Dopo aver trovato la posizione, copiamo l’eseguibile:

cp /usr/bin/bash ~/chroot-jail/usr/bin/bash

Ora è il momento di copiare le librerie, per prima cosa per conoscere le dipendenze di un comando possiamo usare il comando ldd così:

ldd /usr/bin/bash
Comando Chroot Trovare Dipendenze Eseguibile

L’output ci mostrerà quali sono le librerie che ci servono e quindi quali sono le librerie da copiare nella cartella chroot-jail.

A questo punto usiamo il comando cp per copiare le librerie, nel nostro caso in questo modo:

cp /usr/lib/libreadline.so.8 ~/chroot-jail/usr/lib/libreadline.so.8
cp /usr/lib/libncursesw.so.6 ~/chroot-jail/usr/lib/libncursesw.so.6
cp /usr/lib/libc.so.6 ~/chroot-jail/usr/lib/libc.so.6
cp /usr/lib64/ld-linux-x86-64.so.2 ~/chroot-jail/usr/lib/ld-linux-x86-64.so.2

Nel nostro caso specifico, bisogna tenere presente che le librerie in lib64 sono in realtà da inserire nella cartella /usr/lib perché /lib e /lib64 sono link simbolici che rimandano alla cartella /usr/lib.

Una volta copiate le librerie, possiamo cambiare root in questo modo:

sudo chroot chroot-jail

A questo punto vedremo nel terminale “bash” seguito dal numero della versione, questo ci indica che chroot è correttamente in uso. È importante ricordarsi che quando si usa chroot si ha automaticamente accesso come root.

Per uscire ci basta digitare:

exit

In questo modo torneremo al sistema principale.

Usare chroot per riparare il bootloader

Nel nostro caso /dev/sdh2 è la root di sistema, /dev/sdh1 è la partizione di boot. Creiamo innanzitutto una cartella dove montare il dispositivo con il bootloader non funzionante.

mkdir /mnt/chroot

Montiamo la root del sistema con il comando mount.

mount /dev/sdh2 /mnt/chroot

Poi montiamo la partizione di boot con il seguente comando:

mount /dev/sdh1 /mnt/chroot/boot

Ora passiamo al montaggio delle API del file system che permettono il corretto funzionamento del sistema ed inoltre per i sistemi operativi UEFI è necessario montare anche le variabili EFI per far sì che GRUB si installi correttamente e possa essere funzionante all’avvio.

mount -t proc /proc /mnt/chroot/proc
mount -t sysfs /sys /mnt/chroot/sys
mount -o bind /dev /mnt/chroot/dev
mount -o bind /run /mnt/chroot/run

Infine le variabili EFI per poter ripristinare correttamente il bootloader:

mount -o bind /sys/firmware/efi/efivars /mnt/chroot/sys/firmware/efi/efivars/

Se è necessario connettersi ad internet, ad esempio per scaricare dei nuovi pacchetti per la distribuzione, è necessario copiare anche il file resolv.conf che contiene le informazioni dei DNS.

cp /etc/resolv.conf /mnt/chroot/etc/resolv.conf

Fatto questo, il sistema è pronto per essere avviato con il comando chroot:

chroot /mnt/chroot/ /usr/bin/bash

Se vogliamo distinguere le due shell in maniera più semplice, nel file .bashrc (il file di configurazione che ci permette anche di memorizzare gli alias) si può inserire una variabile che aggiunge (chroot) prima della riga user@hostname:

export PS1="(chroot) $PS1"

In questo modo ogni volta che apriremo chroot troveremo (chroot) davanti.

Chroot Collegato Al Sistema Guest

Ritornando al caso di utilizzo iniziale, ovvero recuperare il bootloader, tenendo in considerazione che la distribuzione che stiamo utilizzando è Arch Linux e la partizione EFI è montata in /boot possiamo recuperare il sistema operativo con il seguente comando:

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB

Per assicurarci che non ci siano discrepanze tra gli uuid delle partizioni possiamo anche rigenerare il file di configurazione di GRUB con il seguente comando:

grub-mkconfig -o /boot/grub/grub.cfg

Quando abbiamo terminato il nostro lavoro, usciamo da chroot con il comando:

exit

E se il nostro ambiente confinato non ci serve più è possiamo smontare i file system montati in precedenza con il comando:

umount --recursive /mnt/chroot

Conclusioni

Con il comando chroot su Linux possiamo creare un ambiente isolato rispetto al file system, questo ci permette di creare un ambiente separato, ad esempio per eseguire processi senza dare accesso a tutto il sistema. Inoltre, cambiare la directory root è anche utile per risolvere vari problemi come recuperare la password o risolvere errori con il bootloader.

Categorie
Indice dei contenuti

    🚀

    Articoli correlati

    Commenti

    Lascia un commento

    Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *