Jag försöker installera Intels OpenCL SDK men DEB-filerna är buggy-omvandlingar från RPM (se här för nyfikna). Jag måste redigera postinst
-skriptet i DEB som de tillhandahåller.
Hur kan jag ta en befintlig DEB, extrahera innehållet (inklusive kontrollinformationen) och sedan senare packa om innehållet för att skapa en ny DEB? Jag kommer bara att redigera filer, inga filer läggs till eller tas bort.
Kommentarer
Svar
primärt kommando för att manipulera deb-paket är dpkg-deb
.
För att packa upp paketet skapar du en tom katalog och växla till den, kör sedan dpkg-deb
för att extrahera dess kontrollinformation och paketfilerna. Använd dpkg-deb -b
för att bygga om paketet.
mkdir tmp dpkg-deb -R original.deb tmp # edit DEBIAN/postinst dpkg-deb -b tmp fixed.deb
Observera att om inte ditt skript körs som root, filerna ” behörigheter och ägande kommer att skadas i extraktionsfasen. Ett sätt att undvika detta är att köra ditt skript under fakeroot
Observera att du måste köra hela sekvensen under fakeroot
, inte varje dpkg-deb
individuellt, eftersom det är fakeroot
-process som håller minnet på behörigheterna för filerna som inte kan skapas som de är.
fakeroot sh -c " mkdir tmp dpkg-deb -R original.deb tmp # edit DEBIAN/postinst dpkg-deb -b tmp fixed.deb "
Snarare än röra med behörigheter kan du hålla dataarkivet intakt och bara ändra kontrollarkivet. dpkg-deb
ger inte ett sätt att göra det. Lyckligtvis är deb-paket i standardformat: de ”re ar
arkiv. Så du kan använda ar
för att extrahera kontrollarkivet, ändra dess filer och använda ar
för att ersätta kontrollarkivet med en ny 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
Du bör lägga till en ändringsloggpost och ändra versionsnummer om du ändrar något i paketet. Infrastrukturen för att manipulera Debians paket förutsätter att om två paket har samma namn och version, de är samma paket. Lägg till ett suffix till delen debian_revision i slutet av versionsnumret; av sorteringsskäl bör suffixet börja med ~
, t.ex. 1.2.3-4.1
blir 1.2.3-4.1~johnjumper1
.
Istället för att använda skalverktyg kan du använda Emacs. dpkg-dev-el
-paketet (vilket är det egna uppströms eftersom det här är ett inbyggt Debian-paket) innehåller lägen för att redigera .deb
filer och för att redigera Debians ändringsloggar. Emacs kan användas interaktivt eller skriptas.
Kommentarer
- Du kan också använda omkopplaren
-e
fpm för att ändra kontrollfilen:fpm -e -s deb -t deb ../old.deb
. Detta öppnar kontrollfilen i din redigerare. - btw,
fakeroot bash
och försök att utfärda kommandon fungerar inte när det gäller ägande, ochar
-metoden är otroligt snabb för stora deb-filer! - Tack. Detta var användbart. Med
dpkg-deb -R
behölls lägena ochdpkg-deb -b
återställdeuid:gid
för de extraherade filerna till0:0
. Behövde ' inte fakeroot (jag antar att det kan finnas problem om det fanns inställda {u, g} id-filer i arkivet men det var inte ' t fallet i min situation. - @PSkocik Inte bara setxid-filer, även t.ex. filer och kataloger under
/etc
eller/var
som behöver tillhöra en viss grupp. - Tack för det fantastiska svaret. Finns det ett sätt att säkerställa att det ombyggda paketet jämfört med originalpaketet har samma md5sum?
Svar
Du kan använda fpm med --after-install
alternativet att ersätta postinst
-skriptet, så här:
fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
Kommentarer
- Så här installerar du fpm på Debian / Ubuntu: sudo apt-get install ruby-dev build-essential; sudo gem install fpm
Svar
Om du bara vill extrahera filer från en .deb fi le, 7-Zip är bekvämt. 7-Zip stöder ”ar” -filer för ”endast uppackning”. (Du behöver inte byta namn på filen; den öppnar * .deb som ”ar” och visar ”data.tar” inuti.)
Kommentarer
- Välkommen till sajten och tack för ditt bidrag.Observera att OP specifikt frågade för " packa upp DEB … och packa om DEB ". Kanske kan du redigera ditt inlägg för att ta itu med det ämnet också.
apt install mc
) – tryck bara på enter på en deb-fil