Anleitung zum Erstellen von Debian-Paketen

Debian Package Creation Howto



1. Vorwort

Für eine Maschine verantwortlich zu sein bedeutet, sich sowohl um die Hardware als auch um die Softwarekomponenten zu kümmern. Wie man es im Alltag eines Systemadministrators sieht, ist es viel besser, Software als Softwarepaket zu installieren, anstatt eine Menge Quelldateien. Dies reduziert die Kosten für die ordnungsgemäße Wartung des Systems.

Pakete, die von Ihrem bevorzugten Distributor erhältlich sind, werden von einem Paketbetreuer validiert und überwacht. Er hat die Software getestet und versichert, dass sie zu den anderen in der Distribution verfügbaren Softwarepaketen passt. Außerdem wird das Paket mit einem GPG-Schlüssel vom Paketbetreuer signiert. Dies garantiert die Integrität des Pakets und zeigt Ihnen, dass das Paket von einer vertrauenswürdigen Quelle stammt.







Das Paketformat hängt von Ihrer Linux-Distribution ab. Ausgewählte Formate sind die folgenden:



deb

Pakete verwendet in: Debian GNU/Linux , Ubuntu , Armbian , Linux Mint , Knoppix



rpm

Pakete verwendet in: Roter Hut , Fedora , CentOS , OpenSuse





tgz and txz

Pakete verwendet in: Slackware

tar.xz

Pakete verwendet in: Arch Linux



