Recherche de site Web

Comment automatiser le montage de /dev dans les environnements chroot sous Linux


Si vous utilisez mmdebstrap pour créer des systèmes minimalistes basés sur Debian, vous pourriez trouver agaçant de monter et démonter manuellement le répertoire /dev à chaque fois que vous utilisez le chroot. La bonne nouvelle est qu'il existe des moyens d'automatiser ce processus ! Dans ce guide, nous vous montrerons comment rendre votre flux de travail plus efficace en montant automatiquement le /dev lorsque vous entrez dans l'environnement chroot et en le démontant lorsque vous en sortez.

Pourquoi automatiser le montage de /dev ?

Lorsque vous créez un environnement chroot, il n’a pas accès au répertoire /dev du système hôte par défaut. Cela peut provoquer des erreurs lors de l’exécution de commandes comme apt update car les programmes ont besoin d’accéder à des fichiers de périphérique comme /dev/null.

[...]
/usr/bin/apt-key: 95: cannot create /dev/null: Permission denied
/usr/bin/apt-key: 95: cannot create /dev/null: Permission denied
E: gpgv, gpgv2 or gpgv1 required for verification, but neither seems installed
Err:3 http://deb.debian.org/debian bookworm-updates InRelease
  gpgv, gpgv2 or gpgv1 required for verification, but neither seems installed
[...]

Vous pouvez résoudre ce problème en montant manuellement /dev ([[Dépannage de mmdebstrap]]) chaque fois que vous utilisez le chroot. Mais c'est fastidieux et prend du temps. Automatiser ce processus vous fait gagner des efforts et rend votre flux de travail plus fluide.

Solution 1 : Utiliser systemd-nspawn pour automatiser le montage de /dev dans un chroot

systemd-nspawn est un outil en ligne de commande inclus dans la suite systemd qui vous permet de créer et d'exécuter des conteneurs système légers et isolés sur les systèmes Linux. Il offre un moyen d'exécuter des commandes ou même des systèmes d'exploitation entiers dans un environnement sécurisé.

L'outil systemd-nspawn peut automatiquement gérer le montage de /dev et d'autres répertoires.

Étape 1 : Installer systemd-nspawn

Sur les systèmes basés sur Debian, installez-le avec :

sudo apt update
sudo apt install systemd-container

Étape 2 : Entrez dans le chroot avec systemd-nspawn

Créer un environnement chroot en utilisant mmdebstrap :

mmdebstrap --variant=minbase stable /tmp/debian-rootfs

Ensuite, entrez dans le chroot en utilisant la commande :

sudo systemd-nspawn -D /tmp/debian-rootfs

systemd-nspawn monte automatiquement /dev, /proc et /sys à l'intérieur du chroot. Lorsque vous quittez le chroot, il démonte automatiquement ces répertoires.

Solution 2 : Utiliser le script Chrootmnt pour monter et démonter automatiquement /dev dans des environnements Chroot

Chrootmnt est un script Bash pour monter et démonter /dev à l'intérieur d'un environnement chroot, garantissant un accès fluide aux périphériques et un nettoyage automatique pour une gestion sécurisée du système Linux.

Caractéristiques principales

  1. Entrées flexibles : Fonctionne avec n'importe quel répertoire chroot et commande.
  2. Gestion des erreurs : Empêche les échecs causés par des répertoires manquants ou des arguments incorrects.
  3. Nettoyage automatique : Évite de laisser des ressources montées en cas d'interruption.
  4. Support des pseudo-terminaux : Garantit la compatibilité avec des outils interactifs tels que SSH, screen et tmux.

Le script Chrootmnt est disponible sur notre page OSTechNix GitHub Gist. Vous pouvez le télécharger et le modifier librement comme vous le souhaitez.

Étape 1 : Créez le script

Enregistrez le script suivant sous chrootmnt.sh :

#!/usr/bin/env bash

# ------------------------------------------------------------------
# Script Name:   chrootmnt.sh
# Description:   A Bash script to mount and unmount /dev 
#                inside a chroot environment
# Website:       https://gist.github.com/ostechnix
# Version:       1.0
# Usage:         ./chrootmnt.sh /path/to/chroot command args
# ------------------------------------------------------------------

