3 Stimmen

Meine Deb-Datei entfernt /opt

Meine deb-Datei installiert sich unter /opt/myCompany/myProgram. Wenn ich das Paket mit dpkg -P myProgram purgiere, wird alles entfernt - sogar /opt (wenn mein Paket das einzige mit Dateien in /opt ist). Wie kann ich verhindern, dass der /opt-Ordner während einer Purgierung gelöscht wird?

Ich habe versucht zu überprüfen, ob /opt im postrm existiert und es hinzuzufügen, wenn es nicht existiert, aber ohne Erfolg... Es scheint, dass der Ordner nach Ausführung des postrm-Skripts gelöscht wird. Derzeit füge ich eine versteckte Datei in /opt mit postinst hinzu - dies verhindert, dass opt entfernt wird, fühlt sich jedoch wie ein Hack an - es sollte einen besseren Weg geben.

Danke,

3voto

Rob Punkte 313

Diese Frage wurde vor fast 7 Jahren gestellt, aber ich bin darauf gestoßen bei einer Google-Suche nach einem ähnlichen Problem und dachte, ich würde trotzdem eine Antwort posten, da die Frage eine Antwort hat, die nicht wirklich eine Lösung ist.

Die folgende Frage ist ebenfalls relevant (bezieht sich jedoch auf /usr/local anstelle von /opt) und kann ähnlich gelöst werden:

dpkg: warning: while removing directory /usr/local not empty so not removed

Ich konnte dieses Problem mit folgender Technik lösen.

Ein Debian-Paket (.deb) ist nur eine "ar" Archivdatei mit 3 Mitgliedern:

$ ar t package.deb
debian-binary
control.tar.gz
data.tar.xz

Das data.tar.xz-Mitglied kann je nach Alter des *.deb auch data.tar.gz genannt werden. Passen Sie die Befehle entsprechend an.

Die Dateien, die auf das Zielsystem installiert werden, sind im data.tar.xz-Mitglied enthalten. Wenn Sie das data.tar.xz-Mitglied extrahieren und seine Inhalte auflisten, sehen Sie beispielsweise Folgendes.

$ ar p package.deb data.tar.xz | unzx -c | tar t
./
./opt/
./opt/myCompany/
./opt/myCompany/myProgram

Das Entfernen des ./opt/-Verzeichnismitglieds (aber nicht seiner Inhalte) aus der data.tar.xz-Datei verhindert, dass dpkg versucht, das /opt-Verzeichnis zu entfernen, wenn das Paket deinstalliert wird.

$ ar x package.deb data.tar.xz
$ unzx data.tar.xz
$ tar --delete --occurrence -f data.tar ./opt/
$ #tar --delete --occurrence -f data.tar ./usr/local/

Jetzt sollten Sie bei Auflistung der Inhalte der data.tar-Datei Folgendes sehen:

$ tar tf data.tar
./
./opt/myCompany/
./opt/myCompany/myProgram
  • Beachten Sie, dass das ./opt/-Mitglied entfernt wurde.

Der letzte Schritt besteht darin, die data.tar-Datei neu zu komprimieren und das data.tar.xz-Mitglied im deb durch das modifizierte zu ersetzen.

Hier ist ein Beispiel für den vollständigen Vorgang zum Entfernen des ./opt/-Eintrags aus der tar-Archivdatei und zum Ersetzen der tar-Archivdatei im deb durch die modifizierte:

$ ar x package.deb data.tar.xz
$ unzx data.tar.xz
$ tar --delete --occurrence -f data.tar ./opt/
$ xz data.tar
$ ar r package.deb data.tar.xz
$ rm data.tar.xz

Jetzt wird dpkg beim Entfernen/Deinstallieren des deb nicht versuchen, das /opt-Verzeichnis zu entfernen.

1voto

favoretti Punkte 28679

Das ist nur Debian. Immer wenn es ein Paket aus einem nicht-debianischen Standardverzeichnis entfernt (wie z.B. /opt in Ihrem Fall) und keine Dateien mehr in diesem Verzeichnis vorhanden sind, wird dpkg versuchen, dieses Verzeichnis zu entfernen.

Wenn sich zum Zeitpunkt der Entfernung einige andere Dateien in /opt befinden, erhalten Sie eine Meldung in der Art von "/opt ist nicht leer; nicht entfernt" und das war's.

Ein weiterer "hacky" Ansatz wäre, die Neu-Erstellung von /opt in postrm hinzuzufügen, aber es ist nicht viel sauberer als Ihre versteckte Datei :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X