chroot, nei sistemi operativi simili a Unix, indica un'operazione che consiste nel cambiare la directory di riferimento dei processi che sono in esecuzione corrente e per i processi generati da questi ultimi.
Contents
Installazione
Creare una "chroot" in Debian è molto semplice.
Ciò che serve è:
- installare i pacchetti necessari
# apt install debootstrap
- scegliere una posizione
# mkdir -p /srv/chroot/debian
- creare la chroot
Selezionare manualmente un mirror di rete vicino, usare uno dei mirror basati su DNS come ftp.XX.debian.org dove XX è il codice geografico del proprio paese, oppure usare il CDN deb.debian.org che farà tutto automaticamente per l'utente. Il metodo con deb.debian.org è più facile da documentare e sta diventando il metodo generalmente preferito ed è perciò raccomandato se non si ha un proprio mirror locale veloce preferito. Vedere http://deb.debian.org/ per la documentazione e i dettagli.
# debootstrap bullseye /srv/chroot/debian http://deb.debian.org/debian
- Per entrare:
# chroot /srv/chroot/debian
A questo punto la chroot è utile per compiti come compilare pacchetti Debian in un ambiente isolato. Per un ambiente Debian più avanzato all'interno della chroot, vedere in seguito.
Un modo più comodo di entrare nella chroot è fornito dal pacchetto schroot. Questo wrapper permette agli utenti non privilegiati di avere accesso a uno o più ambienti chroot. schroot gestisce la chiamata chroot(2) oltre all'abbandono dei privilegi all'interno della chroot, l'impostazione di "/etc/resolv.conf" e il montaggio con bind delle risorse nella chroot (come le directory home, "/dev", "/sys", "/proc").
Configurazione
In genere è necessario creare o modificare punti chiave delle configurazioni.
Creare un file /usr/sbin/policy-rc.d NELLA CHROOT, in modo che dpkg non avvii demoni a meno che non sia voluto. Questo esempio previene impedisce l'avvio nella chroot di tutti i demoni.
chroot /srv/chroot/debian cat > ./usr/sbin/policy-rc.d <<EOF #!/bin/sh exit 101 EOF chmod a+x ./usr/sbin/policy-rc.d
Il comando ischroot è difettoso e non rileva il fatto di essere in esecuzione in una chroot (685034). Svariati pacchetti dipendono da ischroot per determinare il comportamento corretto in una chroot e funzioneranno in modo non corretto durante gli aggiornamenti se il problema non viene risolto. Il modo più semplice per farlo è di sostituire ischroot con il comando /bin/true.
dpkg-divert --divert /usr/bin/ischroot.debianutils --rename /usr/bin/ischroot ln -s /bin/true /usr/bin/ischroot
Configurare un chroot è relativamente statico e molto specifico, è possibile fare a meno dei comandi di alto livello e modificare direttamente i file.
- utenti nel chroot:
/etc/passwd /etc/group
- impostazioni di rete nella chroot:
/etc/hosts /etc/resolv.conf
- montaggio dei file system dell'host sottostante (NON nella chroot):
/etc/fstab
- Per modificare il prompt di bash aggiungere un identificatore a /etc/debian_chroot. I suoi contenuti vengono aggiunti a $PS1
Montare pseudo filesystem
/proc
- Se il sistema non è interamente funzionante controllare la presenza di /proc nel sistema chroot. A priori, dalla versione di debootstrap in Debian/Wheezy è integrato il montaggio di /proc e /sys nativamente.
proc on /proc type proc (rw) sysfs on /sys sysfs kind (rw)
/dev/pts
È inoltre consigliato di fare un "bind" a /dev/pts. Questo previene messaggi di errore come Devo essere collegato ad un terminale o Impossibile accedere a '/dev/pts/0': File o directory non esistente durante l'uso di screen.
In tal caso, dal sistema principale, eseguire il comando:
mount --bind /dev/pts /srv/chroot/stretch/dev/pts
Configurazioni predefinite
Generalmente il file /etc/fstab apparirà come segue:
# grep chroot /etc/fstab /dev /srv/chroot/stretch/dev auto bind 0 0 /dev/pts /srv/chroot/stretch/dev/pts auto bind 0 0 /proc /srv/chroot/stretch/proc auto bind 0
Perciò "mount" dal sistema principale sarà:
# mount | grep chroot /dev on /srv/chroot/stretch/dev -type none (rw, bind) /dev/pts on /srv/chroot/stretch/dev/pts kind none (rw, bind) /proc on /srv/chroot/stretch/proc type none (rw, bind)
Aggiungere e rimuovere pacchetti
- Eliminare pacchetti non necessari (dipende dallo scopo del chroot):
apt-get install deborphan
deborphan -a
- e, ad esempio:
apt-get remove --purge telnet manpages pppconfig ipchains ...
Complementary list svgalibg1 whiptail
- aggiungere qualche comodità:
apt-get install emacs23 local mc
Uso
Esempi comuni di utilizzo di un chroot:
ricompilazione di applicazioni in un contesto differente dalla macchina che ospita il chroot (backport, cross-compilazione, ...)
- aggiornamento servizi di produzione orientando il vecchio (macchina ospitante) al nuovo (installato nel chroot)
- protezione di un servizio "chrootato" dalla macchina ospitante e viceversa
Copia e incolla
Quanto detto sopra pronto per fare copia e incolla.
Prima la parte dove si impostano le variabili di shell.
export MCHRMIRROR=http://deb.debian.org/debian export MCHRARCH=i386 export MCHRREL=buster export MCHRDIR=/srv/chroot/${MCHRREL}-${MCHRARCH} echo My chroot dir is ${MCHRDIR}
Poi il resto del materiale di cui fare copia-e-incolla, preferibilmente con attenzione.
mkdir -p ${MCHRDIR} # passo successivo, richiede molto tempo debootstrap --variant=buildd --arch=${MCHRARCH} ${MCHRREL} ${MCHRDIR} ${MCHRMIRROR} # previene l'avvio di demoni da parte di dpkg nell'ambiente chroot cat > ${MCHRDIR}/usr/sbin/policy-rc.d <<EOF #!/bin/sh exit 101 EOF chmod a+x ${MCHRDIR}/usr/sbin/policy-rc.d # nella chroot "codificare in modo fisso" ischroot a VERO cp ${MCHRDIR}/bin/true ${MCHRDIR}/usr/bin/ischroot # cp /etc/hosts ${MCHRDIR}/etc/hosts cp /etc/resolv.conf ${MCHRDIR}/etc/resolv.conf # quello sopra va fatto una sola volta # montare, da fare piu' spesso mount --bind /dev ${MCHRDIR}/dev mount --bind /dev/pts ${MCHRDIR}/dev/pts mount --bind /proc ${MCHRDIR}/proc # può anche essere necessario (es. nella modalità ripristino dell'Installatore Debian) mount --bind /sys ${MCHRDIR}/sys mount --bind /run ${MCHRDIR}/run # Okay
# Entrare nella chroot, uscirne con exit
chroot ${MCHRDIR} # godersi il proprio nuovo ambiente # installare con apt quello di cui si ha bisogno # fare quello che si vuole
Smontare
[ ! -z ${MCHRDIR} ] && echo my chroot dir is ${MCHRDIR} [ ! -z ${MCHRDIR} ] && umount ${MCHRDIR}/proc [ ! -z ${MCHRDIR} ] && umount ${MCHRDIR}/dev/pts [ ! -z ${MCHRDIR} ] && umount ${MCHRDIR}/dev # se sono state montate prima [ ! -z ${MCHRDIR} ] && umount ${MCHRDIR}/sys [ ! -z ${MCHRDIR} ] && umount ${MCHRDIR}/run