Ubuntu : comment créer son propre repository local ?

I. Présentation

Hello, aujourd'hui nous allons voir comment mettre en place son propre repository local Ubuntu 20.04. 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 (surtout pour celui qui écrit le tutoriel ^^).

L'une des raisons pour lesquelles vous pouvez envisager de configurer un serveur de référentiel apt local est le fait de diminuer la consommation de la bande passante requise. Notamment si vous avez une centaine d'instances d'Ubuntu à 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

  • Ubuntu 20.04.X LTS (x64), avec une connexion internet stable
    • ubuntu-repository.local -192.168.1.10/24
    • 256 go d'espace disque, 4go pour la RAM pour être à l'aise
  • Ubuntu 20.04.X LTS (x64), avec ou sans connexion à internet
    • ubuntu.local - 192.168.1.20/24
    • Disposant de la capacité à communiquer avec la machine ubuntu-repository.local par le biais de ping/http. Attention, si vous avez un pare-feu sur votre réseau, n'oubliez pas d'ouvrir ces flux.

II. Installation du serveur web apache2

Dans le cadre du tutoriel, nous allons utiliser le service apache2 en tant que plateforme web, dans le but d'héberger les dépôts.

apt update && apt upgrade
apt install apache2

Pour rappel, le répertoire racine du service web apache se trouve dans le chemin /var/ www/html. Nous allons créer un répertoire "ubuntu" dans ce chemin, qui contiendra toute l’arborescence de notre futur repository apt (Aptitude).

mkdir -p /var/www/html/ubuntu

www-data, l'utilisateur par défaut d'apache, devra être le propriétaire du dossier "Ubuntu" . Effectuer les changements à l'aide de la commande suivante :

chown www-data:www-data /var/www/html/ubuntu

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 : cette commande nous permettra de cloner (puis par la suite de synchroniser pour les mises à jours) le référentiel distant vers notre référentiel local.

apt update
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, faites une sauvegarde du fichier original de configuration. Pratique pour revenir en arrière si vous en avez le besoin par la suite.

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/ubuntu
#
# 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://archive.ubuntu.com/ubuntu focal main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu focal-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu focal-updates main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu artful-proposed main restricted universe multiverse
#deb http://archive.ubuntu.com/ubuntu artful-backports main restricted universe multiverse
 
# deb-src http://archive.ubuntu.com/ubuntu artful main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu artful-security main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu artful-updates main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu artful-proposed main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu artful-backports main restricted universe multiverse
 
clean http://archive.ubuntu.com/ubuntu

Ce fichier de configuration sera à adapter, si vous arrivez sur ce tutoriel et que votre version d'Ubuntu est ultérieure à la version actuelle Focal (20.04) [Mars 2021]

Attention, par défaut, apt-mirror télécharge les dépendances de la version Artful, alors que nous souhaitions la version Focal. N'oubliez pas de décommettez les trois lignes commençant par deb.

Au cas où vous n'auriez pas remarqué, j'ai utilisé les dépôts de paquets Ubuntu 20.04 LTS principaux. Les autres resteront commentés, car ils ne sont pas forcément nécessaires dans le cas de ma démonstration. Si vous souhaitez également télécharger ou synchroniser des paquets src, dé-commentez les lignes commençant par « deb-src ». Ce ne sera pas fait dans ce tutoriel.

Pour en savoir plus sur les termes main, restricted, universe, multiverse, etc. je vous invite à consulter l'article suivant : main, restricted, universe, multiverse

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/Ubuntu/var/ en utilisant les deux commandes ci-dessous.

mkdir -p /var/www/html/ubuntu/var
cp /var/spool/apt-mirror/var/postmirror.sh /var/www/html/ubuntu/var

Il est maintenant temps de commencer à mettre en miroir les paquets des référentiels distants vers le dossier local de notre système. Exécutez la commande ci-dessous :

apt-mirror
Ubuntu apt-mirror

Et là, bah, vous pouvez aller faire autre chose pendant quelques heures le temps que le téléchargement des paquets s'effectue... Me concernant, avec une connexion fibrée le téléchargement a pris plus de 8H... Notamment, car Ubuntu bride le débit de download sur leurs serveurs.

C. Synchronisation des répertoires CNF et des fichiers d'index du dépôt local