Dieses Dokument erklärt kurz, wie man ein Paket für Debian GNU/Linux baut. Ausführliche Informationen über das Debian-Paketformat und die Tools zur Wartung eines `deb'-basierten Linux-Systems finden Sie im Debian-Paketverwaltungsbuch [dpmb] Um Pakete für Debian GNU/Linux zu bauen, sind diese Dokumente unerlässlich:

  • Das neue Debian-Betreuerhandbuch [dnmg]
  • Die Debian-Entwicklerreferenz [ddr]
  • Das Debian-Paket-Tutorial [kann]
  • Das Debian-Richtlinienhandbuch [dpm]

Das Paket, mit dem wir arbeiten werden, heißt `helloworld` und hat die Versionsnummer 0.1. Zu Demonstrationszwecken enthält es einfach ein einzelnes Python-Skript, das die berühmte Nachricht Hello, world! ausgibt:

#!/usr/bin/python print ('Hello, world!') 

2. Anforderungen

2.1. GPG-Schlüssel

Halten Sie als Schritt 1 Ihren GPG-Schlüssel bereit. Später wird der Schlüssel zum Signieren des Pakets benötigt. Denken Sie daran, dass nicht signierte Pakete nicht vertrauenswürdig sind und nicht Teil des Debian-Universums sein können.

Falls Sie noch keinen GPG-Schlüssel haben, erstellen Sie einen. Sie können die folgenden drei Schritte ausführen. Der erste Befehl generiert einen neuen Schlüssel, der zweite exportiert Ihren neuen Schlüssel in eine separate Datei und der dritte fügt den Schlüssel Ihrem persönlichen Schlüsselbund hinzu.

$ gpg --gen-key $ gpg -a --output ~/.gnupg/YOUR_NAME.gpg --export 'YOUR NAME' $ gpg --import ~/.gnupg/YOUR_NAME.gpg 

Achten Sie bei der Erstellung darauf, dass der angegebene Name _IHR NAME_ korrekt ist. Es ist üblich, eine Kombination aus Vor- und Nachname zu verwenden. Dieser Name muss dann im Paket genau gleich sein, wenn die `control`-Datei des Debian-Pakets erstellt wird. Weitere Informationen zu GPG finden Sie im GNU Privacy Handbook [gph].

2.2. Die Verpackungswerkzeugkette

Um ein Debian-Paket mit Quellcode zu erstellen, sind die folgenden Softwarepakete auf Ihrem System erforderlich:

  • bauwesentlich
  • autoconf
  • autom
  • autotools-dev
  • dh-machen
  • Debhelper
  • devscripts
  • Fakeroot
  • xutils
  • lintian
  • pbuilder

Als Benutzer `root` können Sie diese mit folgendem Befehl installieren:

# apt-get install build-essential autoconf automake autotools-dev dh-make debhelper devscripts fakeroot xutils lintian pbuilder 

2.3. Bereiten Sie die zu paketierende Software vor

Wir müssen ein Verzeichnis vorbereiten, um das Paket zu erstellen. Erstellen Sie ein Verzeichnis, um die Umgebung vorzubereiten, in der wir das Paket erstellen:

$ mkdir -p ~./build/helloworld/0.1 

Kopieren Sie das komprimierte Archiv `tar.gz` in das Verzeichnis:

$ cp helloworld-0.1.tar.gz ~./build/helloworld/0.1 

Wechseln Sie in das Verzeichnis und entpacken Sie das Paket:

$ cd ~./build/helloworld/0.1 ~/build/helloworld/0.1$ tar -xzf helloworld-0.1.tar.gz 

Das Verzeichnis enthält nun sowohl den Quellcode in einem separaten Verzeichnis als auch das komprimierte Archiv:

~/build/helloworld/0.1$ ls helloworld-0.1 helloworld-0.1.tar.gz 

3. Debianisierung

An dieser Stelle werden wir die Dateien hinzufügen, die für ein Debian-Paket spezifisch sind. Aus diesem Grund wird dieser Schritt als _Debianization_ der Software bezeichnet. Dies geschieht in mehreren Einzelschritten.

3.1 Bereiten Sie die Paketstruktur vor

Wechseln Sie in das Verzeichnis, das den gesamten Quellcode des Pakets enthält. In unserem Beispiel enthält das Paket die Datei `helloworld.py`, nur:

~$ cd build/helloworld/0.1/helloworld-0.1 ~/build/helloworld/0.1/helloworld-0.1$ ls helloworld.py 

Fügen wir die Dateien hinzu, die spezifisch für ein Debian-Paket sind. Das Werkzeug `dh_make` kommt ins Spiel. Der Schalter `-e` verwendet die angegebene Adresse als E-Mail-Adresse im Feld `Maintainer` der Datei `debian/control`. Verwenden Sie zum Erstellen des Pakets stattdessen Ihre eigene E-Mail-Adresse. Denken Sie daran, dieselbe E-Mail-Adresse zu verwenden, die Ihrem GPG-Schlüssel entspricht.

Der Schalter `-f` verwendet die angegebene Datei als ursprüngliches Quellarchiv und überspringt das Kopieren des aktuellen Programmbaums nach `program.orig`.

~/build/helloworld/0.1/helloworld-0.1$ dh_make -e [email protected] -f ../helloworld-0.1.tar.gz 

An der Eingabeaufforderung werden Sie aufgefordert, den Pakettyp auszuwählen, der erstellt werden soll. Um _single binary_ zu wählen, geben Sie `s` ein.

Type of package: single binary, indep binary, multiple binary, library, kernel module, kernel patch? [s/i/m/l/k/n] s Maintainer name : Frank Hofmann Email-Address : [email protected] Date : Sat, 04 Nov 2017 21:16:13 +0100 Package Name : helloworld Version : 0.1 License : blank Type of Package : Single Hit to confirm: Currently there is no top level Makefile. This may require additional tuning. Done. Please edit the files in the debian/ subdirectory now. You should also check that the helloworld Makefiles install into $DESTDIR and not in / . 

Dies führt zu einem Verzeichnis namens `debian`:

~/build/helloworld/0.1/helloworld-0.1$ ls debian helloworld.py 

Dieses Verzeichnis enthält alle paketspezifischen Dateien.

3.2. Passen Sie die Steuerdatei an

Die Datei `debian/control` hält die Abhängigkeiten, die _zum Bauen_ des Pakets benötigt werden. Mit dem Befehl `dpkg-depcheck -d ./configure` erhalten Sie eine Liste mit allen benötigten Paketen. In unserem Fall wird kein weiteres Paket benötigt, da Python eine interpretierte Sprache ist.

Als nächstes müssen wir die Datei `debian/control` bearbeiten und paketspezifische Werte hinzufügen. Für unser Beispiel sieht es wie folgt aus:

Source: helloworld Section: python Priority: optional Maintainer: Frank Hofmann < [email protected] > Build-Depends: debhelper (>= 9) Standards-Version: 3.9.5 Homepage: http://www.efho.de/ #Vcs-Git: git://anonscm.debian.org/collab-maint/helloworld.git #Vcs-Browser: http://anonscm.debian.org/?p=collab-maint/helloworld.git;a=summary Package: helloworld Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, python Description: Prints Hello World in Python Prints Hello World in Python 

3.3. Passen Sie die Copyright-Datei an

Die Datei `debian/copyright` enthält die Lizenzinformationen für das Softwarepaket. Es ist für die Veröffentlichung über die GNU Public License 2 (GPLv2) vorbereitet. Für unser Beispiel sieht es wie folgt aus:

Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: helloworld Source: http://www.efho.de/ Files: debian/* Copyright: 2017 Frank Hofmann < [email protected] > License: GPL-2+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . On Debian systems, the complete text of the GNU General Public License version 2 can be found in '/usr/share/common-licenses/GPL-2'. 

3.4. Passen Sie die Changelog-Datei an

Nach den Copyright-Informationen muss die Datei `debian/changelog` angepasst werden. In unserem Beispiel fügen wir die Information Erstveröffentlichung hinzu.

helloworld (0.1-1) unstable; urgency=low * Initial release -- Frank Hofmann < [email protected] > Sat, 04 Nov 2017 21:16:13 +0100 

Das ist alles, was wir bisher brauchen – jetzt können wir endlich das Paket bauen.


4. Erstellen Sie das Paket

Um das Paket zu erstellen, müssen wir ein Verzeichnis nach oben verschieben und den folgenden Befehl ausführen:

~/build/helloworld/0.1/helloworld-0.1$ dpkg-buildpackage -rfakeroot

Die Option `-rfakeroot` erlaubt `dpkg-buildpackage`, Befehle als privilegierter Benutzer mit Hilfe des Befehls `fakeroot` auszuführen. Dies ist notwendig, um das Paket vorzubereiten und Dateien und Verzeichnisse zu erstellen.
Der obige Befehl führt zu einer längeren Liste von Ausgabenachrichten (hier in einer deutschen Sprachumgebung angezeigt):

dpkg-buildpackage: Quellpaket helloworld dpkg-buildpackage: Quellpaket helloworld dpkg-buildpackage: Quellversion 0.1-1 dpkg-buildpackage: Quelldistribution unstable dpkg-buildpackage: Quellen geändert durch Frank Hofmann < [email protected] > dpkg-buildpackage: Host-Architektur amd64 dpkg-source --before-build helloworld-0.1 fakeroot debian/rules clean dh clean dh_testdir dh_auto_clean dh_clean dpkg-source -b helloworld-0.1 dpkg-source: Information: Quellformat 3.0 (quilt) wird verwendet dpkg-source: Information: helloworld wird unter Benutzung des existierenden ./helloworld_0.1.orig.tar.gz gebaut dpkg-source: Information: helloworld wird in helloworld_0.1-1.debian.tar.xz gebaut dpkg-source: Information: helloworld wird in helloworld_0.1-1.dsc gebaut debian/rules build dh build dh_testdir dh_auto_configure dh_auto_build dh_auto_test fakeroot debian/rules binary dh binary dh_testroot dh_prep dh_auto_install dh_installdocs dh_installchangelogs dh_perl dh_link dh_compress dh_fixperms dh_strip dh_makeshlibs dh_shlibdeps dh_installdeb dh_gencontrol dpkg-gencontrol: Warnung: Feld Depends von Paket helloworld: unbekannte Substitutionsvariable ${shlibs:Depends} dh_md5sums dh_builddeb dpkg-deb: Paket helloworld wird in ../helloworld_0.1-1_amd64.deb gebaut. dpkg-genchanges <../helloworld_0.1-1_amd64.changes dpkg-genchanges: kompletter Quellcode beim Hochladen hinzufügen dpkg-source --after-build helloworld-0.1 dpkg-buildpackage: Alles hochzuladen (Originalquellen enthalten) signfile helloworld_0.1-1.dsc Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren. Benutzer: 'Frank Hofmann (Hofmann EDV) < [email protected] > ' 4096-Bit RSA Schlüssel, ID D431AC07, erzeugt 2014-09-05 

4.1. Validierung des Pakets

Herzlichen Glückwunsch – es ist Ihnen gelungen, ein Debian-Paket zu bauen – ja! Schauen wir uns nun das Paket genauer an. Hier kommt 'lintian' ins Spiel. Dieses Tool validiert Ihr Paket, um Verstöße gegen die strengen Regeln zu finden, die Debian-Pakete erfüllen müssen.

Um die Tests auszuführen, geben Sie den folgenden Befehl ein:

lintian helloworld_0.1-1_amd64.deb 

Das Tool findet keine Regelverletzungen, sondern auch Rechtschreibfehler und falsche Zeichen. Der Schalter `–pedantic` fordert `lintian` auf, viel kritischer als üblich zu sein. Wie Sie unten sehen können, ist `lintian` etwas mürrisch und hat drei Warnungen und einen Fehler entdeckt.

Bis auf die erste Warnung können wir `lintian` leicht glücklich machen und den Paketinhalt nach den Regeln anpassen. Die Warnung `new-package-should-close-itp-bug` bedeutet, dass kein Fehlerbericht für das ITP-Paket vorliegt (ITP bedeutet _für das Paket vorgesehen_). Für ein reguläres Debian-Paket muss ein Fehlerbericht an den Bugtracker für das Paket ITP gesendet werden, um andere darüber zu informieren, dass Sie beabsichtigen, diese Software zu packen.

4.2. Warnung: `readme-debian-enthält-debmake-template

