Erstellen von Konfigurationsdateien in /etc in Debian-Paketen

Ich arbeite derzeit an einer aktualisierten picockpit-client Version, die zusätzliche Konfigurationsdateien in /etc/picockpit-client für die einzelnen Module (PiDoctor & PiControl) hinzufügen soll.

picockpit-client ist ein Raspbian-Paket für picockpit.com, das die Web-Plattform mit Ihrem individuellen Raspberry Pi verbindet.

Da Raspbian auf Debian basiert, gelten die folgenden Informationen auch für die allgemeine Paketierung von Debian und Derivaten (z.B. Ubuntu).

dh-virtualenv

Ich empfehle meine anderer Artikel über Debian-Pakete als Einführung und zusätzliches Material, falls Sie daran interessiert sind, Python-Anwendungen zu paketieren.

In diesem Artikel werde ich allgemeine Konzepte im Zusammenhang mit der Paketierung besprechen, insbesondere die Installation von Dateien in /etc/

Eine Anmerkung vorweg: Der "Einstiegspunkt" für die Erstellung eines Pakets ist das makefile debian/regeln.

Und Sie können Pakete mit dem folgenden Befehl erstellen:

dpkg-buildpackage -uc -us -b

Dieser Befehl wird aus dem obersten Verzeichnis Ihres Pakets ausgeführt, nicht aus dem Verzeichnis debian/.

Grundlegender Überblick

Bild

Sie sehen eine Ordnerstruktur, die für ein Debian-Paket erforderlich ist (enthalten im Ordner picockpit-client-package).

Am wichtigsten ist, dass er einen Ordner enthält debiandie mehrere Konfigurationsdateien enthält, die zur Erstellung des Pakets verwendet werden.

Dieses Dateilayout wird verwendet, um das Paket mit debhelper, das die meisten Pakete verwenden, weil es viele Aufgaben automatisiert.

Änderungsprotokoll

Diese Datei enthält Changelog-Informationen (für das Debian-Paket). Sie wird verwendet, um die Version des Pakets festzulegen.

Beispielhafte Inhalte:

Bild

Beachten Sie, dass eine Einrückung durch Leerzeichen erforderlich ist (zwei Leerzeichen vor dem Symbol *, ein Leerzeichen vor dem Symbol -)

In meinem Beispiel ist die neueste Paketversion (Eintrag ganz oben) 0.18.5

kompat

Diese Datei enthält eine Nummer, gefolgt von einem Zeilenumbruch:

Bild

Dies ist die Version von debhelper mit dem Ihre Anwendung kompatibel ist. (Ab Version 12 kann dies auch in debian/control angegeben werden, wird aber aus Gründen der Abwärtskompatibilität weiterhin in debian/compat unterstützt - siehe dies Manpage)

Kontrolle

Bild

Diese Datei wird verwendet, um Abhängigkeiten, Paketnamen und andere relevante Paket-Metadaten anzugeben.

Copyright

Bild

Diese Datei enthält Copyright-Informationen für Ihr Paket.

.install

Bild

In meinem Fall heißt die Datei picockpit-client.install, da mein Paket das picockpit-client Paket ist.

Diese Datei wird ausgewertet von dh_install (das Teil von debhelper ist). Er kopiert eine Datei oder mehrere Dateien in ein Verzeichnis des Pakets (das später an diesem absoluten Systemort installiert werden soll).

In diesem Fall möchte ich die Datei etc/dinosaurier/dinosaurier.cfg die in /etc/dinosaur installiert werden soll, als /etc/dinosaur/dinosaur.cfg

Ein Problem, auf das ich bei meinen Recherchen zu diesem Thema gestoßen bin, ist die Frage, wo etc/dinosaur/dinosaur.cfg im Verhältnis zu picockpit-client.install platziert werden soll.

Es ist wichtig zu wissen in welchen Suchorten dh_install sucht nach diesen Dateien.

Hier ist die Antwort:

Standardmäßig sucht es in "." und "debian/tmp".

"." ist das Verzeichnis, in dem sich der Debian-Ordner befindet.

Beachten Sie daher die Ordnerstruktur:

Bild

Wie Sie sehen, befindet sich also "etc" auf derselben Ordnerebene wie "debian". Bitte beachten Sie, dass ich diesen Ordner beliebig hätte benennen können, da ich den Ort in picockpit-client.install festlege:

etc/dinosaurier/dinosaurier.cfg etc/dinosaurier

