Jump to content

Do not begin to migrate content here, it may be wiped without notice. More info.

Chroot/it

From Debian wiki2025 alpha
Revision as of 16:29, 28 September 2026 by Mok0 (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)


⚠️ This is a launch status check of the wiki migration, you can edit this entry to test things, but it might be deleted at any time, so save it if you want to keep your edits.


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

L'utilità 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 chroot era 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:

  • /boot stesso è 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.


Category:System | Category:Virtualization