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
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:
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:
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
Diese Datei wird verwendet, um Abhängigkeiten, Paketnamen und andere relevante Paket-Metadaten anzugeben.
Copyright
Diese Datei enthält Copyright-Informationen für Ihr Paket.
.install
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:
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:
.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:
.Dienst
Dies ist ein systemd-Diensteintrag, der für Ihre Anwendung hinzugefügt werden muss. Ich habe zum Beispiel:
.Auslöser
Ich bin mir nicht ganz sicher, wofür das ist; bei mir sieht es so aus (und funktioniert):
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=1export 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
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:
In der dh_install Dokumentationkönnen wir ablesen, dass dieser Parameter konfiguriert, in welchem Quellverzeichnis nach Dateien für die Installation gesucht werden soll.
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:
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:
in diesem Fall wird der erste Eintrag überschrieben:
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
Wenn ich das Paket einfach entferne:
apt-get remove picockpit-client
Dann wird das Paket entfernt, aber die Konfigurationsdatei bleibt zurück:
Um auch die geänderte Konfigurationsdatei loszuwerden, müssen wir das Paket bereinigen:
apt-get purge picockpit-client
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:
In diesem Fall bleibt Ihre geänderte Version erhalten (oder Sie werden dazu aufgefordert):
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
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
- debhelper manpage (einschließlich einer Liste der Debhelper-Befehle dh_xx)
- Raphael Hertzogs Informationen über Konfesseln
- https://www.debian.org/doc/manuals/maint-guide/dother.en.html
- https://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf
- https://vincent.bernat.ch/en/blog/2019-pragmatic-debian-packaging
- https://manpages.debian.org/buster/debhelper/dh_installdeb.1.en.html
Für dh_virtualenv:
- https://pi3g.com/2019/04/19/packaging-python-projects-for-debian-raspbian-with-dh-virtualenv/
- https://dh-virtualenv.readthedocs.io/en/1.1/
- https://github.com/1and1/debianized-jupyterhub (ein Beispiel, das auch eine .install-Datei enthält)