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

sysadmin/debian_repository.1271751448.txt.gz · Dernière modification: 2010/04/20 10:17 par james
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0