Déballez facilement DEB, modifiez postinst et remballez de DEB

129

J'essaie d'installer le SDK OpenCL d'Intel, mais les fichiers DEB sont des conversions anormales de RPM (voir ici pour les plus curieux). Je dois éditer le postinstscript 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 ultérieurement le contenu pour créer un nouveau DEB? Je ne modifierai que les fichiers, aucun fichier ne sera ajouté ou supprimé.

John Jumper
la source

Réponses:

202

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-le dpkg-debpour extraire ses informations de contrôle et les fichiers du package. Utilisez dpkg-deb -bpour 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 soit exécuté en tant que root, les autorisations et la propriété des fichiers seront corrompues à l'étape d'extraction. Une façon d'éviter cela consiste à exécuter votre script sous fakeroot. Notez que vous devez exécuter la séquence entière sous fakeroot, et non pas dpkg-debindividuellement, car c'est le fakerootprocessus 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 gâcher les autorisations, vous pouvez conserver l’archive de données et ne modifier que l’archive de contrôle. dpkg-debne fournit pas un moyen de le faire. Heureusement, les paquets deb sont dans un format standard: ce sont des ararchives. Vous pouvez donc utiliser arpour extraire l’archive de contrôle, modifier ses fichiers et utiliser à arnouveau 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 une entrée de journal des modifications et modifier le numéro de version si vous modifiez un élément du package. L'infrastructure permettant de manipuler les paquets Debian suppose que si deux paquets ont le même nom et la même version, ils ont 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.1devient 1.2.3-4.1~johnjumper1.

Au lieu d'utiliser des outils shell, vous pouvez utiliser Emacs. Le dpkg-dev-elpaquet (qui est son propre amont car il s’agit d’un paquet Debian natif) contient des modes pour éditer les .debfichiers et éditer les journaux des modifications Debian. Emacs peut être utilisé de manière interactive ou par script.

Gilles
la source
4
Vous pouvez également utiliser le -ecommutateur de FPM pour modifier le fichier de contrôle: fpm -e -s deb -t deb ../old.deb. Cela ouvrira le fichier de contrôle dans votre éditeur.
Artefacto
1
BTW, fakeroot bashet essayer d'émettre des commandes ne fonctionnera pas en ce qui concerne la propriété, et la arméthode est incroyablement rapide pour les gros fichiers deb!
Aquarius Power
1
Merci. C'était utile. Utilisation dpkg-deb -Rdes modes ont été conservés et dpkg-deb -bréinitialiser le uid:giddes fichiers extraits à 0:0. Je n'avais pas besoin de fakeroot (j'imagine qu'il pourrait y avoir des problèmes s'il y avait des fichiers {u, g} id placés dans les archives, mais ce n'était pas le cas dans ma situation.
PSkocik
2
@PSkocik Pas seulement les fichiers setxid, mais aussi, par exemple, les fichiers et les répertoires sous /etcou /vardevant appartenir à un groupe spécifique.
Gilles
8

Vous pouvez utiliser fpm avec l' --after-installoption de remplacement du postinstscript, comme ceci:

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
Juancho
la source
2
Pour installer fpm sur Debian / Ubuntu: sudo apt-get install ruby-dev build-essential; sudo gem installe fpm
Craig S. Anderson