# Validate input
if [ $# -lt 2 ]; then
  echo "Usage: $0 /path/to/chroot command [args...]"
  exit 1
fi

# Path to the chroot directory
CHROOT_DIR="$1"
shift  # Remove the first argument (chroot path)

# Ensure the chroot directory exists
if [ ! -d "$CHROOT_DIR" ]; then
  echo "Error: Chroot directory $CHROOT_DIR does not exist."
  exit 1
fi

# Mount /dev and /dev/pts
sudo mount --bind /dev "$CHROOT_DIR/dev"
sudo mount --bind /dev/pts "$CHROOT_DIR/dev/pts"

# Handle unmounting on exit
cleanup() {
  sudo umount "$CHROOT_DIR/dev/pts"
  sudo umount "$CHROOT_DIR/dev"
}
trap cleanup EXIT

# Enter the chroot
sudo chroot "$CHROOT_DIR" "$@"

Voici une explication étape par étape de la façon dont le script fonctionne :

1. Validation des entrées

if [ $# -lt 2 ]; then
  echo "Usage: $0 /path/to/chroot command [args...]"
  exit 1
fi
  • Assure que l'utilisateur fournit au moins deux arguments :

    1. Le chemin vers le répertoire chroot.
    2. Une commande (par exemple, /bin/bash) à exécuter dans le chroot.
  • Si des arguments sont manquants, il affiche les instructions d'utilisation et se termine.

2. Conserver les arguments

CHROOT_DIR="$1"
shift  # Remove the first argument (chroot path)
  • Stocke le chemin du répertoire chroot dans CHROOT_DIR.
  • Utilise shift pour supprimer cet argument, ne laissant que la commande et ses arguments facultatifs.

    • Exemple : Si l'entrée est : ./chrootmnt.sh /tmp/debian-rootfs /bin/bash

      • CHROOT_DIR=/tmp/debian-rootfs
      • Les arguments restants (/bin/bash) sont transmis à chroot.

3. Vérification du répertoire

if [ ! -d "$CHROOT_DIR" ]; then
  echo "Error: Chroot directory $CHROOT_DIR does not exist."
  exit 1
fi
  • Confirme que le répertoire chroot spécifié existe.
  • Si le répertoire est manquant, il affiche une erreur et se termine.

4. Monter /dev et /dev/pts

sudo mount --bind /dev "$CHROOT_DIR/dev"
sudo mount --bind /dev/pts "$CHROOT_DIR/dev/pts"
  • Lie les /dev et /dev/pts de l'hôte à l'intérieur du chroot.

    • /dev : Fournit des fichiers de périphériques (par exemple, /dev/null, /dev/tty).
    • /dev/pts : Prend en charge les pseudo-terminaux (utilisés par des programmes comme SSH et screen).
  • Garantit que les programmes à l'intérieur du chroot peuvent accéder correctement aux périphériques et aux terminaux.

5. Fonction de nettoyage

cleanup() {
  sudo umount "$CHROOT_DIR/dev/pts"
  sudo umount "$CHROOT_DIR/dev"
}
trap cleanup EXIT
  • Définit une fonction (cleanup) qui démonte /dev et /dev/pts.
  • Enregistre cette fonction pour s'exécuter automatiquement à la sortie du script (réussite ou erreur).

    • Empêche de laisser des montages périmés si quelque chose tourne mal.

6. Entrez dans le Chroot

sudo chroot "$CHROOT_DIR" "$@"
  • Utilise la commande chroot pour passer au répertoire racine spécifié (CHROOT_DIR).
  • Exécute la commande fournie en tant qu'arguments supplémentaires ($@).

    • Exemple : ./chrootmnt.sh /tmp/debian-rootfs /bin/bash

      • Exécute /bin/bash à l'intérieur du chroot.

7. Nettoyage automatique

  • Lorsque la session chroot se termine (soit normalement, soit en raison d'une erreur), le script :

    1. Démonte /dev/pts.
    2. Démonte /dev.

Étape 2 : Rendre le script exécutable

Exécutez la commande suivante pour rendre le script exécutable :

chmod +x chrootmnt.sh

Étape 3 : Utilisez le script

Tout d'abord, assurez-vous d'avoir créé l'environnement chroot :

mmdebstrap --variant=minbase stable /tmp/debian-rootfs

Maintenant, au lieu d'utiliser sudo chroot /tmp/debian-rootfs, utilisez le script pour entrer dans le chroot :

Démarrer un shell à l'intérieur de /tmp/debian-rootfs :

./chrootmnt.sh /tmp/debian-rootfs /bin/bash

Exécutez une commande (par exemple, ls -l /) à l'intérieur du chroot :

./chrootmnt.sh /tmp/debian-rootfs ls -l /

Assurez-vous simplement d'avoir saisi le chemin correct de votre environnement chroot. Dans ce cas, le répertoire chroot est /tmp/debian-tootfs. Remplacez-le par le vôtre.

Quelle solution devriez-vous utiliser ?

  • systemd-nspawn : Idéal pour les utilisateurs avancés qui veulent une expérience similaire à celle d'un conteneur.
  • Script Chrootmnt : Idéal pour la simplicité et l'automatisation.

Conclusion

Monter et démonter manuellement /dev à chaque fois que vous utilisez le chroot n'est pas productif. En utilisant systemd-nspawn ou un script wrapper, vous pouvez automatiser ce processus et gagner du temps. Choisissez la méthode qui correspond le mieux à votre flux de travail et profitez d'une expérience plus fluide avec mmdebstrap !