Manipulation des paquets Debian

  • Debian fournit un certain nombre d'outils pour manipuler les paquets principalement destinés au développeurs officiels.
  • Ici l'objectif est de :
    • créer des paquets qui ne sont principalement que des listes de dépendances pour faciliter les installations standard et les configurations de serveurs : serveurs de calcul meditation(s) par exemple.
    • créer des paquets à partir d'un code ou d'une bibliothèque compilée localement.
    • éventuellement modifier des paquets fournis par des prestataires externes

note: les numéros de version des paquets locaux sont faits à partir de la date AA.MM.JJa..z (ce qui laisse 26 versions par jour…)

Création d'un paquet de dépendances

  • le paquet equivs fournit deux commandes :
    • equivs-control pkg.equivs : qui crée un fichier squelette pkg.equivs à paramétrer
    • equivs-build pkg.equivs : qui va construire le paquet debian en fonction du squelette.

Extraction / Re-création de paquets

Deux scripts inclus dans le paquet lpmmc-dpkg-tools :

  • dpkg-extract-deb.sh : extrait un paquet dans un répertoire du même nom.
  • dpkg-build-deb.sh : recrée un paquet à partir du contenu d'un répertoire

Méthode simple pour créer un paquet qui ne contient pas que des dépendances :

  • créer un squelette de paquet “creux” avec equivs-control puis equivs-build
  • extraire le paquet construit, le compléter (et supprimer le squelette devenu inutile)

Exemple: paquet python3-dmrgpy (calcul)

Récupération du code et compilation

  • Récupération du code et création d'une archive tar de base :
    git-clone.sh
    #!/bin/bash
    git clone https://github.com/joselado/dmrgpy.git
    tar cvfz dmrgpy.git.tar.gz dmrgpy/
  • en suivant la doc de mise en place sur https://github.com/joselado/dmrgpy/tree/master
    • cd dmrgpy
    • time python install.py
      • de nombreuses compilations de sources *.cc «with optimizations» et pas mal de «warnings«»…
      • durée totale : ~12min
    • en fin de compilation la bibliothèque se trouve dans src/dmrgpy
      $ ls src/dmrgpy/
      algebra/		 cvm.py		   dos.py		    excited.py	     functionfit.py  juliarun.py       mpsalgebratk/	   nonhermitian/	 pychain/	    reconstruct.py	 timeevolution.py
      ampotk.py		 dcex.py	   dynamics.py		    extrapolate.py   funtk.py	     kondochain.py     mpscpp2/		   operatornames.py	 pychainwrapper.py  simplechains.py	 topology.py
      analyticcontinuation.py  degeneracy.py	   edtk/		    fermionchain.py  gap.py	     kpmdmrg.py        mpsjulia/	   parafermionchain.py	 pyfermion/	    spinchain.py	 vev.py
      applyoperator.py	 densitymatrix.py  effectivehamiltonian.py  fermionchaintk/  groundstate.py  manybodychain.py  mps.py		   parallel.py		 pyparafermion/     spinfermionchain.py  wavefunction.py
      bosonchain.py		 distribution.py   entanglement.py	    fermiondos.py    inference.py    meanfield.py      multicorrelator.py  parallelslurm_old.py  pyspin/	    taskdmrg.py		 writemps.py
      correlator.py		 dmrgpy2pychain/   entropy.py		    fidelity.py      __init__.py     mode.py	       multioperator.py    parallelslurm.py	 pyzn/		    thermal.py
      cpprun.py		 dmtk/		   entropytk/		    filesystem.py    install.sh      mpsalgebra.py     multioperatortk/    pyboson/		 randommps.py	    timedependent.py
    • Dans la distribution Debian la bibliothèque devra être placée en /usr/lib/python3/dist-packages/ et les paquets Debian sont nommés python3-<biblio>

Création du paquet python3-dmrgpy

  • equivs-control python3-dmrgpy.equivs
  • édition du fichier python3-dmrgpy.equivs pour obtenir :
    python3-dmrgpy.equivs
    Package: python3-dmrgpy
    Version: 24.03.26a
    Architecture: amd64
    Maintainer: Jean-Daniel <jean-daniel.dubois@grenoble.cnrs.fr>
    Section: misc
    Priority: optional
    Description: DMRGPY
      This is a Python library to compute quasi-one-dimensional spin chains and fermionic systems using matrix product states with the density matrix renormalization group as implemented in ITensor (C++ and Julia versions). Most of the computations can be performed both with DMRG and exact diagonalization for small systems, which allows to benchmark the results.
  • génération du paquet Debian vide : equivs-build python3-dmrgpy.equivs
  • on obtient un paquet python3-dmrgpy_24.03.26a_amd64.deb (vide, 2,4Ko)
  • extraction du paquet pour obtenir l'arborescence de construction : dpkg-extract-deb.sh python3-dmrgpy_24.03.26a_amd64.deb
  • On obtient :
    $ $ ls -R python3-dmrgpy
    python3-dmrgpy:
    DEBIAN/  usr/
    
    python3-dmrgpy/DEBIAN:
    control  md5sums
    
    python3-dmrgpy/usr:
    share/
    
    python3-dmrgpy/usr/share:
    doc/
    
    python3-dmrgpy/usr/share/doc:
    python3-dmrgpy/
    
    python3-dmrgpy/usr/share/doc/python3-dmrgpy:
    changelog.gz  copyright  README.Debian
  • Il reste a remplir la structure du paquet debian
    rsync-src-deb.sh
    #!/bin/bash
    mkdir -p  python3-dmrgpy/usr/lib/python3/dist-packages/
    rsync -avP --delete-before dmrgpy/src/dmrgpy python3-dmrgpy/usr/lib/python3/dist-packages/
  • et de regénérer le paquet : dpkg-build-deb.sh python3-dmrgpy