Die Datei `README.Debian` soll zusätzliche Hinweise zu diesem Paket enthalten. `dh_make` hat diese Datei für uns erstellt:

helloworld for Debian --------------------- -- Frank Hofmann < [email protected] > Sat, 04 Nov 2017 21:16:13 +0100 

In unserem Beispiel haben wir keine zusätzlichen Informationen, sodass wir die Datei löschen können.

4.3. Warnung: `Beschreibung-beginnt-mit-führenden-Leerzeichen`

Diese Warnung wird ausgegeben, weil die längere Beschreibung unseres Pakets in der Datei `debian/control` mit mehr als einem einzigen Leerzeichen beginnt. Sobald wir ein einzelnes Leerzeichen entfernen, verschwindet die Warnung.

4.4. Fehler: `Beschreibung-Zusammenfassung-ist-dupliziert`

Jedes Paket erfordert sowohl eine kurze als auch eine längere Beschreibung in `debian/control`. Dieser Fehler wird ausgelöst, weil beide Beschreibungen identisch sind. Sobald wir die längere Beschreibung erweitert haben, ist der Fehler weg.


5. Links und Referenzen

- [ddr] Andreas Barth, Adam Di Carlo, Raphaël Hertzog, Lucas Nussbaum, Christian Schwarz, Ian Jackson: Die Debian-Entwicklerreferenz
– [Dnmg] Josip Rodin, Osamu Aoki: Das neue Debian-Betreuerhandbuch
– [dpmb] Axel Beckert, Frank Hofmann: Das Debian-Paketverwaltungsbuch
- [dpm] Das Debian-Richtlinienhandbuch
- [kann] Das Debian-Paket-Tutorial
– [gph] Das GNU-Datenschutzhandbuch
– [lushpaiPackage] Alex Lushpai: So erstellen Sie ein Debian-Paket aus dem Quellcode


6. Danksagungen

Der Autor möchte sich bedanken Axel Beckert und Gerold Rupprecht für ihre Unterstützung und Kritik bei der Vorbereitung dieses Artikels.