Debian - Dépôt Approfondissements

Un article de Wiki.OmBreNoiRe.net.

Attention !

Il n'est pas du tout nécessaire de lire les lignes qui vont suivre pour utiliser GenDepot.sh !

Néanmoins, si vous souhaitez comprendre comment fonctionne les différents fichiers générés et si vous même avez quelques problèmes, il est très probable que vous trouviez votre réponse ci-dessous !

Sommaire

Introduction

Lors de l'écriture du script GenDepot.sh j'ai rencontré quelques problèmes que j'ai fort heureusement résolu en comprenant plus en profondeur le fonctionnement des différents fichiers (Packages*, Release*, Sources*, Sources.list) et bien évidemment apt-ftparchive.

Si vous rencontrez l'une de ses erreurs car vous tentez de faire un dépôt personnel sans GenDepot.sh voilà qui pourra vous aider. A défaut, je vous conseil tout de même mon script qui aura l'avantage de vous faire gagner du temps :)

Syntaxe du fichier sources.list

La syntaxe du man nous dit :

Code : Sources.list - ligne type
deb uri distribution [component1] [component2] [...]

La partie deb

deb pouvant être deb ou deb-src en fonction du type de paquet (binaire ou source)

La partie uri

uri pouvant être :

  • http://debian.mondomaine.net[/]
  • http://www.mondomaine.net/cequejeveux[/]
  • http://www.cequejveux.net/truc[/]

Le [/] représente un slash (/) terminal facultatif, exemple http://debian.mondomaine.net/ le mettre ou non aura aucunes conséquences.

La partie distribution [component1] [component2] [...]

2 cas de figure pour distribution :


  • distribution SANS slash (/) terminal (le cas du dépôt standard)

Cela peut être le nom d'une distribution, par exemple etch, stable, unstable : dans ce cas le dépôt est sous forme standard (tel que généré par reprero) avec cette arborescence très particulière où distribution est un sous répertoire de uri/dists/.

Vous pouvez si vous le souhaitez faire un dépôt avec votre propre distribution, mais dans ce cas avec cette syntaxe il faudra ajouter un sous-répertoire à uri/dists/ du nom de cette distribution.

Puis vous spécifier les [component1] [component2] [...] et pour chacun des components, il doit exister un sous-répertoire dans uri/pool/ et dans uri/dists/votredistribution/, en notant que uri/pool/nom_component contiendra les paquets et uri/dists/nom_component/ les indexes Release*, Packages*, Sources*

Code : Sources.list - distribution SANS slash (/) terminal
deb http://http.us.debian.org/debian stable main contrib non-free
deb http://security.debian.org/ etch/updates main contrib


  • distribution AVEC slash (/) terminal (le cas du dépôt non-standard personnel)

Le fait d'ajouter un slash (/) à la fin de la distribution a de grandes conséquences, car cela signifie que l'on indique le répertoire où se trouve les indexes directement.

On ne peut pas mettre de [component1] [component2] [...] après une distribution terminant par un slash (/).

Ainsi si l'on inscrit ces lignes dans le fichier /etc/apt/sources.list :

Code : Sources.list - distribution AVEC slash (/) terminal
deb http://mondepot.net/debian etch/
deb http://debian.autredepot.org/etch/6wall ./

Avec deb http://mondepot.net/debian etch/, on indique que les indexes sont dans http://mondepot.net/debian/etch/. Avec deb http://debian.autredepot.org/etch/6wall ./, on indique que les indexes sont dans deb http://debian.autredepot.org/etch/6wall/.

Et l'on verra que deb http://debian.autredepot.org/etch/6wall ./ et deb http://debian.autredepot.org etch/6wall ne sont pas toujours équivalents en fonction des indexes !

Les fichiers indexes

Ce sont les fichiers récupéré par un aptitude update, ils permettent d'indiquer quels sont les paquets disponibles sur le serveur.

Les fichiers Packages*

Le fichier Packages contient les informations sur les paquets binaires .deb. Ces informations sont extraites du .deb, à part la ligne Filename: etch/postfix-vda/postfix-pcre_2.3.8-2+vda0_i386.deb est spécifique au dépôt (du moins le chemin). qui est fonction de la commande apt-ftparchive.

Exemple de fichier Packages :

