Chroot/it
DebianMan:chroot è un'utilità che cambia la cartella che viene considerata la radice della gerarchia del file system dai suoi processi figli, in modo che sia impossibile per essi accedere alla cartella superiore rispetto alla nuova radice, anche se esiste fisicamente sul disco.
Casi d'uso comuni
chroot è pensata principalmente per un uso occasionale, ad-hoc.
Se si passa regolarmente ad un ambiente in chroot e ancor più se se ne usano più di uno, considerare l'uso di Schroot, che automatizza alcuni compiti e non richiede i privilegi di root per un uso normale.
- Passare velocemente ad un altro ambiente (distribuzione, versione, tipo, insieme di pacchetti) a scopo di test, compilazione, debug, ecc.
- Riparare un sistema corrotto connettendo come unità esterna la sua unità principale (ad esempio usando un case USB) ad un sistema funzionante ed effettuando operazioni dall'interno del sistema in fase di riparazione.
- Storicamente
chrootera anche usato per aumentare la sicurezza di servizi di rete in esecuzione su una data macchina: se un autore di un attacco riusciva a ingannare il servizio facendogli fare un'esecuzione di codice arbitrario, non avrebbe comunque avuto accesso all'intero file system della macchina (rimaneva dentro ad una cosiddetta prigione chroot (chroot jail)). Ciò tuttavia non impedisce all'autore dell'attaco l'uso delle interfacce di rete della macchina per penetrare ulteriormente la rete interna, inoltre in Linux e alcuni altri UNIX, evadere da una "chroot jail" è relativamente facile. Pertanto, per scopi correlati alla sicurezza,chrootè stato rimpiazzato da macchine virtuali e contenitori.
Configurazione e uso di base
A meno che non esplicitamente diversamente detto, tutti i comandi nelle sottosezioni seguenti richiedono i privilegi di root.
Creare o fornire una gerarchia di file di un sistema Linux
Nelle sezioni seguenti ${chrootFolder} fa riferimento alla cartella radice di una gerarchia di file creata o fornita come descritto in seguito.
- Nel caso di passaggio ad unità connesse esternamente, si tratta di montarle nella cartella di destinazione prescelta.
- Nel caso si desideri creare una immagine Debian nuova, si possono usare utilità come DebianMan:mmdebstrap, per esempio per creare un ambiente pulito per creare pacchetti deb:
mmdebstrap --skip=output/dev,output/mknod --variant=buildd \
trixie "${chrootFolder}" http://deb.debian.org/debian
Montare file system virtuali
Alla data del 2026 questi sono proc, sysfs, udev e i "figli" degli ultimi 2 che sono troppi e che inoltre tendono a nascere e morire troppo di frequente. Fortunatamente DebianMan:mount ha l'opzione --rbind che permette di collegare un file system già montato insieme a tutti i suoi figli, ad una cartella di destinazione aggiuntiva. Naturalmente systemd ha deciso di rendere diffettose alcune funzionalità di base, perciò è necessario inoltre usare o l'opzione --make-rslave o --make-rprivate per forzare il comportamento corretto (vedere DebianMan:mount_namespaces per i dettagli).
mount -t proc proc "${chrootFolder}/proc"
mount --rbind --make-rslave /sys "${chrootFolder}/sys"
mount --rbind --make-rslave /dev "${chrootFolder}/dev"
Nel caso ci si stia interrogando sul fatto che anche proc ha 1 figlio: binfmt_misc, che è usato per registrare gestori/interpreti di eseguibili binari, il che non ha senso in una chroot (deve essere fornito il percorso assoluto di un dato interprete, che è inaccessibile da un contesto in chroot), perciò è inutile collegarlo.
Copiare la configurazione del risolutore DNS
cp /etc/resolv.conf "${chrootFolder}/etc/"
Effettuare il passaggio ad una chroot
Ciò solitamente consiste in
chroot "${chrootFolder}"
...che avvia una shell di login interattiva dell'utente root all'interno dell'ambiente in chroot, in modo che si possa effettuare in modo interattivo ogni compito sia necessario.
Per i compiti non interattivi, si può fornire invece un comando alternativo e i suo argomenti:
chroot "${chrootFolder}" /root/myScriptToBeExecutedInChroot.sh myArg1 myArg2
/root/myScriptToBeExecutedInChroot.sh è un percorso all'interno della gerarchia in chroot.
Pulizia
Dopo il termine del processo chroot è necessario scollegare / smontare tutti i file system virtuali collegati/montati in precedenza. Per fortuna umount ha anche un'opzione --recursive / -R per aiutare a farlo:
umount -R "${chrootFolder}/dev"
umount -R "${chrootFolder}/sys"
umount -R "${chrootFolder}/proc"
Se ${chrootFolder} è un punto di mount di un'unità esterna e si desidera smontare anche quello, si possono sostituire tutti i comandi scritti sopra con solo il seguente comando:
umount -R "${chrootFolder}"
Note e scenari aggiuntivi
Eseguire applicazioni X11 con GUI
Eseguire applicazioni X11 con GUI dall'interno di un ambiente in chroot e visualizzarle sul server X11 dell'host funziona usando i meccanismi standard: basta esportare il valore della variabile d'ambiente DISPLAY dall'host nella chroot e assicurarsi che il server X dell'host permetta tutte le connessioni (per esempio usando l'utilità DebianMan:xhost).
Eseguire servizi systemd
I servizi systemd generalmente si rifiutano di essere eseguiti in un ambiente chroot. Usare systemd-nspawn invece di chroot se si ha necessità di eseguire servizi systemd.
Architetture estranee
Se è installato DebianPkg:qemu-user-binfmt, è possibile usare chroot per un file system per ogni architettura diversa supportata da esso.
Modificare i dati di avvio
Se si desidera modificare i dati di avvio di un altro sistema, nella cui unità si è entrati tramite chroot (ciò include, ad esempio, eseguire update-grub, update-initramfs, installare un nuovo kernel o firmware + moduli del kernel per dispositivi critici per l'avvio, ecc.), è necessario montare la sua gerarchia /boot. Ciò può includere quanto segue:
/bootstesso è a volte una partizione separata, più comunemente nei sistemi che usano un qualche schema di cifratura del disco.- su sistemi UEFI (ciò include la maggior parte dell'hardware x86 e ARM moderno), le loro partizioni ESP sono montate in
/boot/efi.
Solitamente è più comodo montare questi file system subito dopo aver fatto il passaggio ad una chroot.
Dopo il passaggio ad una chroot, verificare quali file system sono presenti eseguendo grep /boot /etc/fstab. Quello sottostante è un esempio di output da un sistema con entrambe le voci /boot e /boot/efi:
UUID=7a307683-255a-4bac-937f-95aa2af2ca17 /boot ext4 defaults 0 2 UUID=4D18-6163 /boot/efi vfat umask=0077 0 1
Se le voci /etc/fstab usano UUID, come nell'esempio soprastante, (che è il comportamento predefinito nella maggior parte delle distribuzioni moderne) o PARTLABEL o LABEL univoche, allora tutto ciò che è necessario fare è puntare mount ai loro punti di mount corrispondenti:
mount /boot mount /boot/efi
Su alcuni sistemi più vecchi, invece di UUID o etichette, possono essere usati i nodi di device in /etc/fstab, come ad esempio /dev/sdaX, ecc. In questi casi è necessario capire quale nodo di device corrisponde ad un determinato file system. Nel caso più comune è un'altra partizione sulla stessa unità fisica del file system radice di tale sistema esterno.
Dopo che si è finito di lavorare in chroot, questi file system possono essere smontati o dall'interno della chroot o dopo essere usciti.