Ich könnte das so ändern, dass es einfach dinosaur.cfg ist, dann muss dinosaur.cfg im gleichen übergeordneten Verzeichnis wie der Debian-Ordner liegen.

Weiter unten finden Sie weitere Informationen über die besondere Rolle von Dateien, die in /etc abgelegt werden, sowie einen wichtigen Tipp zur Fehlersuche bei dh_install.

.Links

Dadurch werden Symlinks eingerichtet, z. B. um Ihre Anwendung in den Systempfad aufzunehmen, in dem nach Binärdateien gesucht wird:

Bild

.postinst

Ein Skript, das nach der Installation ausgeführt wird. set -e ist in diesem Skript wichtig, es muss auch 0 zurückgeben, um den Erfolg anzuzeigen (so dass die Paketinstallation abgeschlossen werden kann).

Ich habe den Standard aus einer Vorlage:

Bild

.Dienst

Dies ist ein systemd-Diensteintrag, der für Ihre Anwendung hinzugefügt werden muss. Ich habe zum Beispiel:

Bild

.Auslöser

Ich bin mir nicht ganz sicher, wofür das ist; bei mir sieht es so aus (und funktioniert):

Bild

Regeln

rules ist ein makefile, das zum Bauen des Pakets verwendet wird. Dies hängt von der Art des Pakets ab, das Sie erstellen. Ich reproduziere hier meine rules-Datei, um Ihnen die Arbeit zu erleichtern.

Wie Sie sehen können, verwendet es dh_virtualenvEs handelt sich dabei um eine Lösung zur Erstellung virtueller Umgebungen für Python-Code (die es ermöglicht, dass inkompatible Pakete auf demselben System koexistieren und Sie die Umgebung kontrollieren können, in der Sie sie einsetzen).

Wenn Sie an dh_virtualenv interessiert sind, lesen Sie meinen Artikel über wie man Python-Pakete für Raspbian mit dh_virtualenv packt.

#!/usr/bin/make -f
#
# Bauen Sie das Debian-Paket mit https://github.com/spotify/dh-virtualenv
#
# Die folgenden Ziele erstellen eine saubere Kopie des Arbeitsverzeichnisses über
# mit "sdist", sonst geht "pip" kaputt, wenn man von
# sourcedir ".", da dies die Debian-Build-Phase beinhaltet,
# und es kommt zu einer rekursiven Explosion, wenn Symlinks verfolgt werden.
#
# Es stellt auch sicher, dass Ihr MANIFEST vollständig ist und mindestens Folgendes abdeckt
# alle Dateien, die für ein Release-Build benötigt werden.

# Erhöht die Trace-Protokollierung, siehe debhelper(7) (zum Aktivieren nicht kommentieren)
#DH_VERBOSE=1

export DH_VIRTUALENV_INSTALL_ROOT=/usr/share
SNAKE=/usr/bin/python3
EXTRA_REQUIREMENTS=-preinstall "setuptools>=17.1,=7" -preinstall "wheel" -preinstall "no-manylinux1"
DH_VENV_ARGS=-with python-virtualenv -setuptools -python $(SNAKE) $(EXTRA_REQUIREMENTS) #-v
PACKAGE=$(shell dh_listpackages)
VERSION=$(shell $(SNAKE) setup.py -version)
SDIST_DIR=debian/$(PACKAGE)-$(VERSION)

sauber:
     test ! -d dist || rm -rf dist
     test ! -d $(SDIST_DIR) || rm -rf $(SDIST_DIR)
     dh $@ $(DH_VENV_ARGS)

