9 août 2022

Monter son miroir Debian avec Apt-Mirror

En présence d’un parc de machines Linux, il peut être utile d’avoir un miroir Debian sur un serveur afin de rendre plus rapide n’importe quelle installation de Debian et de nouveaux paquets par la suite.
L’on profitera alors idéalement d’un bon réseau gigabit pour rendre les apt-get update, upgrade et install d’une célérité fortement appréciable.
 

I – Présentation

L’outil utilisé ici est un script python du nom d’Apt-Mirror. Simple d’utilisation, sa seule contrainte : avant de tester, va falloir patienter un peu (une bonne soixantaine de Go par ex pour Debian Wheezy, et sans les sources).
On le couple à Apache2 pour desservir les fichiers et « roule ma poule », à vous les « Install Party ».
 

II – Installation et configuration

Allez, vous connaissez la procédure :

# apt-get update && apt-get upgrade
# apt-get install apt-mirror apache2

Par défaut, apt-mirror stocke les dépôts dans /var/spool/. Perso, je préfère avoir ça sur un autre disque que j’ai monté dans /stock.
De plus, je souhaite avoir différents sous répertoires car je ne ferais pas que miroir Debian (mais aussi Raspberry)
Donc :

# rm /var/spool/apt-mirror/ -r
# cd /stock
# mkdir apt-mirror/debian
# cd apt-mirror/debian
# mkdir var
# mkdir skel
# mkdir mirror
# cd var/
# touch clean.sh
# touch postmirror.sh
# cd /stock
# chown apt-mirror:apt-mirror apt-mirror/ -R

Et voila !
La configuration de ce script passe par le fichier /etc/apt/mirror.list.
On va sauvegarder celui par défaut au cas ou :

#cp /etc/apt/mirror.list /etc/apt/mirror.list.back

Et pour l’exemple, voila le mien :

set base_path    /stock/apt-mirror/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 1
set nthreads     30
set _tilde 0
deb http://ftp.fr.debian.org/debian/ wheezy main contrib non-free
deb http://ftp.fr.debian.org/debian/ wheezy-updates main contrib non-free
deb http://ftp.fr.debian.org/debian/ wheezy-proposed-updates main contrib non-f$
deb http://ftp.fr.debian.org/debian/ wheezy-backports main contrib non-free
deb http://security.debian.org wheezy/updates main contrib non-free
clean http://ftp.fr.debian.org/debian
clean http://security.debian.org/

Très simplement :

  • on définit l’endroit ou sont stockés des données.
  • clean.sh est crée automatiquement par les commandes clean à la fin du fichier.
  • postmirror.sh est un script appelé après la mise à jour et dans lequel on appellera justement clean.sh
  • ensuite, on donne les dépôts à répliquer
  • puis les commandes clean afin de purger les paquets obsolètes.

Optionnellement, l’option set limit_rate permet de limiter le débit :

set limit_rate 500k

par exemple, limitera le débit à 500ko/s.

III – Postmirror.sh et clean.sh

On va éditer le fichier postmirror.sh

# cd /stock/apt-mirror/debian/var
# nano postmirror.sh

Et ajouter ceci :

/stock/apt-mirror/debian/var/clean.sh

Puis :

# chmod u+x clean.sh
# chmod u+x postmirror.sh

 

IV – Création des liens symboliques

Il faut rendre ça accessible depuis apache afin que les clients puissent y accéder.

# ln -s /stock/apt-mirror/debian/mirror/ftp.fr.debian.org/debian/ /var/www/debian
# ln -s /stock/apt-mirror/debian/mirror/security.debian.org/ /var/www/secudebian

Rien de plus côté apache. On pourrait pousser plus loin la configuration des directory apache mais ce n’est pas le propos de ce tuto.
 

V – Bug des traductions

Tel quel, vous allez prendre des erreur 404 sur les packages de traduction sur une machine cliente car apt-mirror ne les synchronise pas.

Deux solutions pour le résoudre (j’ai pris perso l’option 1)

A – Modification du script apt-mirror

Il faut modifier directement /usr/bin/apt-mirror, au niveau des lignes 350-360.
Trouvez :

foreach (@components) {
add_url_to_download($url . $_ . "/binary-" . $arch . "/Release");
add_url_to_download($url . $_ . "/binary-" . $arch . "/Packages.gz");
add_url_to_download($url . $_ . "/binary-" . $arch . "/Packages.bz2");

et rajouter ceci juste après, bien dans la boucle foreach

my $lang;
foreach $lang ("ast", "bg", "bs", "ca", "cs", "da", "de", "el", "en", "en_AU", "en_CA", "en_GB", "eo", "es", "eu", "fa", "fi", "fr", "fr_FR", "gl", "hr", "hu", "id", "is", "it", "ja", "ka", "km", "ko", "lt", "ms", "my", "nb", "nl", "no_NB", "oc", "pl", "pt", "pt_BR", "ro", "ru", "si", "sk", "sl", "sq", "sr", "sv", "th", "tr", "uk", "vi", "zh_CN", "zh_HK", "zh_TW", "zh") {
add_url_to_download($url . $_ . "/i18n/Translation-" . $lang);
add_url_to_download($url . $_ . "/i18n/Translation-" . $lang . ".gz");
add_url_to_download($url . $_ . "/i18n/Translation-" . $lang . ".bz2");
}

B – Intégration dans le script postmirror.sh

Ajoutez ceci dans postmirror.sh :

rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy/main/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy/main/i18n/
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy/contrib/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy/contrib/i18n/
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy/non-free/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy/non-free/i18n/
#
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy-proposed-updates/main/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy-proposed-updates/main/i18n/
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy-proposed-updates/contrib/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy-proposed-updates/contrib/i18n/
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy-proposed-updates/non-free/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy-proposed-updates/non-free/i18n/
#
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy-backports/main/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy-backports/main/i18n/
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy-backports/contrib/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy-backports/contrib/i18n/
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy-backports/non-free/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy-backports/non-free/i18n/
#
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy-updates/main/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy-updates/main/i18n/
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy-updates/contrib/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy-updates/contrib/i18n/
rsync --recursive --times --links --hard-links --delete --delete-after rsync://ftp.fr.debian.org/debian/dists/wheezy-updates/non-free/i18n/ /depot/mirror/ftp.fr.debian.org/debian/dists/wheezy-updates/non-free/i18n/

Pensez à ouvrir, le cas échéant, le port 873, utilisé par rsync.
 

VI – Lancement d’apt-mirror

Rien de complexe :
# apt-mirror /etc/apt/mirror.list
Et la, vous patientez !
Bien sur, il convient de faire un cron de tout ça par ex :

# crontab -e
* */2 * * *	/usr/bin/apt-mirror /etc/apt/mirror.list

pour une mise à jour toute les deux heures.
 

VII – Configuration des clients

Rien de bien compliqué la aussi :

deb http://10.1.1.1/debian/ wheezy main
#deb-src http://ftp.fr.debian.org/debian/ wheezy main
deb http://10.1.1.1/secudebian/ wheezy/updates main
#deb-src http://security.debian.org/ wheezy/updates main
# wheezy-updates, previously known as 'volatile'
deb http://10.1.1.1/debian/ wheezy-updates main
#deb-src http://ftp.fr.debian.org/debian/ wheezy-updates main

 

VIII – Compléments

A – Derrière un proxy

En cas de proxy en amont, il est nécessaire de configurer wgetrc:
# nano /etc/wgetrc
Et ajoutez ceci :

http_proxy = http://user:pwd@proxy:port
use_proxy = on

 

IX – Conclusion

Et voila, vous avez un joli miroir Debian (ou ce que vous voulez). Dans cet autre article, je fais un miroir Raspberry (ce qui était mon besoin initial, mais il fallait mieux commencer par le début).

8 réflexions sur « Monter son miroir Debian avec Apt-Mirror »

  1. Bonjour
    Si je puis me permettre le blanc sur fond gris pour les commandes, c’est illisible. Mais j’ai pu avancer dans mon miroir local. Après les corections que vous indiquez faut il lancer un script ou un fichier?

  2. Bonjour
    tuto excellent qui m’a aidé à installer mon miroir debian pour jessie et raspberry pi.
    Par contre les commandes en police blanche sur fond gris clair avec un arrière-plan blanc…
    Bref, c’est illisible, et c’est bien dommage.

  3. Hello,
    Est-tu certain de cette limitation ?
    – set limit_rate 500k
    Car d’après ce que je lis ici :
    http://serverfault.com/questions/88780/how-can-i-limit-the-bandwidth-of-apt-mirror
    ça dépend du nombre de « threads », as-tu fait des tests, peux-tu me dire plus ?
    Je suis en train de déployer un miroir pour une PME avec une connexion internet faible et cette information est pertinente et je n’ai trouvé que peux d’aide à ce sujet.
    Merci

Laisser un commentaire

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