Note: le test minimal après une première installation

$ python
Python 3.11.2 (main, Mar  2 2024, 20:28:50) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from dmrgpy import spinchain
>>> quit()

a montré une dépendance au paquet python3-statsmodels ce qui engendré une modification du fichier control

control
Package: python3-dmrgpy
Version: 24.03.26a
Architecture: amd64
Maintainer: Jean-Daniel <jean-daniel.dubois@grenoble.cnrs.fr>
Installed-Size: 230492
Section: misc
Priority: optional
Multi-Arch: foreign
Depends: python3-statsmodels
Description: DMRGPY
  This is a Python library to compute quasi-one-dimensional spin chains and fermionic systems using matrix product states with the density matrix renormalization group as implemented in ITensor (C++ and Julia versions). Most of the computations can be performed both with DMRG and exact diagonalization for small systems, which allows to benchmark the results.

(la valeur de Installed-Size a été calculée à partir de

$  du -sk python3-dmrgpy/usr/
230492	python3-dmrgpy/usr/

)

  • Ménage : les sous répertoires dmrgpy (git clone) python3-dmrgpy (extraction du paquet ddeb) peuvent être supprimés
    $ rm -rf dmrgpy python3-dmrgpy python3-dmrgpy_*.changes python3-dmrgpy_*.buildinfo 
    $ du -sch *
    45M	dmrgpy.git.tar.gz
    4,0K	git-clone.sh
    12M	python3-dmrgpy_24.03.26a_amd64.deb
    4,0K	python3-dmrgpy.equivs
    4,0K	rsync-src-deb.sh
    56M	total
  • le paquet debian étant dans l'arborescence de développement du dépôt local LPMMC, il sera automatiquement intégré/mis à jour lors du prochain rsync-DIST fait à la racine.

Code des scripts dpkg-* Pour info

  • la dernière version à jour est dans le paquet lpmmc-dpkg-tools
dpkg-extract-deb.sh
#!/bin/bash
if [ $# -ne 1 ]
then
  echo usage $0 paquet-debian.deb
  exit 1
fi
pkg=`basename $1 .deb`.deb
if [ ! -f $pkg ]
then
  echo $pkg inaccessible!!!
  exit 1
fi
dirname=${pkg%%_*}
echo extraction dans $dirname
if [ -d $dirname ]
then
  echo $dirname existe déjà!!!
  #exit 1
else
  mkdir -p $dirname/DEBIAN
  dpkg-deb -x $pkg $dirname
  dpkg-deb -e $pkg $dirname/DEBIAN
fi
#ls -R $dirname
echo `find $dirname -type f |wc -l` fichiers dans $dirname
du -sch $dirname
dpkg-build-deb.sh
#!/bin/bash
if [ `id -u` -ne 0 ]
then
  echo lancement en fakeroot
  fakeroot $0 $*
  exit 0
fi
if [ $# -ne 1 ]
then
  if [ -f DEBIAN/control ]
  then
    wd=`pwd`
    root=`readlink -f $wd`
    base=`basename $root`
    cd ..
  else
    echo usage $0 dossier contenant DEBIAN/control
    exit 1
  fi
else
  base=$1
fi
if [ ! -f $base/DEBIAN/control ]
then
  echo $base/DEBIAN/control inacessible!!!
  exit 1
fi
cd $base
debdir=`pwd`
debdir=`readlink -f $debdir`
debname=`basename $debdir`
derversion=`ls -rt ../$base*.deb|tail -1`
echo derversion=\"$derversion\"
if [ "$derversion" != "" ]
then
  echo "dernière version : " `basename $derversion .deb`
  newfiles=`find . -type f -newer $derversion|wc -l`
  if [ $newfiles -eq 0 ]
  then
    echo aucun fichier modifié postérieurement...
    echo "On continue quand même ? (ou ^C)"
    read
  fi
  echo '==============================================='
  echo Fichiers modifiés postérieurement :
  find . -type f -newer $derversion
  echo '==============================================='
fi
newfiles=`find . -type f -newer DEBIAN/control|egrep -v "conffiles|md5sums"|wc -l`
if [ $newfiles -gt 0 ]
then
  echo $newfiles modifiés après DEBIAN/control
  find . -type f -newer DEBIAN/control|egrep -v "conffiles|md5sums"
  echo '*** ERREUR !!! mettre à jour DEBIAN/control !!!'
  echo '==============================================='
  exit 1
fi
find . -type f -exec md5sum {} \; |grep -v DEBIAN >DEBIAN/md5sums 
find etc/ -type f 2>/dev/null |sed 's/^/\//' >DEBIAN/conffiles 
echo `find etc/ -type f -ls 2>/dev/null|wc -l` fichiers de configuration 
cd ..
chown -R root.root $base
chmod -R 0644 $base
chmod -R +X $base
find $base -type f 2>/dev/null|grep -v usr/share/doc |xargs file|egrep 'ELF|executable' |awk -F: '{print $1;}'|xargs chmod a+x 
echo `find $base -type f -executable -ls 2>/dev/null|wc -l` executables.
echo `find $base -type f -ls 2>/dev/null|wc -l` fichiers.
dpkg-deb -b $base .
ls -lh $base*.deb

Outils pour utilisateurs