Fichier : Packages - http://depot.ombrenoire.net/etch/Packages
Package: postfix-pcre
Priority: extra
Section: mail
Installed-Size: 100
Maintainer: LaMont Jones <lamont@debian.org>
Architecture: i386
Source: postfix
Version: 2.3.8-2+vda0
Depends: libc6 (>= 2.3.6-6), libpcre3 (>= 4.5), postfix, postfix (= 2.3.8-2+vda\
0)
Filename: etch/postfix-vda/postfix-pcre_2.3.8-2+vda0_i386.deb
Size: 37874
MD5sum: 81e800b4c421d7e48005ca3339aeda54
SHA1: 99a0b23e0dcf68a7e7a50507f869fddb0f622f03
SHA256: 1d237b5d9e5893b19418f27c66746b6351558cf29de9634825530ecca29ff381
Description: PCRE map support for Postfix
 Postfix is Wietse Venema's mail transport agent that started life as an
 alternative to the widely-used Sendmail program.  Postfix attempts to
 be fast, easy to administer, and secure, while at the same time being
[...]

Et c'est comme ça, pour chaque fichier .deb, c'est ce fichier que va lire aptitude pour gérer les dépendances, etc...

Pour générer les fichiers Packages*, on utilise le programme apt-archive de la manière suivante :

user@monordi:~$ apt-ftparchive packages /var/www/depot/ | gzip -f9 > /var/www/depot/etch/Packages.gz

user@monordi:~$ zcat /var/www/depot/etch/Packages.gz | bzip2 > /var/www/depot/etch/Packages.bz2 user@monordi:~$ zcat /var/www/depot/etch/Packages.gz > /var/www/depot/etch/Packages

Plusieurs remarques :

  • Avec ces commandes vous allez donc générer les fichiers Packages.gz, Packages.bz2 et Packages. Il est dit que Packages.bz serait suffisant, mais beaucoup conseil de générer les trois.
  • Dans le fichier qui va être généré par les commandes plus haut, le chemin après Filename: sera relatif à /var/www/depot/, c'est pourquoi si le paquet postfix-pcre_2.3.8-2+vda0_i386.deb se trouve dans /var/www/depot/etch/postfix-vda/, le chemin sera Filename: etch/postfix-vda/postfix-pcre_2.3.8-2+vda0_i386.deb
  • Le chemin contenu dans Filename: etch/postfix-vda/postfix-pcre_2.3.8-2+vda0_i386.deb est ajouté à la partie uri du fichier /etc/apt/sources/list, par exemple si le fichier contient deb http://debian.mondomaine.net etch/, aptitude ira chercher les paquets binaires à l'adresse http://debian.mondomaine.net/etch/postfix-vda/postfix-pcre_2.3.8-2+vda0_i386.deb

Les fichiers Sources*

Les fichiers Sources* sont l'équivalent des fichiers Packages* (même fonctionnement en tout point), mais pour les paquets sources (.dsc, .orig.tgz, ...).

Pour les générer on utilise la commande suivante :

user@monordi:~$ apt-ftparchive sources /var/www/depot/ | gzip -f9 > /var/www/depot/etch/Sources.gz

user@monordi:~$ zcat /var/www/depot/etch/Sources.gz | bzip2 > /var/www/depot/etch/Sources.bz2 user@monordi:~$ zcat /var/www/depot/etch/Sources.gz > /var/www/depot/etch/Sources

Les remarques sont les mêmes qu'avec apt-ftparchive mais pour les Packages*

Le fichier Release.gpg

C'est la signature du fichier Release par la clé privée du propriétaire du dépôt. Elle assure que le fichier Release a bien été créé par le mainteneur du dépôt.

On le génère grâce à la commande suivante :

user@monordi:~$ gpg --sign -ba -o Release.gpg Release

Le fichier Release

Attention !
Si le fichier Release.gpg n'existe pas, le fichier Release n'est pas interprété

Prenons le fichier Release contenu dans le répertoire etch de mon dépôt pour illustrer ce qui va être la suite.

