DEB einfach auspacken, postinst bearbeiten und DEB neu packen

129

Ich versuche, Intels OpenCL SDK zu installieren, aber die DEB-Dateien sind fehlerhafte Konvertierungen von RPM (siehe hier für die Neugierigen). Ich muss das postinstSkript in der DEB bearbeiten, die sie bereitstellen.

Wie kann ich eine vorhandene DEB nehmen, den Inhalt (einschließlich der Steuerinformationen) extrahieren und ihn später neu packen, um eine neue DEB zu erstellen? Ich bearbeite nur Dateien. Es werden keine Dateien hinzugefügt oder entfernt.

John Jumper
quelle

Antworten:

202

Der primäre Befehl zum Manipulieren von deb-Paketen lautet dpkg-deb.

Um das Paket zu entpacken, erstellen Sie ein leeres Verzeichnis, wechseln Sie zu diesem und führen Sie es aus dpkg-deb, um die Steuerinformationen und die Paketdateien zu extrahieren. Verwenden Sie dpkg-deb -b, um das Paket neu zu erstellen.

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

Beachten Sie, dass die Berechtigungen und der Besitz der Dateien in der Extraktionsphase beschädigt werden, es sei denn, Ihr Skript wird als Root ausgeführt. Eine Möglichkeit, dies zu vermeiden, besteht darin, Ihr Skript unter auszuführen fakeroot. Beachten Sie, dass Sie die gesamte Sequenz ausführen müssen fakeroot, nicht jede für sich dpkg-deb, da es der fakerootProzess ist, der die Berechtigungen der Dateien speichert, die nicht so erstellt werden können, wie sie sind.

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

Anstatt mit Berechtigungen herumzuspielen, können Sie das Datenarchiv intakt halten und nur das Steuerarchiv ändern. dpkg-debbietet keine Möglichkeit, dies zu tun. Glücklicherweise haben Deb-Pakete ein Standardformat: Sie sind arArchive. So können Sie ardas Kontrollarchiv extrahieren, seine Dateien ändern und arerneut verwenden, um das Kontrollarchiv durch eine neue Version zu ersetzen.

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

Sie sollten einen Changelog-Eintrag hinzufügen und die Versionsnummer ändern, wenn Sie etwas im Paket ändern. Die Infrastruktur zur Manipulation von Debian-Paketen geht davon aus, dass zwei Pakete mit demselben Namen und derselben Version dasselbe Paket sind. Fügen Sie dem debian_revision- Teil am Ende der Versionsnummer ein Suffix hinzu . aus sortierungsgründen sollte das suffix mit ~zB beginnen 1.2.3-4.1werden 1.2.3-4.1~johnjumper1.

Anstelle von Shell-Tools können Sie auch Emacs verwenden. Das dpkg-dev-elPaket (welches sein eigenes Upstream ist, da dies ein natives Debian-Paket ist) enthält Modi zum Bearbeiten von .debDateien und zum Bearbeiten von Debian-Änderungsprotokollen. Emacs können interaktiv oder als Skript verwendet werden.

Gilles
quelle
4
Sie können auch die Verwendung -eSchalter von fpm , um die Steuerdatei zu ändern: fpm -e -s deb -t deb ../old.deb. Dadurch wird die Steuerdatei in Ihrem Editor geöffnet.
Artefacto
1
Übrigens, fakeroot bashund das Ausgeben von Befehlen funktioniert in Bezug auf den Besitz nicht, und die arMethode ist unglaublich schnell für große Deb-Dateien!
Aquarius Power
1
Vielen Dank. Das war nützlich. Dabei wurden dpkg-deb -Rdie Modi beibehalten und dpkg-deb -bdie uid:gidder extrahierten Dateien auf zurückgesetzt 0:0. Fakeroot nicht nötig (Ich stelle mir vor, es könnte Probleme geben, wenn sich {u, g} id-Dateien im Archiv befinden, aber das war in meiner Situation nicht der Fall.
PSkocik
2
@PSkocik Nicht nur setxid Dateien, zB auch Dateien und Verzeichnisse unter /etcoder /vardass Bedarf an einer bestimmten Gruppe gehören.
Gilles
8

Sie können fpm mit der folgenden --after-installOption verwenden, um das postinstSkript zu ersetzen :

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
Juancho
quelle
2
Um fpm unter Debian / Ubuntu zu installieren: sudo apt-get installiere ruby-dev build-essential; sudo gem install fpm
Craig S. Anderson