Dans Ubuntu 20.04 LTS, apt-mirror ne synchronise pas le répertoire CNF et ses fichiers, nous devons donc télécharger et copier manuellement le dossier et ses fichiers. Pour éviter de télécharger manuellement le répertoire CNF/Fichier d'index, utilisez le script shell ci-dessous. Veillez à ne pas indenter le code.

#!/bin/bash
for p in "${1:-focal}"{,-{security,updates}}\
/{main,restricted,universe,multiverse};do >&2 echo "${p}"
wget -q -c -r -np -R "index.html*"\
 "http://archive.ubuntu.com/ubuntu/dists/${p}/cnf/Commands-amd64.xz"
wget -q -c -r -np -R "index.html*"\
 "http://archive.ubuntu.com/ubuntu/dists/${p}/cnf/Commands-i386.xz"
done

Ce script sera à adapter, si vous arrivez sur ce tutoriel et que votre version d'Ubuntu est ultérieure à Focal (20.04). Il faudra changer le nom Focal, avec le nom de la future/ancienne version. ^^

Ajoutez les droits d'exécution sur le script avec chmod et exécutez le script !

chmod +x cnf.sh
bash  cnf.sh

Congratulation to Pradeep Kumar for his amazing bash script

Ce script créera un dossier avec le nom « archive.ubuntu.com » avec un ensemble de fichiers à l'intérieur. Copiez-le dans le dossier "miroir".

cp -av archive.ubuntu.com  /var/www/html/ubuntu/mirror/

J'espère qu'Ubuntu reverra le code d'apt-mirror à l'avenir, car c'est clairement du bricolage plus qu'autre chose...

D. disclaimer (1/2)

Attention, si nous ne synchronisons pas le répertoire cnf, sur les machines clientes, nous obtiendrons les erreurs suivantes, donc pour résoudre ces erreurs, nous devons créer et exécuter le script ci-dessus !

E: Failed to fetch http://x.x.x.x/ubuntu/mirror/archive.ubuntu.com/ubuntu/dists/\
focal/restricted/cnf/Commands-amd64  404  Not Found [IP: xx.xx.xx.xx 80]
E: Failed to fetch http://x.x.x.x/ubuntu/mirror/archive.ubuntu.com/ubuntu/dists/\
focal-updates/main/cnf/Commands-amd64  404  Not Found [IP:xx.xx.xx.xx 80]
E: Failed to fetch http://x.x.x.x/ubuntu/mirror/archive.ubuntu.com/ubuntu/dists/\
focal-security/main/cnf/Commands-amd64  404  Not Found [IP:xx.xx.xx.xx 80]

E. disclaimer (2/2)

