Łatwo rozpakuj DEB, edytuj postinst i ponownie zapakuj DEB


129

Próbuję zainstalować OpenCL SDK Intela, ale pliki DEB są wadliwymi konwersjami z RPM (patrz tutaj dla ciekawskich). Muszę edytować postinstskrypt w dostarczonym przez nich języku DEB.

Jak mogę pobrać istniejący DEB, wyodrębnić zawartość (w tym informacje sterujące), a następnie ponownie zapakować zawartość, aby utworzyć nową DEB? Będę edytować tylko pliki, żadne pliki nie zostaną dodane ani usunięte.

Odpowiedzi:


202

Podstawowym poleceniem do manipulowania pakietami deb jest dpkg-deb.

Aby rozpakować pakiet, utwórz pusty katalog i przejdź do niego, a następnie uruchom, dpkg-debaby wyodrębnić informacje sterujące i pliki pakietu. Użyj, dpkg-deb -baby przebudować pakiet.

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

Uwaga: chyba że skrypt działa jako root, uprawnienia i prawa własności plików zostaną uszkodzone na etapie wyodrębniania. Jednym ze sposobów uniknięcia tego jest uruchomienie skryptu fakeroot. Zauważ, że musisz uruchomić całą sekwencję fakeroot, a nie każdą dpkg-debosobno, ponieważ jest to fakerootproces, który utrzymuje pamięć uprawnień plików, których nie można utworzyć takimi, jakie są.

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

Zamiast zadzierać z uprawnieniami, możesz zachować archiwum danych nienaruszone i zmodyfikować tylko archiwum kontrolne. dpkg-debnie zapewnia na to sposobu. Na szczęście pakiety deb są w standardowym formacie: są to ararchiwa. Możesz więc użyć ardo wyodrębnienia archiwum kontrolnego, zmodyfikować jego pliki i użyć arponownie, aby zastąpić archiwum kontrolne nową wersją.

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

Powinieneś dodać pozycję dziennika zmian i zmienić numer wersji, jeśli zmodyfikujesz cokolwiek w pakiecie. Infrastruktura do manipulowania pakietami Debian zakłada, że ​​jeśli dwa pakiety mają tę samą nazwę i wersję, są one tym samym pakietem. Dodaj przyrostek do części debian_revision na końcu numeru wersji; z powodów sortowania przyrostek powinien zaczynać się ~, np . 1.2.3-4.1staje 1.2.3-4.1~johnjumper1.

Zamiast używać narzędzi powłoki, możesz użyć Emacsa. dpkg-dev-elPakiet (który jest jego własny prąd, jak to jest rodowitym pakiet Debiana) zawiera tryby do edycji .debplików i edycję changelog Debiana. Emacsa można używać interaktywnie lub skryptowo.


4
Można również użyć -eprzełącznika z FPM zmienić plik kontrolny: fpm -e -s deb -t deb ../old.deb. Spowoduje to otwarcie pliku sterującego w edytorze.
Artefacto

1
btw fakeroot bashi próba wydania poleceń nie będzie działać w odniesieniu do własności, a armetoda jest niezwykle szybka w przypadku dużych plików deb!
Aquarius Power,

1
Dzięki. To było przydatne. Korzystanie dpkg-deb -Rz trybów zostało zachowane i dpkg-deb -bzresetuj uid:gidwyodrębnione pliki do 0:0. Nie potrzebowałem fakeroot (wyobrażam sobie, że mogą istnieć problemy, jeśli w archiwum są ustawione {u, g} pliki identyfikatora, ale w mojej sytuacji tak nie było.
PSkocik 16.08.18

2
@PSkocik Nie tylko pliki setxid, ale także np. Pliki i katalogi poniżej /etclub /varktóre muszą należeć do określonej grupy.
Gilles

8

Możesz użyć fpm z --after-installopcją zastąpienia postinstskryptu:

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

2
Aby zainstalować fpm na Debianie / Ubuntu: sudo apt-get install ruby-dev build-essential; sudo gem install fpm
Craig S. Anderson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.