web-dev-qa-db-fra.com

Décompressez facilement le DEB, modifiez la post-installation et reconditionnez le DEB

J'essaie d'installer le SDK OpenCL d'Intel, mais les fichiers DEB sont des conversions de bogues à partir de RPM (voir ici pour les curieux). J'ai besoin d'éditer le script postinst dans le DEB qu'ils fournissent.

Comment puis-je prendre un DEB existant, extraire le contenu (y compris les informations de contrôle), puis reconditionner le contenu pour créer un nouveau DEB? Je ne modifierai que les fichiers, aucun fichier ne sera ajouté ou supprimé.

141
John Jumper

La commande principale pour manipuler les paquets deb est dpkg-deb .

Pour décompresser le package, créez un répertoire vide et basculez vers celui-ci, puis exécutez dpkg-deb pour extraire ses informations de contrôle et les fichiers de package. Utilisation dpkg-deb -b pour reconstruire le paquet.

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

Attention, à moins que votre script ne s'exécute en tant que root, les autorisations et la propriété des fichiers seront corrompues au stade de l'extraction. Une façon d'éviter cela est d'exécuter votre script sous fakeroot . Notez que vous devez exécuter la séquence entière sous fakeroot, pas chaque dpkg-deb individuellement, car c'est le processus fakeroot qui conserve la mémoire des autorisations des fichiers qui ne peuvent pas être créés tels quels.

fakeroot sh -c '
  mkdir tmp
  dpkg-deb -R original.deb tmp
  # edit DEBIAN/postinst
  dpkg-deb -b tmp fixed.deb
'

Plutôt que de jouer avec les autorisations, vous pouvez conserver l'archive de données intacte et modifier uniquement l'archive de contrôle. dpkg-deb ne fournit aucun moyen de le faire. Heureusement, les paquets deb sont dans un format standard: ce sont des archives ar . Vous pouvez donc utiliser ar pour extraire l'archive de contrôle, modifier ses fichiers et réutiliser ar pour remplacer l'archive de contrôle par une nouvelle version.

mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# edit postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz

Vous devez ajouter un entrée du journal des modifications et changer le numéro de version si vous modifiez quelque chose dans le package . L'infrastructure pour manipuler les paquets Debian suppose que si deux paquets ont le même nom et la même version, ils sont le même paquet. Ajoutez un suffixe à la partie debian_revision à la fin du numéro de version; pour des raisons de tri, le suffixe doit commencer par ~, par exemple. 1.2.3-4.1 devient 1.2.3-4.1~johnjumper1.

Au lieu d'utiliser les outils Shell, vous pouvez utiliser Emacs. Le dpkg-dev-el package (qui est son propre amont car il s'agit d'un package Debian natif) contient des modes pour éditer .deb fichiers et pour éditer les changelogs de Debian. Emacs peut être utilisé de manière interactive ou scriptée.

Vous pouvez utiliser fpm avec le --after-install option pour remplacer le script postinst, comme ceci:

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
8
Juancho