22/11/2024

Commandes et SystèmeLinux

Debian : Configurer un repository local « mirroir » avec apt-mirror

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
Le fichier de configuration /etc/apt/mirror.list doit ressembler à cela

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
Résultat de l'exécution du script.

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.

author avatar
Geoffrey Sauvageot-Berland Ingénieur Cybersécurité
Ingénieur diplômé par l’état en Informatique et Cybersécurité. Généraliste, à l'origine administrateur systèmes et réseaux, j’occupe actuellement un poste d’auditeur en sécurité offensive. J’apprécie également la programmation/automatisation. Fondateur du blog : "Le Guide du SecOps", anciennement "Le Guide du SysOps"
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

4 commentaires sur “Debian : Configurer un repository local « mirroir » avec apt-mirror

  • 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.

    Répondre
  • La correction de la ligne 523 a corriger le problème du i18n merci

    Répondre
  • 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.

    Répondre
  • 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.

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.