Fichier : Release - http://depot.ombrenoire.net/etch/Release
Architectures: i386 all source
Components: main
Date: Mon, 23 Jun 2008 23:52:23 UTC
Label: debian.ombrenoire.net
Origin: Debian - OmBreNoiRe.net
Suite: etch
MD5Sum:
 c57016ea29777aa68c8acb40a113aedc             1086 6wall/Packages
 d8eb5cd4e604b0951800d8092cf14d89              724 6wall/Packages.bz2
 eb1bf0737b6c12318ad779729ee4637f              680 6wall/Packages.gz
 716b856d0ce45ba8d694284c3f5f5de2             1532 6wall/Release
 3840b62df3221e2a8fb8dc95dccbb0be              356 6wall/Sources
 231d8a979ede516d022ac201b4fc1548              311 6wall/Sources.bz2
 f027d611120992f6a528128eafb6e7f8              267 6wall/Sources.gz
 29f34b0b92ca5ec92d337c83c2360a90            26821 Packages
 5f59902f82756c92ac21d3a988fa0dd8             7493 Packages.bz2
 a83521a19b6c91afa22e53d37c4ea124             7859 Packages.gz
 4661907d13eaf11d06a444b9fdba6f9b             2280 Sources
 b3a1fcd515e46da16ef1b40d721451a0             1123 Sources.bz2
 60578a7a40ccb609441a4df8ebfd434e             1002 Sources.gz
 2bd58d731caf297c67a269c153faa21a             2620 apache2-mod-security/Packages
 751c9525fc42cc18b8d8d1aa6bab9923             1262 apache2-mod-security/Packages.bz2
 630e3001520e9247945f6246ec8c2159             1147 apache2-mod-security/Packages.gz
 2c06f75a95c1e22329e8e7785cfd0d86             1532 apache2-mod-security/Release
 48e5a7a7589cf85e992b06069909e09f              562 apache2-mod-security/Sources
 2248e48fe96e429d50deac04a731bb83              399 apache2-mod-security/Sources.bz2
 84d6fc6f367a3f8f713339ae641ddf5d              361 apache2-mod-security/Sources.gz
[...]