Mais ce n'est pas tout... un bug peu en cacher un autre :). De temps à autre, certains utilisateurs commentent sur des forums qu'ils ont quelques erreurs suite à l'exécution de la commande apt-update depuis un client Ubuntu. Ce qui a été mon cas, trois fois, lors de mes différents essais. En revanche, si vous n'avez pas le bug (ce qui m'étonnerait), passez à la section suivante. 

E: Failed to fetch http://x.x.x.x/ubuntu/mirror/archive.ubuntu.com/ubuntu/dists/focal/main/dep11/[email protected] 404 Not Found [IP: xx.xx.xx.xx 80]
E: Failed to fetch http://x.x.x.x/ubuntu/mirror/archive.ubuntu.com/ubuntu/dists/focal-updates/main/dep11/[email protected] 404 Not Found [IP: xx.xx.xx.xx 80]
E: Failed to fetch http://x.x.x.x/ubuntu/mirror/archive.ubuntu.com/ubuntu/dists/focal-security/main/dep11/[email protected] 404 Not Found [IP: xx.xx.xx.xx 80]

J'ai l'impression que cette petite coquille s'est généralisée à toutes les personnes désirant utiliser apt-mirror ces derniers temps (notamment en parcourant certains forums spécialisés). Ayez à l'esprit que le souci vient apparemment d'un bug dans le code de la commande apt-mirror. 

Je pense qu'à terme, ce bug sera peut-être résolu, mais ce n'est clairement pas la priorité d'Ubuntu, à mon avis, et c'est l'un des plus gros problèmes avec l'open source, vu que créer un repository local est un besoin très spécifique, qui n'est quand même pas trop connu ni rependu. Après avoir investigué sur internet (https://github.com/apt-mirror/apt-mirror/issues/102), ce bug date de plusieurs années et n'a toujours pas été colmaté...

Accédez au repository local via http depuis la machine cliente :

http://ip-of-your-local-repository/ubuntu/mirror/archive.ubuntu.com/ubuntu/dists/focal/main/dep11/

Si vous obtenez ça, ce n'est pas bon, il vous manque quelques paquets qui ne se sont pas téléchargés lors du processus apt-mirror. Il vous faut donc les paquets suivants :

Voici, comment résoudre ce nouveau problème "à la mano..." - Un grand merci à la personne qui a rédigé ce script :

https://github.com/apt-mirror/apt-mirror/issues/102#issuecomment-394683843

➡ Même, s'il y avait une petite faute (${dist}/${comp}) que j'ai rectifiée ^^

cd /var/www/html/Ubuntu/mirror/archive.ubuntu.com/ubuntu/dists/
nano scriptFix.sh
for dist in focal focal-updates focal-security; do 
  for comp in main  multiverse universe; do
    for size in 48 64 128; do
    wget http://archive.ubuntu.com/ubuntu/dists/${dist}/${comp}/dep11/icons-${size}x${size}@2.tar.gz -O ${dist}/${comp}/dep11/icons-${size}x${size}@2.tar.gz;
   done
 done
done

Ce script sera à adapter, si vous arrivez sur ce tutoriel et que votre version d'Ubuntu est ultérieure à Focal (20.04). Il faudra changer le nom Focal, avec le nom de la future/ancienne version, dans le cas où le bug n'est toujours pas corrigé.

chmod u+x script.sh
./script.sh

Note : l'exécution de ce script est à faire seulement une fois.

Comme vous pouvez le constater, les paquets suivants apparaissent désormais. Le problème est résolu : 

Nous pouvons alors passer à l'étape suivante (ouf...).

F. 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. Pour cela, nous allons devoir créer un petit script bash (et oui encore un...) qui va nous permettre d'automatiser le téléchargement (mirroring) des paquets, et la synchronisation automatique du répertoire CNF et ses fichiers d'index.

En effet, à chaque fois que notre dépôt local se synchronise avec le dépôt distant, s'il récupère des "nouveautés" : elles sont automatiquement inscrites dans les fichiers d'index. C'est donc pour cela qu'il faut les mettre à jour eux aussi par la même occasion pour éviter d'obtenir la même erreur que dans la partie III.C

Suivez scrupuleusement les directives suivantes :

cd /root

Créez le script syncingDistantToLocalRepository.sh avec l'éditeur nano (ou un autre) :

nano syncingDistantToLocalRepository.sh

Ajoutez le code suivant :

#!/bin/bash
if [ -d "/root/archive.ubuntu.com/" ];then
  echo "Supression du précédent dossier contenant les fichiers d'index CNF du dépot local"
  rm -r /root/archive.ubuntu.com/
fi
echo "################################################################"
echo "################################################################"
echo "-----------------------apt-mirror------------------------------"
apt-mirror
sleep 2
echo "-----------------------Syncing CNF distant directory and its files----------------------->"
for p in "${1:-focal}"{,-{security,updates}}\
/{main,restricted,universe,multiverse};do >&2 echo "${p}"
wget -q -c -r -np -R "index.html*"\
 "http://archive.ubuntu.com/ubuntu/dists/${p}/cnf/Commands-amd64.xz"
wget -q -c -r -np -R "index.html*"\
 "http://archive.ubuntu.com/ubuntu/dists/${p}/cnf/Commands-i386.xz"
done
sleep 2
echo "-----------------------Copying the folder just cloned to the local repository------------>"
cp -av /root/archive.ubuntu.com/  /var/www/html/ubuntu/mirror/

Enregistre le script et fermez-le... Ensuite, ajoutez les bons droits sur le fichier :

chmod u+x syncingDistantToLocalRepository.sh

Il nous reste à éditer la crontab pour planifier son exécution :

crontab -e

Ajouter la ligne ci-dessous pour la synchronisation à 01:00 tous les jours :

00  01  *  *  *  /root/syncingDistantToLocalRepository.sh >> /root/apt-mirror-syncing-execution-report.txt

Comme vous pouvez le constater, la sortie de notre script 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.

De temps en temps, apt-mirror vous demandera de "supprimer les paquets obsolètes" afin de libérer de l'espace disque. Vous pouvez le faire à l’aide de la commande suivante : 

/var/www/html/Ubuntu/var/clean.sh

ubuntu repository local

IV. Configuration du client Ubuntu 20.04 pour utiliser notre repository local

Nous allons maintenant configurer le poste client Ubuntu 20.04 (machine différente que celle où nous avons créé notre dépôt local), pour lui indiquer de s'appuyer notre dépôt local fraîchement monté.

apt update && apt upgrade

Pour tester et vérifier si notre serveur de référentiel apt fonctionne correctement ou non, j'ai un autre système Ubuntu 20.04 LTS 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 des dépôts distants. Alors, connectez-vous au système Ubuntu "client", modifiez ce qui suit dans le fichier sources.list.

Avant tout, sauvegardez vos sources.list actuels avec la commande ci-dessous. Bien utile dans le cas où vous souhaitez revenir en arrière et utiliser un dépôt distant.

cp /etc/apt/sources.list /etc/apt/sources.list.backup

Supprimez le fichier puis recréez-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'adresse IP de votre serveur hébergeant votre repository local.

deb [arch=amd64 trusted=yes] http://ip-of-your-local-repository-srv/ubuntu/mirror/archive.ubuntu.com/ubuntu focal main restricted
deb [arch=amd64 trusted=yes] http://ip-of-your-local-repository-srv/ubuntu/mirror/archive.ubuntu.com/ubuntu focal-updates main restricted
deb [arch=amd64 trusted=yes] http://ip-of-your-local-repository-srv/ubuntu/mirror/archive.ubuntu.com/ubuntu focal universe
deb [arch=amd64 trusted=yes] http://ip-of-your-local-repository-srv/ubuntu/mirror/archive.ubuntu.com/ubuntu focal-updates universe
deb [arch=amd64 trusted=yes] http://ip-of-your-local-repository-srv/ubuntu/mirror/archive.ubuntu.com/ubuntu focal multiverse
deb [arch=amd64 trusted=yes] http://ip-of-your-local-repository-srv/ubuntu/mirror/archive.ubuntu.com/ubuntu focal-updates multiverse
deb [arch=amd64 trusted=yes] http://ip-of-your-local-repository-srv/ubuntu/mirror/archive.ubuntu.com/ubuntu focal-security main restricted
deb [arch=amd64 trusted=yes] http://ip-of-your-local-repository-srv/ubuntu/mirror/archive.ubuntu.com/ubuntu focal-security universe
deb [arch=amd64 trusted=yes] http://ip-of-your-local-repository-srv/ubuntu/mirror/archive.ubuntu.com/ubuntu focal-security multiverse

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.

Parfois, il se peut que vous ayez quelques erreurs de cache apt, notamment entre le temps où vous changez vos URLs de dépôt sur votre machine cliente. Dans ce cas, utilisez la commande apt clean avant d'exécuter la commande de mise à jour suivante : 

apt update

Parfait, la sortie ci-dessus confirme que la machine cliente est capable de se connecter avec succès à notre référentiel pour récupérer les packages et les mises à jour.

Vous pouvez aussi tester votre repository local en installant un service quelconque. Dans mon cas, le service openssh.

V. Postface

C'est tout pour cette fois-ci, j'espère que vous serez 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 à googler votre erreur, 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.

VI. Pour aller plus loin... 

Si vous souhaitez que votre repository local dispose d'une couche de sécurité supplémentaire concernant l'accessibilité, changez la valeur de "set base_path /var/www/html/ubuntu (/etc/apt/mirror.list)" vers un point de montage qui pourrait être un NAS (ex: /nas/ubuntu ), ou une solution permettant la redondance des données sur deux ou plusieurs machines comme gluster-fs.

Cela vous permettra de vous assurer qu'en cas de crash de votre serveur repository local, les paquets ne seront pas affectés. Il faudra juste changer le point de montage lors de la configuration d'apt-mirror. 

Enfin, dans le but de ne pas perturber la configuration des clients qui interroge le repository local, il vous faudra créer un lien symbolique vous permettant de faire "pointer" votre répertoire web vers le point de montage redondé. 

ln -s /var/www/html/ubuntu/ /nas/ubuntu/

 

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Geoffrey Sauvageot-Berland

Ingénieur d'état en cybersécurité en alternance dans une entreprise spécialisée. Généraliste, avec une préférence pour Linux (Debian/Ubuntu), le scripting (Bash/Powershell), le developpement WEB ainsi qu'un fort penchant pour l'ethical hacking. Fondateur du site internet "Le guide du sysops".

geoffreysb a publié 9 articlesVoir toutes les publications de cet auteur

2 thoughts on “Ubuntu : comment créer son propre repository local ?

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.