Table des matières
Créer son propre dépot Debian
Il peut être tres pratique de créer son propre dépôt Debian.
Il existe pas mal de facons de faire et je vais vous présenter ici la manière que j'utilise au quotidien : Cette méthode utilise :
- l'utilitaire apt-ftparchive
- un pool de fichiers .deb par dépot (perte d'espace de stockage car les paquets sont dupliqués, mais gain en lisibilité sur les logiciels disponibles par dépot)
- pour chaque dépot, le même dépot suffixé de “-test” existe : il sert comme son nom l'indique à déposer des paquets pour les tester avant leur mise en production dans l'autre dépot.
- le dépot est signé par une clef GPG
Ce dépot permet une installation aisée d'un ensemble de machine car il héberge des meta-packages installant un ensemble de logiciels (peut être un jour un article la dessus).
Créer l'arborescence d'un dépot
Voici l'arborescence type de l'ensemble des depots :
./cache
./mirror/pool-lenny
./mirror/pool-lenny/custom
./mirror/pool-lenny/custom/binary-i386
./mirror/pool-lenny/custom/binary-amd64
./mirror/pool-lenny/custom/binary-all
./mirror/pool-lenny-test
./mirror/pool-lenny-test/custom
./mirror/pool-lenny-test/custom/binary-i386
./mirror/pool-lenny-test/custom/binary-amd64
./mirror/pool-lenny-test/custom/binary-all
./mirror/pool-hardy
./mirror/pool-hardy/custom
./mirror/pool-hardy/custom/binary-i386
./mirror/pool-hardy/custom/binary-amd64
./mirror/pool-hardy/custom/binary-all
./mirror/pool-hardy-test
./mirror/pool-hardy-test/custom
./mirror/pool-hardy-test/custom/binary-i386
./mirror/pool-hardy-test/custom/binary-amd64
./mirror/pool-hardy-test/custom/binary-all
./filelists
./filelists/dists
./filelists/dists/lenny
./filelists/dists/lenny-test
./filelists/dists/hardy
./filelists/dists/hardy-test
Comme on ne va pas créer cette arborescence a la main, voici un petit script permettant de créer/ajouter facilement un dépot :
#!/bin/bash # /usr/local/sbin/create_debian_repository.sh # cree un nouveau depot deb local ARCHS="i386 amd64" REPO_ROOT="/var/www/depots_deb" MIRROR_ROOT="$REPO_ROOT/mirror/dists" FILELISTS_DIR="$REPO_ROOT/filelists" if [ $# -lt 1 ] ; then echo "" >&2 echo "Usage: $0 depot section" >&2 echo "" >&2 echo "Cree l'arborescence nécessaire pour créer un depot avec la section souhaitée" >&2 echo "Genere le fichier de configuration associé pour apt-ftparchive" >&2 echo "" >&2 exit 1 fi # le premier argument specifie le depot if [ -n "$1" ]; then DIST=$1 shift fi # le deuxieme argument specifie la section if [ -n "$1" ]; then SECTION=$1 shift fi FTP_ARCHIVE_CONF_FILE="/etc/apt/apt-perso-${DIST}.conf" #creation de l'arborescence DIR="" for archi in $ARCHS; do DIR="$DIR ${FILELISTS_DIR}/dists/${DIST} $REPO_ROOT/mirror/pool-${DIST}/$SECTION/binary-${archi} $MIRROR_ROOT/$DIST/$SECTION/binary-${archi}" done DIR="$DIR $REPO_ROOT/mirror/pool-${DIST}/$SECTION/binary-all $MIRROR_ROOT/$DIST/$SECTION/binary-all" mkdir -p $DIR chown root:admin $DIR chmod u=rwx,g=rwxs,o=rx,g+s $DIR chmod g+ws $DIR # generation du fichier de configuration du depot if [ -f $FTP_ARCHIVE_CONF_FILE ]; then echo "Le fichier de conf $FTP_ARCHIVE_CONF_FILE existe deja : Abandon" >&2 echo "Veuillez le compléter a la main (si vous voulez créer une nouvelle section dans un depot existant)" >&2 echo "ou le supprimer avant de relancer ce script" >&2 exit 1 fi echo "APT::FTPArchive::Release::Origin \"Internal Repository\";" > $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Label \"Internal tools\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Suite \"$DIST\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Codename \"$DIST\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Architecture \"$ARCHS\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::components \"$SECTION\";" >> $FTP_ARCHIVE_CONF_FILE echo "APT::FTPArchive::Release::Description \"Internal Repository\";" >> $FTP_ARCHIVE_CONF_FILE echo "" >> $FTP_ARCHIVE_CONF_FILE echo "Tree \"dists/$DIST\" {" >> $FTP_ARCHIVE_CONF_FILE echo " Sections \"$SECTION\";" >> $FTP_ARCHIVE_CONF_FILE echo " Architectures \"$ARCHS\";" >> $FTP_ARCHIVE_CONF_FILE echo " Directory \"pool-$DIST/\$(SECTION)/binary-\$(ARCH)\";" >> $FTP_ARCHIVE_CONF_FILE echo " SrcDirectory \"pool-$DIST/\$(SECTION)/source\";" >> $FTP_ARCHIVE_CONF_FILE echo "}" >> $FTP_ARCHIVE_CONF_FILE
Il ne vous reste plus qu'a poser les paquets .deb dans le repertoire pool-$DIST/$(SECTION)/binary-$(ARCH) qui convient.
Mettre a jour le depot
Pour générer l'index du dépot afin qu'il soit utilisable sur vos postes clients, voici le script de mise à jour utilisé :
#!/bin/bash #/usr/local/bin/updateMirror.sh # met a jour le depot debian cible passé en argument DISTS="etch gutsy hardy intrepid lenny ubuntu unstable" # adapter ala liste des depots que vous possédez REPO_ROOT="/var/www/depots_deb" MIRROR_ROOT="$REPO_ROOT/mirror/dists" GPG_HOME="/root/.gnupg_depots_deb" FILELISTS_DIR="$REPO_ROOT/filelists" ARCH_LIST="i386 amd64 all" if [ $# -lt 1 ] ; then echo "" >&2 echo "Usage: $0 [ all|etch|unstable|... ] [ test ]" >&2 echo "" >&2 echo "Mise à jour du ou des dépots (all) spécifié en premier argument." >&2 echo "Un seul dépot peut-être spécifié à la fois." >&2 echo "" >&2 echo "Si le deuxième argument est 'test', " >&2 echo "la mise à jour se fait sur les dépots de test" >&2 echo "" >&2 exit 1 fi # le premier argument specifie le depot à mettre à jour if [ -n "$1" ]; then ONLY_DIST="" tmp_sec=$1 shift for i in ${DISTS} do if [ "X$i" = "X$tmp_sec" ]; then ONLY_DIST=$i break fi done if [ "X$tmp_sec" = "Xall" ]; then ONLY_DIST=${DISTS} fi if [ -z "${ONLY_DIST}" ]; then echo "ERREUR: depot invalide $tmp_sec" >&2 exit 1 fi DISTS=${ONLY_DIST} fi # depots de prod ou de test DIST_SUFFIX="" if [ "X$1" == "Xtest" ]; then DIST_SUFFIX="-test" shift fi for DIST in $DISTS do DIST="${DIST}${DIST_SUFFIX}" FTP_ARCHIVE_CONF_FILE="/etc/apt/apt-perso-${DIST}.conf" rm -f $REPO_ROOT/cache/*db # generation des filelist des depots cd $REPO_ROOT/mirror for section in `ls pool-${DIST}` do for archi in $ARCH_LIST; do if [ "x${archi}" = "xall" ]; then continue fi mkdir -p ${FILELISTS_DIR}/dists/${DIST} echo "Section : ${section}" echo "Arch : ${archi}" FILELIST="${FILELISTS_DIR}/dists/${DIST}/${section}-${archi}.filelist" echo "filelist : $FILELIST" find pool-${DIST}/$section/binary-${archi} pool-${DIST}/$section/binary-all -name "*.deb" > \ ${FILELISTS_DIR}/dists/${DIST}/${section}-${archi}.filelist done done echo "generation apt ftp archive :" apt-ftparchive generate ${FTP_ARCHIVE_CONF_FILE} echo "creation du fichier Release :" # creation des fichiers Release RELEASE_FILE="${MIRROR_ROOT}/${DIST}/Release" apt-ftparchive -c $FTP_ARCHIVE_CONF_FILE release \ ${MIRROR_ROOT}/${DIST}/ > $RELEASE_FILE # signature gpg des fichiers Release rm -f $RELEASE_FILE.gpg ${DEBUG} gpg --verbose --homedir ${GPG_HOME} -ba \ --output $RELEASE_FILE.gpg $RELEASE_FILE done
Configuration du virtualhost apache
Pour utiliser ce dépot le plus simple est de le servir en http via un serveur Web (apache2 dans notre cas). Voici un exemple de fichier de VirtualHost apache2 (fichier : /etc/apache2/sites-available/debtools.domaine.interne ) :
# /etc/apache2/sites-available/debtools.domaine.interne <VirtualHost *> ServerAdmin admin@mondomaine.com ServerName debtools.domaine.interne ServerAlias debtools DocumentRoot /var/www/depots_deb/mirror/ ErrorLog /var/log/apache2/depots_deb_error.log TransferLog /var/log/apache2/depots_deb_access.log <Directory /var/www/depots_deb/mirror/> AllowOverride AuthConfig Options Indexes FollowSymLinks MultiViews order deny,allow allow from all </Directory> </VirtualHost>
Utilisation coté client
Il suffit d'ajouter la ligne correspondante a la distribution dans votre fichier /etc/apt/sources.list (ou créer un nouveau fichier dans le repertoire /etc/apt/sources.list.d/ ), par exemple pour lenny :
cat << EOF >> /etc/apt/sources.list deb http://debtools.domaine.interne lenny custom EOF