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-rootfsEnsuite, entrez dans le chroot en utilisant la commande :
sudo systemd-nspawn -D /tmp/debian-rootfssystemd-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
- Entrées flexibles : Fonctionne avec n'importe quel répertoire chroot et commande.
- Gestion des erreurs : Empêche les échecs causés par des répertoires manquants ou des arguments incorrects.
- Nettoyage automatique : Évite de laisser des ressources montées en cas d'interruption.
- 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
fiAssure que l'utilisateur fournit au moins deux arguments :
- Le chemin vers le répertoire chroot.
- 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
shiftpour supprimer cet argument, ne laissant que la commande et ses arguments facultatifs.Exemple : Si l'entrée est :
./chrootmnt.sh /tmp/debian-rootfs /bin/bashCHROOT_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
/devet/dev/ptsde 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).
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/devet/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
chrootpour 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.
- Exécute
7. Nettoyage automatique
Lorsque la session
chrootse termine (soit normalement, soit en raison d'une erreur), le script :- Démonte
/dev/pts.
- Démonte
- 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-rootfsMaintenant, 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/bashExé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 !