bauen-arch:
     $(SNAKE) setup.py sdist -formats tar
     mkdir -p $(SDIST_DIR)
     tar -x -C $(SDIST_DIR) -strip-components=1 -exclude '*.egg-info' -f dist/*.tar
     #dh $@ $(DH_VENV_ARGS) -sourcedir $(SDIST_DIR) -sourcedir .
     dh $@ $(DH_VENV_ARGS) -sourcedir .

%:
     #dh $@ $(DH_VENV_ARGS) -sourcedir $(SDIST_DIR) -sourcedir .
     dh $@ $(DH_VENV_ARGS) -sourcedir .

Bitte beachten Sie, dass WordPress dazu neigt, die Syntax des Codes durcheinander zu bringen, also verwenden Sie dies nur als grobe Richtlinie, nicht zum Kopieren und Einfügen!

Weitere Informationen über /etc und dh_install

Wichtige Nebenbemerkung / Fehlerbehebung

Ich habe viel Zeit damit verbracht, das folgende Problem zu beheben:

dh_install: Kann nicht gefunden werden (keine Treffer für) "etc/dinosaur/dinosaur.cfg" (versucht in debian/picockpit-client-0.18.5, debian/tmp)

dh_install: picockpit-client fehlende Dateien: etc/dinosaur/dinosaur.cfg
dh_install: fehlende Dateien, Abbruch

Dieses Problem steht im Zusammenhang mit einem "falschen" Eintrag in debian/regeln

Bild

wie Sie hier sehen können, wird in dieser (für Anfänger) ziemlich überwältigenden und kryptischen Syntax ein Parameter namens -sourcedir für den dh-Befehl bei den Einträgen build-arch und % gesetzt:

Bild

In der dh_install Dokumentationkönnen wir ablesen, dass dieser Parameter konfiguriert, in welchem Quellverzeichnis nach Dateien für die Installation gesucht werden soll.

Bild

Da dies in meinem debian/regeln dh_install hat in debian/picockpit-client-0.18.5 und debian/tmp gesucht - aber nicht im obersten Verzeichnis.

Die Lösung ist einfach:

Bild

dh $@ $(DH_VENV_ARGS) -sourcedir .

Ich übergebe einfach "." als Verzeichnisname an -sourcedir

Bitte beachten Sie, dass die Übergabe von zwei sourcedir-Einträgen nicht wie erwartet funktionieren wird:

Bild

in diesem Fall wird der erste Eintrag überschrieben:

Bild

Es wird also nur "." geprüft, nicht aber das in $(SDIST_DIR) übergebene Verzeichnis.

usw. ist besonders

dh_install behandelt die in etc zu installierenden Dateien als sogenannte conffiles.

Dies wird automatisch festgelegt, Sie müssen dafür keine zusätzliche Konfiguration vornehmen (fügen Sie die Konfigurationsdatei einfach als Zeile in Ihre .install-Datei ein).

Um es noch einmal zu sagen: Wenn Sie debhelper für Ihr Paket verwenden, tun Sie nicht müssen die conffiles Datei im Debian-Verzeichnis manuell zu erstellen. debhelper wird dies für Sie tun.

dpkg verwaltet diese Konfigurationsdateien und stellt sicher, dass die Benutzerkonfiguration zwischen Paketaktualisierungen und beim einfachen Entfernen von Paketen gespeichert wird.

Lesen Sie diesen wunderbaren Überblick über die Bedeutung der Konfessionen für die Nutzer von Raphael Hertzog.

Nehmen wir an, ich habe mein Paket installiert (mit einer fiktiven /etc/dinosaur/dinosaur.cfg ).

Ich habe dann einen zusätzlichen Eintrag "New Dino adventures" in /etc/dinosaur/dinosaur.cfg hinzugefügt

Bild

Wenn ich das Paket einfach entferne:

apt-get remove picockpit-client

Dann wird das Paket entfernt, aber die Konfigurationsdatei bleibt zurück:

Bild

Um auch die geänderte Konfigurationsdatei loszuwerden, müssen wir das Paket bereinigen:

apt-get purge picockpit-client

Bild

Es wird Sie darüber informieren, was es gerade tut: "Bereinigung der Konfigurationsdateien für picockpit-client (0.18.5) ..."

Hinweis: Sie müssen die Konfigurationsdatei nicht ändern, damit sie erhalten bleibt, wenn Sie das Paket entfernen. Eine unveränderte Datei bleibt ebenfalls erhalten.

OK, nun nehmen wir an, Sie haben die Datei geändert und wollen das Paket aktualisieren oder neu installieren:

Bild

In diesem Fall bleibt Ihre geänderte Version erhalten (oder Sie werden dazu aufgefordert):

Bild

Die Versionen der Konfigurationsdateien und die Version, auf der Ihre Änderungen basieren, ergeben sich aus den MD5-Summen.

Sie können diese md5-Summen überprüfen, indem Sie:

dpkg -status picockpit-client

Bild

Wie Sie sehen können, wird im Abschnitt Conffiles die Datei /etc/dinosaur/dinosaur.cfg mit ihrer ursprünglichen MD5-Summe angezeigt.

dpkg kann die MD5-Summe zwischen Upgrades des Pakets vergleichen und feststellen, ob sich die Version des Betreuers ändert.

Falls Sie die ursprüngliche Konfigurationsdatei (als Systembenutzer) nicht ändern, wird die neue Version des Maintainers installiert.

Wenn beide ihre Dateien geändert haben, werden Sie aufgefordert, eine Auswahl zu treffen.

Referenzen

Für dh_virtualenv: