Aanmaken van configuratiebestanden in /etc in Debian pakketten
Ik werk momenteel aan een bijgewerkte picockpit-client versie, die extra configuratiebestanden moet toevoegen in /etc/picockpit-client voor de individuele modules (PiDoctor & PiControl).
picockpit-client is een Raspbian pakket voor picockpit.com, dat het Web platform verbindt met uw individuele Raspberry Pi.
Aangezien Raspbian gebaseerd is op Debian, geldt de volgende informatie voor de algemene verpakking voor Debian en afgeleiden (bv. Ubuntu).
dh-virtualenv
Ik beveel mijn ander artikel over Debian verpakking als een inleiding en aanvullend materiaal, voor het geval je geïnteresseerd bent in het verpakken van Python toepassingen.
In dit artikel zal ik algemene concepten met betrekking tot packaging bespreken, en specifiek het installeren van bestanden in /etc/
Een opmerking vooraf: Het "ingangspunt" om een pakket te bouwen is de makefile debian/regels.
En u kunt pakketten bouwen met het volgende commando:
dpkg-buildpackage -uc -us -b
Dit commando wordt uitgevoerd vanuit de bovenste directory van uw pakket, niet de debian/ directory.
Basisoverzicht
U kunt een mappenstructuur zien die nodig is voor een Debian pakket (in de map picockpit-client-package).
Het belangrijkste, het bevat een map debian, die verschillende configuratiebestanden bevat die gebruikt worden om het pakket te bouwen.
Deze bestandsindeling wordt gebruikt om het pakket te bouwen met debhelper, die de meeste pakketten gebruiken omdat het veel taken automatiseert.
changelog
Dit bestand bevat changelog informatie (voor het debian pakket). Het wordt gebruikt om de versie van het pakket in te stellen.
Voorbeeld inhoud:
Merk op dat inspringen met spaties noodzakelijk is (twee spaties voor het * symbool, één spatie voor het - symbool)
In mijn voorbeeld is de nieuwste pakketversie (vermelding bovenaan) 0.18.5
compat
Dit bestand bevat een nummer gevolgd door een nieuwe regel:
Dit is de versie van debhelper waar uw toepassing compatibel mee is. (Vanaf versie 12 kan dit ook gespecificeerd worden in debian/control, maar het zal nog steeds ondersteund worden in debian/compat voor achterwaartse compatibiliteit - zie dit manpagina)
controle
Dit bestand wordt gebruikt om afhankelijkheden, de naam van het pakket, en andere relevante meta-gegevens van het pakket te verstrekken.
auteursrecht
Dit bestand bevat copyright informatie voor uw pakket.
.installeren
In mijn geval heet het bestand picockpit-client.install omdat mijn pakket het picockpit-client pakket is.
Dit bestand wordt geëvalueerd door dh_install (dat deel uitmaakt van debhelper). Het kopieert een bestand of meerdere bestanden naar een directory in het pakket (om later in deze absolute systeemlocatie te worden geïnstalleerd).
In dit geval, wil ik het bestand etc/dinosaur/dinosaur.cfg te installeren in /etc/dinosaur, als /etc/dinosaur/dinosaur.cfg
Een probleem dat ik tegenkwam bij het onderzoeken van dit onderwerp is te begrijpen, waar ik etc/dinosaur/dinosaur.cfg moet plaatsen, ten opzichte van picockpit-client.install.
Het is belangrijk om te weten in welke zoeklocaties dh_install zoekt naar deze bestanden.
Hier is het antwoord:
Standaard zoekt het in "." en "debian/tmp".
"." is de map waarin de debian map zich bevindt.
Let daarom op de mappenstructuur:
Dus, zoals je ziet, "etc" is op hetzelfde map niveau als "debian". Merk op dat ik dit een willekeurige naam had kunnen geven, aangezien ik de locatie opgeef in picockpit-client.install:
etc/dinosaur/dinosaur.cfg etc/dinosaur
Ik zou dit kunnen wijzigen in gewoon dinosaur.cfg, dan moet dinosaur.cfg in dezelfde bovenliggende map staan als de debian map.
Zie verder hieronder voor meer informatie over de speciale rol van bestanden die in /etc gaan, en een belangrijke dh_install debugtip.
.links
Dit zal symlinks opzetten, bijvoorbeeld om uw toepassing toe te voegen aan het systeempad waarin naar binaire bestanden wordt gezocht:
.postinst
Een script dat na de installatie wordt uitgevoerd. set -e is belangrijk in dit script, het moet ook 0 teruggeven om succes aan te geven (zodat de installatie van het pakket kan worden voltooid).
Ik heb de standaard van een sjabloon:
.service
Dit is een systemd service entry die moet worden toegevoegd voor uw applicatie. Ik heb, bijvoorbeeld:
.triggers
Ik weet niet helemaal zeker waar dit voor is; Bij mij ziet het er zo uit (en werkt het):
regels
regels is een makefile dat gebruikt wordt om het pakket te bouwen. Dit zal variëren, afhankelijk van wat voor soort pakket je bouwt. Ik reproduceer mijn regels bestand hier voor uw gemak.
Zoals u kunt zien, gebruikt het dh_virtualenvis een oplossing om virtuele omgevingen voor Python-code te creëren (zodat incompatibele pakketten naast elkaar op hetzelfde systeem kunnen bestaan, en u de omgeving kunt controleren waarin u ze implementeert).
Als u geïnteresseerd bent in dh_virtualenv, lees dan mijn artikel over hoe Python pakketten te verpakken voor Raspbian met dh_virtualenv.
#!/usr/bin/make -f
#
# Debian pakket bouwen met https://github.com/spotify/dh-virtualenv
#
# De onderstaande doelen maken een schone kopie van de werkdir via
# met behulp van "sdist", anders gaat "pip" op hol bij het installeren vanaf
# sourcedir ".", omdat dat de debian build fase bevat,
# en er volgt een recursieve explosie wanneer symlinks worden gevolgd.
#
# Het zorgt er ook voor dat je MANIFEST compleet is en op zijn minst
# alle bestanden die nodig zijn voor een release build.# Verhoog trace logging, zie debhelper(7) (uncomment om in te schakelen)
#DH_VERBOSE=1exporteren 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)
VERSIE=$(shell $(SNAKE) setup.py -version)
SDIST_DIR=debian/$(PACKAGE)-$(VERSIE)schoon:
test ! -d dist || rm -rf dist
test ! -d $(SDIST_DIR) || rm -rf $(SDIST_DIR)
dh $@ $(DH_VENV_ARGS)build-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 .
Merk op dat WordPress de neiging heeft om de syntax van code te verknoeien, dus gebruik dit alleen als een ruwe gids, niet om te kopiëren en te plakken!
Meer informatie over /etc, en dh_install
Belangrijke sidenote / bugfix
Ik heb veel tijd besteed aan het debuggen van het volgende probleem:
dh_install: Kan (geen overeenkomsten vinden voor) "etc/dinosaur/dinosaur.cfg" (geprobeerd in debian/picockpit-client-0.18.5, debian/tmp)
dh_install: picockpit-client mist bestanden: etc/dinosaur/dinosaur.cfg
dh_install: bestanden ontbreken, afbreken
Dit probleem heeft te maken met een "verkeerde" invoer in debian/regels
Zoals u hier kunt zien, wordt in deze (voor beginners) nogal overweldigende en cryptische syntaxis, een parameter genaamd -sourcedir ingesteld voor het dh commando op de build-arch en % entries:
In de dh_install documentatiekunnen we lezen dat deze parameter configureert in welke bron-directory naar bestanden moet worden gezocht voor de installatie.
Aangezien dit was ingesteld in mijn debian/regels dh_install zocht in debian/picockpit-client-0.18.5 en debian/tmp - maar niet in de top level directory.
De oplossing is simpel:
dh $@ $(DH_VENV_ARGS) -sourcedir .
Ik geef gewoon "." door als mapnaam aan -sourcedir
Let op: het doorgeven van twee sourcedir entries zal niet werken zoals verwacht:
in dit geval wordt de eerste vermelding overschreven:
Dus alleen "." wordt gecontroleerd, en de directory die in $(SDIST_DIR) wordt doorgegeven niet.
etc is speciaal
dh_install behandelt bestanden die in etc geïnstalleerd moeten worden als zgn. conffiles.
Dit wordt automatisch bepaald, u hoeft hiervoor geen bijkomende configuratie toe te voegen (voeg gewoon het configuratiebestand toe als een lijn in uw .install bestand).
Om het nog eens te zeggen: als je debhelper gebruikt voor je verpakking, doe je niet nodig om de conffiles bestand in de debian directory handmatig. debhelper zal het voor je doen.
dpkg beheert deze configuratiebestanden, en zorgt ervoor dat de gebruikersconfiguratie bewaard blijft tussen pakketupdates, en bij eenvoudige pakketverwijdering.
Lees dit prachtige overzicht over wat conffiles betekenen voor gebruikers door Raphael Hertzog.
Laten we zeggen dat ik mijn pakket heb geïnstalleerd (met een fictieve /etc/dinosaur/dinosaur.cfg ).
Ik heb dan een extra entry "New Dino adventures" toegevoegd in /etc/dinosaur/dinosaur.cfg
Als ik gewoon het pakket verwijder:
apt-get remove picockpit-client
Dan wordt het pakket verwijderd, maar het configuratiebestand blijft achter:
Om ook van het gewijzigde configuratiebestand af te komen, moeten we het pakket zuiveren:
apt-get purge picockpit-client
Het zal je informeren over wat het aan het doen is: "Configuratiebestanden aan het wissen voor picockpit-client (0.18.5) ..."
Opmerking: u hoeft het configuratiebestand niet te wijzigen om het achter te laten als u het pakket verwijdert. Een ongewijzigd bestand zal ook achterblijven.
OK, laten we nu zeggen dat u het bestand gewijzigd hebt en op het punt staat om het pakket te upgraden of opnieuw te installeren:
In dat geval blijft uw gewijzigde versie behouden (of wordt u daarom gevraagd):
De versies van de config-bestanden, en op welke versie uw wijzigingen zijn gebaseerd, stammen uit MD5-sommen.
U kunt deze md5sums controleren door:
dpkg -status picockpit-client
Zoals u kunt zien, wordt in de Conffiles sectie het bestand /etc/dinosaur/dinosaur.cfg getoond met zijn originele MD5 som.
dpkg kan de MD5 som vergelijken tussen upgrades van het pakket, en zien of de versie van de onderhouder verandert.
Indien u het originele configuratiebestand niet wijzigt (als systeemgebruiker), zal de nieuwe versie van de onderhouder geïnstalleerd worden.
Als beide hun bestanden hebben gewijzigd, wordt u gevraagd een keuze te maken.
Referenties
- debhelper manpagina (inclusief een lijst van debhelper-commando's dh_xx)
- Raphael Hertzog's informatie over conffiles
- 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
Voor 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 (een voorbeeld dat ook een .install bestand bevat)