La première partie contient les informations sur le dépôt :

  • Architectures: i386 all source : L'architecture (non explorée, mais surement interprété)
  • Components: main : Le component (non interprété dans le cas d'une distribution finissant par slash (/) dans /etc/apt/sources.list
  • Date: Mon, 23 Jun 2008 23:52:23 UTC : La date de génération du fichier Release (non interprété)
  • Label: debian.ombrenoire.net : L'adresse du dépôt (non interprété)
  • Origin: Debian - OmBreNoiRe.net : La présentation sur le dépôt (non interprété)
  • Suite: etch : la distribution (se réfère au paramètre distribution du fichier /etc/apt/sources.list

La deuxième partie contient le checksum MD5, puis SHA1 et enfin SHA256 : ce sont des signatures suivant des algorithmes permettant d'identifier un fichier (si le fichier est modifié son checksum aussi). Ce checksum est établi pour TOUS les fichiers Release*, Packages*, Sources* du répertoire courant (où est crée le fichier Release) et ses sous-répertoires (récursif).

Pour générer ce fichier, on utilise encore le programme apt-archive, qui va nécessité dans ce cas d'un petit fichier de configuration :

Fichier : apt-ftparchive.conf
APT::FTPArchive::Release {
  Origin                "Debian - MonDomaine.Net";
  Label                 "debian.mondomaine.net";
  Suite                 "etch";
  Architectures         "i386 all source";
  Components            "main";
}
user@monordi:~$ apt-ftparchive -c apt-ftpconfig.conf release /var/www/depot/etch > Release.tmp ; mv Release.tmp /var/www/depot/etch/Release

Plusieurs remarques :

  • /var/www/depot/etch est le répertoire où l'on créé le fichier Release
  • la ligne correspondante dans /etc/apt/sources.list sera deb http://debian.mondomaine.net etch/

ou deb http://debian.mondomaine.net/etch/ ./

  • cette commande est lancé après la génération des fichiers Packages* et Sources* (et si besoin des Release*, Packages*, Sources* des sous-répertoires)
Attention !
  • Si vous mettez deb http://debian.mondomaine.net truc/, il FAUT que votre fichier apt-ftparchive.conf contienne suite="truc".
  • Si vous mettez deb http://debian.mondomaine.net/truc ./, vous mettez ce que vous voulez comme suite="mavie".
MAIS LES FICHIERS PACKAGES* et SOURCES* NE SERONT PAS LES MEMES DANS LES 2 CAS !! (cf vu précédemment)
Problème connu !
Vous ne pouvez pas executer la commande
user@monordi:~$ apt-ftparchive -c apt-ftpconfig.conf release /var/www/depot/etch > /var/www/depot/etch/Release
sans quoi le fichier Release va s'intégrer à lui même avec un faux checksum (taille vide)

Cas pratiques

Afin de clarifier tout ça, un peu d'exemples !

Les 4 paramètres sur lesquels on va jouer sont :

  • la ligne dans le fichier /etc/apt/source.list
  • le champs suite="" du fichier apt-ftparchive.conf pour générer le fichier Release
  • les champs rep_paquet et rep_racine des commandes
user@monordi:~$ apt-ftparchive -c apt-ftpconfig.conf rep_paquet > Release.tmp ; mv Release.tmp rep_paquet/Release
user@monordi:~$ apt-ftparchive packages rep_racine | gzip -f9 > rep_paquet/Packages.gz

user@monordi:~$ zcat rep_paquet/Packages.gz | bzip2 > rep_paquet/Packages.bz2

user@monordi:~$ zcat rep_paquet/Packages.gz > rep_paquet/Packages

Ce qui restera fixé dans tous les exemples:

  • http://debian.mondomaine.net pointera TOUJOURS sur /var/www/depot
  • l'arborescence simplifiée est la suivante :
/var/www/depot
             |
             |-/etch
                  |   
                  |-/6wall
                  |     |-6wall.deb
                  |
                  |-/postfix
                        |-/postfix.deb

Cas 1

On fait un dépôt et l'on souhaite accéder à tous le catalogue (6wall et postfix) en une ligne dans /etc/apt/source.list.

  • Paramètres :
    • /etc/apt/source.list : deb http://debian.mondomaine.net etch/
    • apt-ftparchive.conf : suite="etch"
    • rep_racine = /var/www/depot
    • rep_paquet = /var/www/depot/etch
  • Résultats :
    • Filename: etch/postfix/postfix.deb
    • aptitude update : OK
    • aptitude install postfix : OK

Cas 2

Le même que le cas 1, mais en changeant la ligne dans le /etc/apt/source.list.

  • Paramètres :
    • /etc/apt/source.list : deb http://debian.mondomaine.net/etch ./
    • apt-ftparchive.conf : suite="etch"
    • rep_racine = /var/www/depot
    • rep_paquet = /var/www/depot/etch
  • Résultats :
    • Filename: etch/postfix/postfix.deb
    • aptitude update : OK
    • aptitude install postfix : NOK
  • Erreur renvoyée :

Erreur 404 not found http://debian.mondomaine.net/etch/etch/postfix/postfix.deb

Cas 3

Le même que le cas 2, mais en corrigeant rep_racine.

  • Paramètres :
    • /etc/apt/source.list : deb http://debian.mondomaine.net/etch ./
    • apt-ftparchive.conf : suite="etch"
    • rep_racine = /var/www/depot/etch
    • rep_paquet = /var/www/depot/etch
  • Résultats :
    • Filename: ./postfix/postfix.deb
    • aptitude update : OK
    • aptitude install postfix : OK

Cas 4

Désormais, on donne accès à 6wall individuellement.

  • Paramètres :
    • /etc/apt/source.list : deb http://debian.mondomaine.net/etch/6wall ./
    • apt-ftparchive.conf : suite="etch" ou suite="cequejeveux"
    • rep_racine = /var/www/depot/etch/6wall
    • rep_paquet = /var/www/depot/etch/6wall
  • Résultats :
    • Filename: etch/6wall/6wall.deb
    • aptitude update : OK
    • aptitude install 6wall : OK

Cas 5

Idem que cas 4 mais en changeant la ligne dans /etc/apt/source.list

  • Paramètres :
    • /etc/apt/source.list : deb http://debian.mondomaine.net etch/6wall/
    • apt-ftparchive.conf : suite="etch"
    • rep_racine = /var/www/depot/
    • rep_paquet = /var/www/depot/etch/6wall
  • Résultats :
    • Filename: etch/6wall/6wall.deb
    • aptitude update : NOK
  • Erreur renvoyée :

W: Conflicting distribution: http://debian.mondomaine.net etch/6wall/ Release (expected etch/6wall but got )

À noter !
Si vous n'aviez pas de fichier Release.gpg vous n'auriez pas d'erreur (à part celle de ne pas être un serveur sécurisé) !

Cas 5

Idem que cas 5 mais en changeant la ligne dans apt-ftparchive.conf

  • Paramètres :
    • /etc/apt/source.list : deb http://debian.mondomaine.net etch/6wall/
    • apt-ftparchive.conf : suite="etch/6wall"
    • rep_racine = /var/www/depot/
    • rep_paquet = /var/www/depot/etch/6wall
  • Résultats :
    • Filename: etch/6wall/6wall.deb
    • aptitude update : OK
    • aptitude install 6wall : OK

Conclusion

Voilà j'espère que vous avez tout compris, en cas de besoin n'hésitez pas à me contacter !

Affichages
Boîte à outils