Ik probeer Intels OpenCL SDK te installeren, maar de DEB-bestanden zijn foutieve conversies van RPM (zie hier voor nieuwsgierigen). Ik moet het postinst
-script bewerken in de DEB die ze leveren.
Hoe kan ik een bestaande DEB nemen, de inhoud extraheren (inclusief de besturingsinformatie), en vervolgens de inhoud later opnieuw inpakken om een nieuwe DEB te maken? Ik zal alleen bestanden bewerken, er zullen geen bestanden worden toegevoegd of verwijderd.
Opmerkingen
Antwoord
De het primaire commando om deb-pakketten te manipuleren is dpkg-deb
.
Om het pakket uit te pakken, maakt u een lege map en schakel ernaartoe, voer dan dpkg-deb
uit om de controle-informatie en de pakketbestanden te extraheren. Gebruik dpkg-deb -b
om het pakket opnieuw op te bouwen.
mkdir tmp dpkg-deb -R original.deb tmp # edit DEBIAN/postinst dpkg-deb -b tmp fixed.deb
Pas op dat, tenzij je script als root draait, de bestanden ” machtigingen en eigendom worden beschadigd tijdens de extractiefase. Een manier om dit te vermijden is door uw script uit te voeren onder fakeroot
. Houd er rekening mee dat u de hele reeks onder fakeroot
moet uitvoeren, niet elke dpkg-deb
afzonderlijk, aangezien dit de fakeroot
proces dat het geheugen bewaart van de rechten van de bestanden die” niet kunnen worden aangemaakt zoals ze zijn.
fakeroot sh -c " mkdir tmp dpkg-deb -R original.deb tmp # edit DEBIAN/postinst dpkg-deb -b tmp fixed.deb "
In plaats van rommel met machtigingen kunt u het data-archief intact houden en alleen het controle-archief wijzigen. dpkg-deb
biedt geen manier om dat te doen. Gelukkig hebben deb-pakketten een standaardindeling: ze “re ar
archieven. U kunt dus ar
om het controle-archief uit te pakken, de bestanden te wijzigen, en ar
opnieuw te gebruiken om het controle-archief te vervangen door een nieuwe versie.
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
U moet een changelog-item toevoegen en de versienummer als u iets in het pakket wijzigt. De infrastructuur om Debian-pakketten te manipuleren gaat ervan uit dat als twee pakketten dezelfde naam en versie, ze zijn hetzelfde pakket. Voeg een achtervoegsel toe aan het debian_revision -gedeelte aan het einde van het versienummer; om sorteerredenen moet het achtervoegsel beginnen met ~
, bijv. 1.2.3-4.1
wordt 1.2.3-4.1~johnjumper1
.
In plaats van shell-tools te gebruiken, kun je Emacs gebruiken. Het dpkg-dev-el
-pakket (dat zijn eigen upstream is aangezien dit een native Debian-pakket is) bevat modi om .deb
bestanden en om de wijzigingslogboeken van Debian te bewerken. Emacs kan interactief of gescript worden gebruikt.
Reacties
- Je kunt ook de
-e
schakelaar van fpm om het controlebestand te wijzigen:fpm -e -s deb -t deb ../old.deb
. Hierdoor wordt het controlebestand in je editor geopend. - tussen haakjes,
fakeroot bash
en proberen om commandos uit te voeren werken niet met betrekking tot eigendom, en dear
methode is ongelooflijk snel voor grote deb-bestanden! - Bedankt. Dit was handig. Met
dpkg-deb -R
werden de modi behouden endpkg-deb -b
reset deuid:gid
van de uitgepakte bestanden naar0:0
. Had ' geen fakeroot nodig (ik kan me voorstellen dat er problemen zouden zijn als er ingestelde {u, g} id-bestanden in het archief waren, maar dat was niet ' t het geval in mijn situatie. - @PSkocik Niet alleen setxid-bestanden, ook bijvoorbeeld bestanden en mappen onder
/etc
of/var
die tot een specifieke groep moeten behoren. - Bedankt voor het goede antwoord. Is er een manier om ervoor te zorgen dat het herbouwde pakket versus het originele pakket dezelfde md5sum heeft?
Antwoord
U kunt fpm gebruiken met de --after-install
optie om het postinst
script als volgt te vervangen:
fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
Opmerkingen
- Om fpm op Debian / Ubuntu te installeren: sudo apt-get install ruby-dev build-essential; sudo gem install fpm
Answer
Als u alleen bestanden wilt extraheren van een .deb-bestand le, 7-Zip is handig. 7-Zip ondersteunt “ar” -bestanden voor “alleen uitpakken”. (Het is niet nodig om het bestand een andere naam te geven; het opent * .deb als “ar” en toont “data.tar” binnenin.)
Reacties
- Welkom op de site en bedankt voor je bijdrage.Merk op dat het OP specifiek om " vroeg om DEB uit te pakken … en DEB opnieuw in te pakken ". Misschien kun je je bericht bewerken om dat onderwerp ook aan te pakken.
apt install mc
) – druk gewoon op enter in een deb-bestand