Chrooter un système complet

Voici une feature bien pratique qui consiste à se construire un système complet dans un dossier chrooté. On peut y trouver divers intérêts à faire ceci.

Gérer :

  • une autre base de compte système
  • une autre base de ports / packages FreeBSD
  • un autre environnement de compilation de source (kernel et userland)

Toute la procédure à suivre doit être adaptée selon votre environnement.

Quelques prérequis :

  • sudo, chroot, sh, su doivent être présents sur le systéme
  • Se connecter en root

1) Se définir le chemin d'accès du système chrooté.

# mkdir -p /bigdata/chroot  

2) Créer un système complet dans le chemin choisi :

Copie de la partition /

# cd /bigdata/chroot  
# dump -0af - / | restore rf -  

Copie de la partition /usr

# cd /bigdata/chroot/usr  
# dump -0af - /usr | restore rf -  

Copie de la partition /var

# cd /bigdata/chroot/var  
# dump -0af - /var | restore rf -</code>  

Compter tout de même de nombreuses minutes ou heures, selon l'espace occupée par vos partitions.

3) Créer les nodes nécessaires à l'environnement chrooté dans /dev

Voici un petit script (chroot_devfs.sh) bien pratique si vous utilisé devfs

#!/bin/sh  

# Change this, if needed  
CHROOT=/bigdata/chroot  

case $1 in  
start)  
  # umount/mount devfs on chroot filesystem  
  umount ${CHROOT}/dev 2> /dev/null  
  mount_devfs devfs ${CHROOT}/dev  
  # Hide all nodes, by default  
  devfs -m ${CHROOT}/dev rule apply hide  

  # Unhide some nodes  
  devfs -m ${CHROOT}/dev rule apply path fd unhide  
  devfs -m ${CHROOT}/dev rule apply path fd/0 unhide  
  devfs -m ${CHROOT}/dev rule apply path fd/1 unhide  
  devfs -m ${CHROOT}/dev rule apply path fd/2 unhide  
  devfs -m ${CHROOT}/dev rule apply path stdin unhide  
  devfs -m ${CHROOT}/dev rule apply path stdout unhide  
  devfs -m ${CHROOT}/dev rule apply path stderr unhide  
  devfs -m ${CHROOT}/dev rule apply path null unhide  
  devfs -m ${CHROOT}/dev rule apply path random unhide  
  devfs -m ${CHROOT}/dev rule apply path urandom unhide  
  devfs -m ${CHROOT}/dev rule apply path zero unhide  
  # Add other nodes, if needed ...  

  echo "devfs at ${CHROOT}/dev mounted"  
  ;;  
stop)  
  # umount devfs  
  umount ${CHROOT}/dev 2> /dev/null  
  if [ $? -eq 0 ]; then  
  # remove any files  
    rm -f ${CHROOT}/dev/*  
  fi  

  echo "devfs at ${CHROOT}/dev unmounted"  
  ;;  
*)  
  echo "usage : `basename $0` (start|stop)"  
  ;;  
esac  

Si vous souhaitez que ce script se lance au boot, il suffit de le poser dans /usr/local/etc/rc.d
Lancer donc ce script :

# /usr/local/etc/rc.d/chroot_devfs.sh start  

Voilà, les nodes nécessaires seront disponibles dans /bigdata/chroot/dev, soit /dev dans l'environnement chrooté.

4) Préparer un script de login pour les futurs comptes système à "chrooter"

#!/bin/sh  
[ "$1" = "-c" ] && a="$*"  
sudo /usr/sbin/chroot /bigdata/chroot /usr/bin/su - $USER $a  

Poser ce script dans /usr/local/bin/chrootsh, par exemple, de votre système d'origine et render le exécutable.
Bien entendu, adapter ce script en fonction des chemins où sont localisé chroot, su et de votre futur système chrooté

5) Créer un compte système à "chrooter" au login

Nous allons créer le compte polom, par exemple

# pw useradd polom -d /home/polom -m -s /usr/local/bin/chrootsh -c "Polom Chrooté"  
# passwd polom  
<saisir son mot de passe>  

Ajouter une entrée dans le fichier sudoers (/usr/local/etc/sudoers) avec les lignes suivantes :

Defaults:polom          !syslog  
polom   ALL = NOPASSWD: /usr/sbin/chroot /bigdata/chroot /usr/bin/su - polom*  

Il est impératif que tout compte à chrooter doit exister dans votre système d'origine et dans le système chrooté.
Dans le principe, une personne se connecte avec le compte polom.
Son shell de login /usr/local/bin/chrootsh sera donc exécuté.
sudo sera lancé pour effectuer le chroot (car seul root peut chrooter).
Puis un su (en root) sera effectué pour se "remettre" en polom.
Le shell de login du compte polom dans l'environnement chrooté sera ensuite exécuté.

On va donc copier ce compte dans l'environnement chrooté, puis changer son shell de login.
Récupérer la dernière ligne du fichier /etc/master.passwd
pour la copier dans /bigdata/chroot/etc/master.passwd

# tail -1 /etc/master.passwd  
polom:$1$VPJuwGKU$9ab6pK5y4DJVWP5vj0H3n1:1011:0::0:0:Polom Chrooted:/home/polom:/usr/local/bin/chrootsh  

# tail -1 /etc/master.passwd >> /bigdata/chroot/etc/master.passwd  

Ouvrir /bigdata/chroot/etc/master.passwd et modifier le shell de login du compte polom, dans le système chrooté.
Modifier son shell /usr/local/bin/chrootsh
par celui que vous voulez, par exemple /bin/sh

Enfin, mettre à jour le fichier /bigdata/chroot/etc/pwd.db

# pwd_mkdb -d /bigdata/chroot/etc /bigdata/chroot/etc/master.passwd  

Ne pas oublier de créer son dossier home

# mkdir /bigdata/chroot/home/polom  
# chown polom /bigdata/chroot/home/polom  
# chmod 700 /bigdata/chroot/home/polom  

Il ne vous reste plus qu'à vous connecter avec ce nouveau compte, et vous apercevoir que vous êtes bien dans le système chrooté.

Source BSDMon

Ajouter un commentaire

  • Votre courriel ne sera jamais publié