1 votes

Comment puis-je créer un dépôt local accessible à partir d'un environnement chroot local pour la construction d'un système d'exploitation?

Je suis intéressé par la création de ma propre version personnalisée d'Ubuntu, et j'ai travaillé avec l'ISO d'Ubuntu Mini Remix pour le faire.

Pour ce faire, je monte l'image disque et chroot dedans, de manière similaire à ce guide.

Ma hiérarchie de répertoires pour mes compilations est la suivante:

home
  |
  \builds
     |
     +build(n)
     |  |
     |  +mnt
     |  +extract-cd
     |  +edit
     |  \&
     |
     +build(n+1)
     |  |
     |  \&
     |
     \sources (divers fichiers deb/ISOs)

Chaque compilation a $HOME défini sur ./edit/root, donc tout ce qui est plus haut dans la hiérarchie (./mnt, ./extract-cd, etc.) est inaccessible à l'environnement chroot.

Y a-t-il un moyen pour que les paquets téléchargés par apt du chroot soient mis en miroir dans un répertoire, par exemple, ~/builds/cache (ou, encore mieux, le répertoire ~/builds/cache/[version-ubuntu]), qui pourrait ensuite être utilisé comme un dépôt pour d'autres compilations?

Une telle configuration me permettrait d'économiser beaucoup de bande passante, puisque seuls les paquets qui n'ont pas encore été téléchargés/miroités dans le dépôt devraient être récupérés sur le web.

Quoi qu'il en soit, merci d'avance pour toutes les suggestions et l'aide.

1voto

user7134 Points 459

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.

1voto

BostonHiker Points 627

Je n'ai jamais utilisé l'ISO Ubuntu Mini Remix, mais il existe quelques façons que j'ai utilisées pour accomplir cela lors de l'exécution des constructions vmbuilder :

  1. Installez apt-cacher-ng sur votre système (ou un serveur sur votre réseau local) et utilisez-le comme proxy pour vos constructions. Cela crée un cache local des packages utilisés pendant la construction. Ainsi, après la première construction, vous utiliserez le cache pour tout package qui a été utilisé précédemment et n'a pas une version plus récente en amont. Cela nécessite toujours une connexion réseau, car il communique avec les dépôts en amont pour obtenir des versions plus récentes ou des packages que vous n'avez pas encore utilisés. Le deuxième avantage est qu'il met en cache uniquement les fichiers nécessaires, ce qui est beaucoup moins qu'un miroir complet.

EDIT : apt-cahcer-ng n'a pas besoin d'être configuré de quelque manière que ce soit - installez-le simplement en utilisant sudo apt-get install apt-cacher-ng. Il existe quelques options de configuration avancées que je n'ai jamais nécessitées. Vous pouvez trouver des instructions sur la manière de configurer vos clients (constructions) pour utiliser le cache ici.

  1. Vous pouvez utiliser debmirror ou apt-mirror pour créer un miroir complet. Mais soyez conscient que cela prend généralement quelques centaines de gigaoctets d'espace disque, en fonction des dépôts que vous avez choisis de miroir (principal, restreint, univers, multivers) et ainsi de suite. De plus, cela prend généralement beaucoup plus de temps à mettre en miroir (des centaines de gigaoctets). De plus, vous devez avoir une tâche cron pour le mettre à jour ou le mettre à jour manuellement lorsque vous en avez besoin. Le manque de mise à jour automatique peut être considéré à la fois comme un avantage (j'ai vu des cas où de mauvais packages ont été publiés en amont et ont pris quelques jours pour les remplacer par de bons) ou comme un inconvénient (vous n'avez pas les derniers correctifs de sécurité).

0voto

Alex Points 11

J'ai fini par utiliser la réponse de l'utilisateur 7134, ainsi que certaines informations provenant ici.

Étant donné que sa réponse ne répondait pas pleinement à ce que j'avais en tête, je rédige ma propre réponse. Néanmoins, je lui attribue la récompense, car cela m'a orienté dans la bonne direction.

La solution consiste à ceci : après s'être déplacé dans le répertoire build(n), avant de chrooter dans la construction, exécutez

sudo mount --bind /home/[nomdutilisateur]/builds/cache edit/var/cache/apt/archives

Cela met en cache efficacement les paquets téléchargés par la construction chrootée.

Poursuivez la construction normalement. Il n'est pas nécessaire, pour l'instant, de créer notre dépôt, car il n'y aurait rien dedans.

Une fois la construction terminée, lors du démontage et du nettoyage du chroot, tapez

umount /var/cache/apt/archives

Nous pouvons ensuite créer le dépôt à utiliser dans les futures constructions.

Pour ce faire, créez le fichier repobuild.sh, qui ressemblera à ceci:

#! /bin/bash
cd /home/[nomdutilisateur]/builds/cache
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

Rendez notre script exécutable en exécutant chmod u+x /home/[nomdutilisateur]/repobuild.sh et exécutez le script: /home/[nomdutilisateur]/repobuild.sh

Préparez-vous à chrooter dans la nouvelle construction, en vous assurant de monter /home/[nomdutilisateur]/builds/cache dans edit/var/cache/apt/archives comme indiqué ci-dessus.

Chroot dans edit et ajoutez ensuite

deb file:/var/cache/apt/archives ./

à /etc/apt/sources.list

Exécutez apt-get update, et c'est fait. Maintenant vous pouvez utiliser les paquets en cache en tapant apt-get install [nomdupaquet], comme vous le feriez normalement.

N'oubliez pas qu'à chaque fois qu'un paquet est ajouté au répertoire cache, repobuild.sh devra être ré-exécuté si vous souhaitez utiliser le paquet mis en cache.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X