Ceci est une ancienne révision du document !
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
- pour chaque dépot, le dépot suffixé de -test existe : il sert comme son nom l'indique a effectuer ajouter des paquets pas complètement testés.
- 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 etre 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.
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é :<code bash> #!/bin/bash #/sur/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-aliatools-${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 de 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