Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
sysadmin:debian_repository [2010/04/19 17:20] james créée |
sysadmin:debian_repository [2012/09/21 17:35] (Version actuelle) james ajout tags |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag>depot debian local logiciel howto apt-ftparchive gpg pool}} | ||
====== Créer son propre dépot Debian ====== | ====== Créer son propre dépot Debian ====== | ||
Ligne 5: | Ligne 6: | ||
Il existe pas mal de facons de faire et je vais vous présenter ici la manière que j'utilise au quotidien : | 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 : | Cette méthode utilise : | ||
- | - l'utilitaire apt-ftparchive | + | * l'utilitaire apt-ftparchive |
- | - un pool de fichiers .deb par dépot | + | * 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 dépot suffixé de -test existe : il sert comme son nom l'indique a effectuer ajouter des paquets pas complètement testés. | + | * 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 | + | * 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). | + | 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). |
- | voici l'arborescence de l'ensemble des depots : | + | ===== Créer l'arborescence d'un dépot ===== |
- | <code> | + | Voici l'arborescence type de l'ensemble des depots :<code> |
./cache | ./cache | ||
./mirror/pool-lenny | ./mirror/pool-lenny | ||
Ligne 41: | Ligne 42: | ||
./filelists/dists/hardy | ./filelists/dists/hardy | ||
./filelists/dists/hardy-test | ./filelists/dists/hardy-test | ||
+ | </code>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 :<code bash> | ||
+ | #!/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 | ||
+ | </code> | ||
+ | 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é :<code bash> | ||
+ | #!/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 | ||
+ | </code> | ||
+ | |||
+ | ===== 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 ) :<code> | ||
+ | # /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> | ||
+ | </code> | ||
+ | |||
+ | ===== 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 :<code bash> | ||
+ | cat << EOF >> /etc/apt/sources.list | ||
+ | deb http://debtools.domaine.interne lenny custom | ||
+ | EOF | ||
</code> | </code> |