Une stratégie qui pourrait fonctionner serait de monter (avec l'option --bind) un dossier commun dans le cache des paquets chroot. Ce cache est situé à /var/cache/apt/archives/
En utilisant cette méthode, toute commande exécutée par apt fonctionnera avec l'archive locale commune.
Exemples
Deux chroot partageant une archive apt commune
sudo mount --bind ~/builds/cache /var/cache/apt/archives
sudo mount --bind ~/builds/cache /var/cache/apt/archives
Cela permettrait à ~/builds/cache et aux deux archives apt du chroot d'opérer dans le même répertoire.
Deux chroot partageant l'archive d'installation locale
sudo mount --bind /var/cache/apt/archives /var/cache/apt/archives
sudo mount --bind /var/cache/apt/archives /var/cache/apt/archives
Similaire au premier, mais maintenant l'installation principale et les deux chroots utiliseront la même archive apt, c'est-à-dire qu'apt dans tous les trois cherchera au même endroit pour les fichiers .deb téléchargés.
(Je pensais que les paquets ne se soucient pas directement de la version d'Ubuntu, seulement des versions des packages associés. Vous pourriez donc ne pas avoir besoin de vous soucier de dossiers distincts pour chaque version, et vous pourriez même potentiellement utiliser l'archive de paquets de l'installation locale.)
Nettoyage
Enfin, et surtout, dans la section sur le nettoyage du chroot en préparation pour la construction finale, vous ne voulez pas exécuter apt clean. Comme apt utilise maintenant le même dossier pour tous les chroots mis en place de cette manière, apt clean va essentiellement effacer l'archive de tous les chroots à la fois. Au lieu de cela, à l'intérieur du chroot, exécutez :
umount /var/cache/apt/archives
Cela va effectivement "nettoyer" l'archive apt du chroot où la commande est exécutée, laissant le dossier commun intact.
Informations manuelles sur les montages bind
Voici une copie directe de la page man mount
. Veuillez y jeter un œil pour une explication complète de mount --bind, et éventuellement voir d'autres façons d'utiliser bind.
Les montages bind.
Depuis Linux 2.4.0, il est possible de remonter une partie de la hiérarchie des fichiers ailleurs. L'appel est le suivant :
mount --bind ancienDossier nouveauDossier
ou en utilisant cette entrée fstab :
/ancienDossier /nouveauDossier aucun bind
Après cet appel, les mêmes contenus sont accessibles en deux endroits. Il est également possible de remonter un seul fichier (sur un seul fichier). Il est également possible d'utiliser le montage bind pour créer un point de montage à partir d'un répertoire régulier, par exemple :
mount --bind foo foo
L'appel de montage bind attache uniquement (une partie) d'un seul système de fichiers, pas de sous-montages possibles. L'intégralité de la hiérarchie des fichiers, y compris les sous-montages, est attachée à un deuxième endroit en utilisant :
mount --rbind ancienDossier nouveauDossier
Notez que les options de montage du système de fichiers resteront les mêmes que celles sur le point de montage d'origine et ne peuvent pas être modifiées en passant l'option -o avec --bind/--rbind. Les options de montage peuvent être modifiées par une commande de remontage séparée, par exemple :
mount --bind ancienDossier nouveauDossier
mount -o remontage,ro nouveauDossier
Notez que le comportement de l'opération de remontage dépend du fichier /etc/mtab. La première commande stocke le drapeau 'bind' dans le fichier /etc/mtab et la deuxième commande lit le drapeau à partir du fichier. Si vous avez un système sans le fichier /etc/mtab ou si vous définissez explicitement la source et la cible pour la commande de remontage (alors mount(8) ne lit pas /etc/mtab), alors vous devez utiliser le drapeau (ou l'option) bind aussi pour la commande de remontage. Par exemple :
mount --bind ancienDossier nouveauDossier
mount -o remontage,ro,bind ancienDossier nouveauDossier
Notez que remontage,ro,bind va créer un point de montage en lecture seule (entrée VFS), mais le superbloc de système de fichiers original restera inscriptible, ce qui signifie que ancienDossier sera inscriptible, mais nouveauDossier sera en lecture seule.