Debian : Configurer un repository local « mirroir » avec apt-mirror
Sommaire
- I. Présentation
- II. Installation du serveur web apache2
- III. Installation d'apt-mirror
- A. Configuration d'apt-mirror
- B. Démarrez la mise en miroir des référentiels distants dans le dossier local
- C. Résoudre le bug 1 : security.debian.org/debian-security/dists/buster/updates/main/i18n/"Translation-en" 404 Not Found
- D. Résoudre le bogue 2 : ftp.fr.debian.org/debian/dists/buster-backports/main/i18n/"Translation-en" 404 Not Found
- E. Planification de la synchronisation automatique des référentiels
- IV. Configuration de Debian 10 pour utiliser un repository local
I. Présentation
Aujourd'hui, nous allons voir comment mettre en place son propre repository local pour Debian, en l'occurrence Debian 10 dans ce tutoriel. Je vous recommande d'être à l'aise avec Linux de manière générale avant de vous lancer dans le tutoriel tête baissée, car ce n'est pas si simple qu'on pourrait le croire.
L'une des raisons pour lesquelles vous pouvez envisager de configurer un serveur de référentiel apt local est de :
- diminuer la consommation de la bande passante requise. Notamment si vous avez une centaine d'instances Debian à mettre à jour à une heure précise le week-end.
- De plus, cela vous permet de disposer aussi dans certains cas d'un parc de serveurs décentralisé et déconnecté d'internet. Certains serveurs n'ont en effet pas le besoin d'atteindre internet à l’exception du processus de mise à jour en fonction de leurs périmètres d'activités.
Toutes les commandes ci-dessous seront exécutées via l'utilisateur root, que se soit sur la machine hébergeant notre repository local ou bien sur la machine cliente.
Prérequis
- Une machine Debian 10 pour héberger notre dépôt local, avec une connexion internet stable.
- 256 Go d'espace disque et 4 Go pour la RAM pour être à l'aise
- Une machine Debian 10 "Client" avec ou sans connexion à internet
- Disposant de la capacité à communiquer avec la machine hébergeant le repository local par le biais de ping/http. Attention, si vous avez un pare-feu sur votre réseau, n'oubliez d'ouvrir ces flux
Précédemment, nous avons vu comment mettre en place un repository local sous Ubuntu.
II. Installation du serveur web apache2
Nous commençons ce didacticiel, par l'installation d'un serveur Web sur la machine hébergeant notre référentiel local. Nous allons utiliser le service apache2 pour héberger les dépôts. Pensez à ajouter "sudo" devant les commandes qui suivent si vous n'utilisez pas le compte root.
apt update && apt upgrade
apt install apache2
Pour rappel, le répertoire racine du service web Apache et du site par défaut se trouve dans le chemin /var/ www/html. Nous allons créer un répertoire "debian" dans ce dossier, et ce dernier contiendra toute l’arborescence de notre futur repository apt.
mkdir -p /var/www/html/debian
www-data, l'utilisateur par défaut d'apache, devra être le propriétaire du dossier "debian" . Effectuez les changements à l'aide de la commande suivante :
chown www-data:www-data /var/www/html/debian
III. Installation d'apt-mirror
L'étape suivante consiste à installer le paquet apt-mirror. Après avoir installé celui-ci, nous obtiendrons la commande apt-mirror, qui nous permettra de cloner (puis par la suite de synchroniser pour les mises à jour) le référentiel distant vers notre référentiel local.
apt install apt-mirror
Une fois qu'apt-mirror a été installé, nous allons passer à sa configuration. Avant de continuer, pour nous prémunir de toutes erreurs, faite une sauvegarde du fichier original de configuration (pour revenir en arrière si vous le souhaitez plus tard).
cp /etc/apt/mirror.list /etc/apt/mirror.list-bak
Modifiez maintenant le fichier à l'aide de l'éditeur de texte de votre choix et mettez à jour base_path
et les référentiels comme indiqué ci-dessous.
A. Configuration d'apt-mirror
nano /etc/apt/mirror.list
############# config ##################
#
set base_path /var/www/html/debian
#
# set mirror_path $base_path/mirror
# set skel_path $base_path/skel
# set var_path $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads 20
set _tilde 0
#
############# end config ##############
deb http://ftp.fr.debian.org/debian/ buster main contrib non-free
deb http://ftp.fr.debian.org/debian/ buster-updates main contrib non-free
deb http://ftp.fr.debian.org/debian/ buster-proposed-updates main contrib non-free
deb http://ftp.fr.debian.org/debian/ buster-backports main contrib non-free
deb http://security.debian.org/debian-security buster/updates main contrib non-free
# deb http://ftp.us.debian.org/debian unstable main contrib non-free
# deb-src http://ftp.us.debian.org/debian unstable main contrib non-free
# mirror additional architectures
#deb-alpha http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-amd64 http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-armel http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-hppa http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-i386 http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-ia64 http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-m68k http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-mips http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-mipsel http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-powerpc http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-s390 http://ftp.us.debian.org/debian unstable main contrib non-free
#deb-sparc http://ftp.us.debian.org/debian unstable main contrib non-free
clean http://ftp.us.debian.org/debian
Ce fichier de configuration sera à adapter, si vous arrivez sur ce tutoriel et que votre version Debian est ultérieure à la version actuelle Buster (10.8) [Mars 2021]
Au cas où vous n'auriez pas remarqué, j'ai utilisé les dépôts de paquets Debian 10 principaux. Les autres resteront commentés, car ils ne sont pas forcément nécessaires dans le cas de ma démonstration.
B. Démarrez la mise en miroir des référentiels distants dans le dossier local
Avant de commencer le clone des paquets distants, il vous faut copier le script de post installation dans le répertoire /var/www/debian/var/
en utilisant les deux commandes ci-dessous.
mkdir -p /var/www/html/debian/var
cp /var/spool/apt-mirror/var/postmirror.sh /var/www/html/debian/var
Il est maintenant temps de commencer à mettre en miroir les packages des référentiels distants vers le dossier local de notre système. Exécutez la commande ci-dessous, mais évitez d'exécuter cette commande depuis un terminal ssh, ou bien augmenter le temps de timeout d'une session ssh, car le processus va prendre des heures :
apt-mirror
Et là, bah vous pouvez aller faire autre chose pendant quelques heures le temps que le téléchargement des paquets se fasse. Me concernant avec une connexion fibrée le téléchargement a pris plus de 12H... En fait, Debian bride le débit de download sur leurs serveurs.
C. Résoudre le bug 1 : security.debian.org/debian-security/dists/buster/updates/main/i18n/"Translation-en" 404 Not Found
Comme pour mon didacticiel pour Ubuntu, j'ai rencontré une erreur, impliquant un bug dans le code d'apt-mirror non résolu depuis belle lurette. Un problème remonté depuis Debian 8.X, de ce que j'ai pu voir sur les différents forums.
Afin de vérifier si vous avez le bug ou non, je vous invite à naviguer vers le chemin suivant :
Si vous n'avez pas le dossier i18n/, qui apparait, et bien cela veut dire que ce bug vous impacte aussi. À l'inverse, bingo, le bug a été colmaté. Le cas échéant, je vous demanderai de me faire signe dans les commentaires afin que je mette à jour l'article.
Pour résoudre celui-là, j'ai créé un petit script maison, qui vous permettra d'éliminer cette erreur :
cd /var/www/html/debian/mirror/security.debian.org/debian-security/dists/buster/updates/
Créez un script nommé fix1.sh :
nano fix1.sh
Ajoutez le code ci-dessous et terminez par exécuter la commande chmod dans votre console pour donner les droits d'exécution sur le fichier.
for dist in main contrib non-free; do
wget http://security.debian.org/debian-security/dists/buster/updates/${dist}/i18n/Translation-en.xz;
mkdir -p /var/www/html/debian/mirror/security.debian.org/debian-security/dists/buster/updates/${dist}/i18n
mv Translation-en.xz /var/www/html/debian/mirror/security.debian.org/debian-security/dists/buster/updates/${dist}/i18n/
done
chmod u+x fix1.sh
D. Résoudre le bogue 2 : ftp.fr.debian.org/debian/dists/buster-backports/main/i18n/"Translation-en" 404 Not Found
Un bug peut en cacher un autre avec apt-mirror... Nous voici face au second bug que vous rencontrerez non pas avec le dépôt security.debian.org/debian-security, mais avec le dépôt ftp.fr.debian.org/debian/dist/buster-backport.
De nouveau, je vous invite à naviguer vers le chemin suivant :
Si vous n'avez pas le dossier i18n/, qui apparait, et bien cela veut dire que ce bug vous impacte aussi. À l'inverse, vous n'êtes pas concerné et c'est tant mieux ! Le cas échéant, je vous demanderai de me faire signe dans les commentaires afin que je mette à jour l'article.
Pour remédier à ce deuxième bug, voici la marche à suivre (sur le même principe que précédemment) :
cd /var/www/html/debian/mirror/ftp.fr.debian.org/debian/dists/buster-backports
nano fix2.sh
Au sein du script fix2.sh, ajoutez le code ci-dessous et terminez par ajouter les droits d'exécution avec chmod.
for dist in main contrib non-free; do
wget http://ftp.fr.debian.org/debian/dists/buster-backports/${dist}/i18n/Translation-en.xz;
mkdir -p /var/www/html/debian/mirror/ftp.fr.debian.org/debian/dists/buster-backports/${dist}/i18n
mv Translation-en.xz /var/www/html/debian/mirror/ftp.fr.debian.org/debian/dists/buster-backports/${dist}/i18n/
done
chmod u+x fix2.sh
E. Planification de la synchronisation automatique des référentiels
Afin de maintenir votre dépôt local à jour, vous pouvez paramétrer sa mise à jour par l'intermédiaire d'une simple tâche cron. En effet, à chaque fois que notre dépôt local se synchronise avec le distant, s'il récupère de nouveaux paquets, ils sont automatiquement téléchargés, ainsi que leurs fichiers d'index.
Pour éditer la crontab :
crontab -e
Suivez scrupuleusement les directives suivantes :
00 01 * * * /usr/bin/apt-mirror >> apt-mirror-report.txt
00 02 * * * /var/www/html/debian/mirror/ftp.fr.debian.org/debian/dists/buster-backports/fix2.sh
01 02 * * * /var/www/html/debian/mirror/security.debian.org/debian-security/dists/buster/updates/fix1.sh
Comme vous pouvez le constater, la sortie de la première commande sera stockée dans le fichier /root/apt-mirror-syncing-execution-report.txt
. Cela vous permettra de suivre s'il y a un problème lors de l’exécution du script sur le long terme. Les deux autres scripts font référence à des scripts qui colmatent les bugs dont je vous parlais ci-dessus. Il devront être exécutés à la suite de la commande apt-mirror.
IV. Configuration de Debian 10 pour utiliser un repository local
Dès lors, nous pouvons tester et vérifier si notre serveur de référentiel apt fonctionne correctement ou non, j'ai un autre système Debian 10 sur lequel je vais mettre à jour le fichier /etc/apt/sources.list afin que la commande apt pointe vers les référentiels locaux au lieu de ceux distants. Alors, connectez-vous au système Debian faisait office de poste client, et modifiez ce qui suit dans la liste sources.list
Mais avant tout, sauvegarder vos sources.list de base avec la commande ci-dessous, au cas où vous souhaitez revenir en arrière et utiliser un dépôt distant plus tard.
cp /etc/apt/sources.list /etc/apt/sources.list.backup
Supprimez le fichier puis recréer le.
rm /etc/apt/sources.list
touch /etc/apt/sources.list
Ouvrez le fichier avec l'éditeur de texte de votre choix.
nano /etc/apt/sources.list
A. Modification des sources.list
Effectuez un copier-coller du code ci-dessous dans le fichier sources.list
, et modifiez l'IP de votre serveur hébergeant votre repository local.
deb [arch=amd64 trusted=yes] http://repository-local-ip/debian/mirror/ftp.fr.debian.org/debian/ buster main contrib non-free
deb [arch=amd64 trusted=yes] http://repository-local-ip/debian/mirror/ftp.fr.debian.org/debian/ buster-updates main contrib non-free
deb [arch=amd64 trusted=yes] http://repository-local-ip/debian/mirror/ftp.fr.debian.org/debian/ buster-proposed-updates main contrib non-free
deb [arch=amd64 trusted=yes] http://repository-local-ip/debian/mirror/security.debian.org/debian-security buster/updates main contrib non-free
deb [arch=amd64 trusted=yes] http://repository-local-ip/debian/mirror/ftp.fr.debian.org/debian/ buster-backports main contrib non-free
B. Tests - C'est l'heure de vérité !
Exécutez maintenant la commande « apt update » pour vérifier que la machine cliente reçoit la mise à jour de notre serveur de référentiel apt local
apt update
Parfait, la sortie ci-dessus confirme que la machine cliente est capable de se connecter avec succès à notre référentiel local pour récupérer les packages et les mises à jour.
Vous aurez des mises à jour à appliquer en fonction de si vous avez exécuté apt update && apt upgrade sur votre machine récemment ou non.
Vous pouvez aussi tester votre repository local en installant un service quelconque. Dans mon cas, le service squid proxy.
C. Postface
C'est tout pour cette fois-ci, j'espère que vous êtes arrivé au bout de ce tutoriel sans trop de mal. J'ai essayé d'être le plus clair possible dans mes explications, mais si vous rencontrez quand même des erreurs, lors d'apt update && apt upgrade
, n'hésitez pas à rechercher votre erreur sur le net, en stipulant dans la requête que vous utilisez un repository local. C'est en partie comme ça que j'ai affiné le tutoriel, pour qu'il soit le plus clair possible.
Bonjour,
Pour le bug d’apt-mirror on peut modifier /usr/bin/apt-mirror ligne 523:
if ( $filename =~ m{^$component/i18n/Translation-[^./]*\.bz2$} )
en
if ( $filename =~ m{^$component/i18n/Translation-[^./]*\.(bz2|xz|gz)$} )
ca corrige le problème pour toutes les distributions.
La correction de la ligne 523 a corriger le problème du i18n merci
Bonjour,
Est-il possible de créer un dépôt pour Debian et Ubuntu sur le même serveur (pour éviter de créer un serveur de dépôt pour chaque distribution ) ?
Par exemple spécifier dans mirror.list que les paquets Debian vont dans /var/www/html/debian et les paquets Ubuntu dans /var/www/html/ubuntu ?
Merci par avance.
Bonjour,
Oui cela est possible, il faut simplement prévoir un disque avec une grande capacité de stockage.
Et changer les chemins URI comme tu l’as dis très justement.