Wer selbst deb-Pakete schneidern will, bekommt einiges an Hilfe geboten. Dennoch drehen sich die meisten Dokumentationen um den config/make-Prozess, d.h. um bestehende Software, die nach Debian portiert werden soll. Was ist, wenn man es etwas einfacher haben will?
Vorbereitungen
Viel benötigt man eigentlich nicht, um ein Paket zu schnüren. Im einfachsten Fall genügt das Paket dpkg-dev. Wir installieren ein paar mehr Pakete:
1 |
sudo apt-get install dpkg-dev fakeroot lintian |
dpkg-dev ist ein Sammelpaket, welches andere Pakete gegebenenfalls gleich mitinstalliert, fakeroot erlaubt das Erstellen von Paketen als “falsches” root. Das ist wichtig bei der Paketerstellung, da ansonsten die Rechte womöglich falsch gesetzt wurden. Mit lintian kann man eine Paketeinstellung später prüfen – notwendig ist das nicht unbedingt.
Beispiel: zcode-Games als deb
Ich will ein simples Beispiel nehmen, um zu demonstrieren, wie man Pakete einfach baut: Ich will in diesem Beispiel meine zcode-Spiele aka Textadventures als Debian-Paket erstellen. Diese liegen als binäre Pakete vor und sollen lediglich beim Installationsvorgang in den Ordner /usr/share/games/zcode installiert werden.
Zum Mittesten können die Spiele alle als tar-Archiv heruntergeladen werden: Textadventures Max Kalus (tgz, 432 kb). Diese einfach herunterladen, wir brauchen diese gleich als “Installationsmasse”.
Verzeichnisse
Zuerst erstellen wir die Verzeichnisse, die in einem Paket notwendig sind:
1 2 |
mkdir -p zcode-games-de-mk-1.0-all/usr/share/games/zcode mkdir zcode-games-de-mk-1.0-all/DEBIAN/ |
Die Verzeichnisse unterhalb “zcode-games-de-mk-1.0-all” bilden einen Teil des Unix-Dateisystems ab. Hier brauchen wir lediglich den Pfad usr/share/games/zcode, damit die Spiele später in den absoluten Pfad /usr/share/games/zcode kopiert werden.
Das Verzeichnis “zcode-games-de-mk-1.0-all” entspricht den Namenskonventionen für Pakete von Debian, also Paketname-Version-Architektur. In diesem Fall ist die Version 1.0 und “all” steht für alle Architekturen.
Das DEBIAN-Verzeichnis ist ein besonderes Verzeichnis, in das weiter unten Steuerdateien kopiert werden.
Daten kopieren
Als nächstes kopieren wir die zcode-Spiele in das “usr/share/games/zcode/”-Verzeichnis (und löschen das Archiv):
1 2 |
tar xzf mkaluszcodegames.tar.gz -C zcode-games-de-mk-1.0-all/usr/share/games/zcode/ rm mkaluszcodegames.tar.gz |
So, damit sind die Daten bereits fertig zum Packen in ein Debian-Archiv.
Steuerdatei erstellen
Was nun noch fehlt, ist die Steuerdatei für das Paket. Diese enthält alle relevaten Informationen zum Paket.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cat > zcode-games-de-mk-1.0-all/DEBIAN/control << EOF Package: zcode-games-de-mk Version: 1.0 Section: games Priority: optional Architecture: all Recommends: zcode-interpreter Installed-Size: 696 Maintainer: Maximilian Kalus <debian @beimax.de> Provides: zcode-game Description: German Z-Code-Games of Maximilian Kalus This package contains the z-code-games of Maximilian Kalus. All games are in German language and put into the /usr/share/games/zcode folder. EOF |
Die meisten Einträge sollten relativ selbsterklärend sein. “Recommends” beschreibt, dass das Paket ein anderes vorschlägt, es gibt ebenfalls die Optionen “Depends” und “Suggests”. Man kann hier mit | angeben, wenn man Alternativen haben will. “Depends: mozilla | netscape” würde z.B. entweder mozilla oder netscape als notwendiges Paket zur Installation ansehen.
“Provides” bedeutet, dass dieses Paket ein meta-Paket bereitstellt. Andere Optionen sind hier u.a. “Conflicts” und “Replaces”. Näheres dazu bei debian selbst…
“Installed-Size” ist die installierte Größe in kb. Diese muss man offenbar selbst ausmessen, eine andere Möglichkeit habe ich bislang noch nicht entdeckt… Dazu kann man z.B. du -k zcode-games-de-mk-1.0-all/usr verwenden.
“Description” kann eine mehrzeilge Beschreibung sein. Die Zeilen nach dem Schlüsselwort müssen eingerückt sein.
Erstellen und Test
Nun sind wir bereit für den Test! Um die Berechtigungen im Paket richtig zu setzen, benutzen wir fakeroot und verwenden dpkg zum Erstellen des Pakets.
1 |
fakeroot dpkg -b zcode-games-de-mk-1.0-all |
Es sollte eine entsprechende Erfolgsmeldung kommen, dass das Paket installiert wurde.
Die Installation kann man wie folgt testen:
1 2 |
sudo dpkg -i sudo dpkg -i zcode-games-de-mk-1.0-all.deb ls /usr/share/games/zcode |
So, das wären die Grundlagen. Das Paket ist zum Benutzen schon nicht schlecht, leider fehlen noch einige Dateien, die das Paket komplett Debian-kompatibel machen.
Komplett Debian-tauglich machen
Dazu lassen wir zuerst lintian testen, ob ihm das Paket gefällt:
1 |
lintian -i zcode-games-de-mk-1.0-all.deb |
Die Ausgabe wird einen Fehler bringen:
1 2 3 4 5 6 |
E: zcode-games-de-mk: no-copyright-file N: N: Each binary package has to include a plain file N: /usr/share/doc/<pkg>/copyright N: N: Refer to Policy Manual, section 12.5 for details. |
So, hier fehlt also noch eine gewisse “Schönheitsdatei”. Diese kann man einfach hinzufügen:
1 2 3 4 5 6 7 8 9 10 |
mkdir -p zcode-games-de-mk-1.0-all/usr/share/doc/zcode-games-de-mk cat > zcode-games-de-mk-1.0-all/usr/share/doc/zcode-games-de-mk/copyright << EOF Copyright notice The story files are all copyrighted by Maximilian Kalus who intended the games to distributed freely - as in free to distribute and without cost. Copyright 1999-2006 by Maximilian Kalus, www.beimax.de EOF |
Das ist allerdings noch nicht alles. Wenn man lintian noch einmal laufen lässt, wird man darauf aufmerksam gemacht, dass das Changelog fehlt. Dies holen wir natürlich nach:
1 2 3 4 5 6 7 8 |
cat > zcode-games-de-mk-1.0-all/usr/share/doc/zcode-games-de-mk/changelog << EOF zcode-games-de-mk (1.0.0) stable; urgency=low * Initial release EOF echo " -- Maximilian Kalus <debian @beimax.de> " $(LANG=C date "+%a, %e %b %Y %X %z") >> zcode-games-de-mk-1.0-all/usr/share/doc/zcode-games-de-mk/changelog gzip -9 zcode-games-de-mk-1.0-all/usr/share/doc/zcode-games-de-mk/changelog |
Ein erneuter Aufruf von fakeroot dpkg -b zcode-games-de-mk-1.0-all und lintian -i zcode-games-de-mk-1.0-all.deb sollte zeigen, dass nun alle wesentlichen Daten erstellt worden sind.
Hier ist die Datei zcode-games-de-mk-1.0-all.deb zum Herunterlagen.
Cozy Paul
Hallo,
wirklich nette Beschreibung.Allerding geht es auch mit fpm…;=)
VG
RouteUS67
Hallo,
gutes Tutorial, hat nach einigen Anläufen funktioniert 🙂
Nun aber eine Frage: Ich habe jetzt meine .deb Datei, und wenn ich die installiere, installiert sich alles in /usr/share/xyz/*.
Allerdings ist es nervig immer den ganzen Pfad angeben zu müssen um in diesem Verzeichnis ein Programm starten zu müssen.
Ist es möglich, dass die Datei zum Ausführen automatisch auch in /usr/bin/xyz verknüpft wird? Denn ich möchte ja nicht alle Dateien wie Changelog o.ä. dann in /usr/bin/ rumfahren haben. Also wirklich nur das Programm soll in /usr/bin landen. Der Rest sollte bei /usr/share/xyz/* bleiben.
Ist das irgendwie möglich? Vielleicht auch mit FPM wie @Cozy_Paul schon meinte?
Liebe Grüße (Und weiter so!)
RouteUS67
mkalus Autor
Hallo,
danke für die Rückmeldung. Du kannst die Verzeichnisse natürlich auch beliebig ändern. Im Beispiel war mein Verzeichnis ja
zcode-games-de-mk-1.0-all/usr/share/games/zcode
. Statt/usr/share/...
kannst du natürlich auch/usr/bin/
oder/usr/local/bin/
nehmen. Dann sind deine Programme auch ausführbar (sofern die Berechtigungen gesetzt sind). Mit anderen Worten: Unrerhalb des Basisverzeichnisses kannst du beliebige Dateien in der UNIX-/Debian-üblichen Struktur aufbauen, also ausführbare Programme in bin, der Rest in share usw. deb kann ziemlich viel in der Hinsicht, mein Tutorial zeigt nur den einfachsten Anwendungsfall.Anmerkung zu fom: Der Artikel ist von 2008, da gab es fpm meines Wissens noch nicht (oder zumindest kannte ich es damals noch nicht). Klar, das ist natürlich auch sehr schick.