Wie man Debian-Pakete aus den Quellen baut

Im folgenden möchte ich ein paar Wege aufzeigen, wie man ein Binärpaket mit Debian erzeugt. Das Ganze ist mehr als Merkzettel zu verstehen und ersetzt nicht die offizielle Dokumentation zur Erstellung von Binärpaketen mit Debian. Am Ende finden sich nützliche Links für alle, die sich mehr mit den technischen Details beschäftigen möchten. Außerdem finden sich dort auch Links zu Videos, die den Prozess ausführlich und nachvollziehbar erklären.

Die folgende Übersicht ist in Teilen eine Übersetzung des englischen Howto „How to build a package from source the smart way„.

Der bessere Weg – Debianisierte Quellen kompilieren

Der allgemeine Weg ein Binärpaket aus den Quellpaketen zu erstellen läuft immer so ab:

  1. Zuerst muss der Paketmanager wissen, woher er die Quelldateien beziehen soll, wozu die Datei /etc/apt/sources.list modifiziert wird.
  2. Dann wird das Quellpaket als normaler Nutzer heruntergeladen.
  3. Dann wird dpkg-buildpackage ausgeführt, um ein .deb Paket zu erstellen.
  4. Und schließlich wird dpkg -i benutzt, um das .deb Paket zu installieren.

1. Folgende Zeile in die /etc/apt/sources.list eintragen, sofern man sid installiert hat.

deb-src http://ftp.de.debian.org/debian/ sid main

2. Die Paketabhängigkeiten zum erfolgreichen Kompilieren als root installieren

aptitude update
aptitude install build-essential fakeroot devscripts
aptitude build-dep Paketname

3. Quellen herunterladen und Binärpakete bauen (alle weiteren Befehle als normaler Nutzer ausführen)

mkdir /home/XXXX/tmp/
cd /home/XXXX/tmp/
apt-get source Paketname
cd Paketname-version/

Nun kann die Datei debian/rules oder weitere debianspezifische Dateien wie debian/control oder debain/changelog angepasst werden. Ein wichtiges Programm hierfür ist debchange welches sich im Paket devscripts befindet.

Nach der Konfiguration wird das .deb Paket erstellt.

dpkg-buildpackage -rfakeroot -us -uc

Mit -us -uc überspringt man den Schritt, bei dem üblicherweise Debian Pakete vom Paketersteller signiert werden.

4. Installieren

cd /home/XXXX/tmp/
dpkg -i Paketname_Version_Architektur.deb

Nicht debianisierte Quellpakete kompilieren

Obwohl Debian ein riesiges Paketarchiv hat, kann es vorkommen, dass es zu einem Paket noch keine angepasste Debianversion gibt. Hierzu muss also das Original-Tarball mit den Quellen von der Projektseite heruntergeladen werden und anschließend mit dem Debianprogramm dh_make in eine debianisierte Version umgewandelt werden. Die Abhängigkeiten des Pakets müssen dann manuell mit apt installiert werden.

aptitude install dh-make

Als normaler Nutzer wieder:

mkdir /home/XXXX/tmp/
cd /home/XXXX/tmp/
tar -xvf Paketname_Version.tar.gz
mv Paketname_Version/ paketname-version/
mv Paketname_Version.tar.gz paketname_version.orig.tar.gz

Die Benennung des Pakets und die Unterstriche sind wichtig, damit sie Debians Konventionen entsprechen. Anderenfalls wird dh_make eine Fehlermeldung ausgeben. Danach in das entpackte Verzeichnis wechseln und dh_make ausführen.

dh_make

dh_make wird eine Reihe von Fragen stellen und schließlich müssen die Felder für den Paketbetreuer ausgefüllt werden. (das was man mit aptitude show zu sehen bekommt)

Nachdem dies erledigt ist

dpkg-buildpackage -rfakeroot -us -uc
dpkg -i paketname_version_architektur.deb

Chroot Umgebung und pbuilder

Am besten führt man alle Schritte zum Kompilieren in einer speziellen chroot Umgebung durch, die vom restlichen System getrennt ist und die sich später sehr leicht auch wieder entfernen lässt. Ein weiterer wichtiger Vorteil ist, dass Pakete, die in dieser Umgebung richtig gebaut werden, auch auf anderen Rechnern erfolgreich übersetzt werden können. Der Prozess wird dadurch reproduzierbar.

Ich benutze entweder die debootstrap Methode oder das Programm pbuilder.

1. Pbuilder installieren

aptitude install pbuilder

2. Chroot Umgebung erstellen

pbuilder create –distribution squeeze

Standardmäßig wird ein auf sid basierendes chroot Image erstellt. Die Option –distribution ändert das.

3. Pbuilder aktualisieren

pbuilder update

Falls man längere Zeit nichts mehr kompiliert hat, sollte die chroot Umgebung aktualisiert werden.

4. Quellpaket herunterladen

apt-get source Paket

5. In das Quellverzeichnis wechseln und debianisiertes Quellpaket in chroot Umgebung bauen

pbuilder build Paket_Version.dsc

Die fertigen Binärpakete befinden sich danach in /var/cache/pbuilder/result.

Der herkömmliche Weg – autoconf und automake

In den meisten Quellpaketen befindet sich ein sogenanntes configure Skript, welches automatisch von dem GNU Programm autoconf generiert wird. In der Regel muss man in das Quellverzeichnis wechseln und folgende Befehle ausführen, um ein Binärpaket zu erstellen. Zuvor müssen Abhängigkeiten manuell oder mit aptitude build-dep installiert werden.

Als Ziel für die Installation wird /usr/local gewählt, /opt ist ebenfalls eine gute Alternative.

./configure –prefix=/usr/local –beliebige Optionen zur Konfiguration

Danach genügt es mit make die Quellen zu übersetzen und mit make install die Binärpakete in das gewählte Zielverzeichnis zu installieren.

make
make install

Für Debian ist es dabei besser make install durch checkinstall zu ersetzen. Checkinstall erstellt ein .deb Paket und merkt sich wohin die Pakete installiert werden. Der Nachteil ist, dass es weder die Quelldateien debianisiert noch Paketabhängigkeiten berücksichtigen kann.

su -c „checkinstall -D make install“

Ein Beispiel für diese Methode war meine Dillo2 Kompilierung auf dem Toshiba Portege.

Links

Basics of the Debian package management system
Debian New Maintainers‘ Guide
Ubuntu – Packaging Guide Complete

Videos von der MiniDebConf 2010 in Berlin in Deutsch

Die .ogv Dateien zu Packaging und Advanced Packaging zeigen einen Vortrag zum Thema Paketerstellung mit Debian.

Nach der Lektüre und den Videos sollte man in der Thematik fit sein. 😉

Wine einmal selbst kompilieren

Ungewöhnliche Probleme erfordern ungewöhnliche Maßnahmen…oder so ähnlich. Der Bug mit den Zeratul-Missionen bei Starcraft II beschäftigte mich seit einer Weile, weswegen ich noch einmal im Netz nachschaute, ob jemand nicht doch mit den gleichen Problemen zu kämpfen hatte.

In der Wine-Anwendungsdatenbank stieß ich dann endlich auf einen Kommentar, der exakt das gleiche Problem beschrieb. Ich erinnerte mich wieder daran, dass ich schon erfolgreich die ersten beiden Zeratul-Missionen mit Wine 1.2 gespielt hatte. Vielleicht half hier ja ein Versionswechsel?

In Sachen Wine hinkt Debian aus mir unbekannten Gründen mit der aktuellen Version weit hinterher. (Debian Sid z.Z. 1.1.42). Damit lässt sich zwar auch Starcraft 2 spielen, das Zeratul Problem bleibt aber bestehen. Als Alternative gibt es aber auf der WineHQ-Seite zumindest die Möglichkeit die aktuellen Entwicklungsversionen des Wine 1.3 Zweiges als vorgefertigte .deb Pakete herunterzuladen, die mir aber auch nicht weiterhelfen konnten.

Alles in allem blieb nur die Möglichkeit Wine aus den Quellen selbst zu kompilieren. Ich schaute zuerst nach, welchen Weg die Entwickler vorschlugen und installierte danach zuerst einmal die für die Kompilierung notwendigen Pakete.

Welcher Weg der Sinnvollste zur Kompilierung eines Debian Binärpakets ist, scheint wirklich davon abzuhängen, welche Webseite man gerade liest. Interessanterweise konnte man praktisch überall etwas anderes lesen. Zur eigenen Dokumentation gehe ich später noch einmal auf die verschiedenen Optionen ein. Prinzipiell bietet Debian viele Werkzeuge an, die den Prozess stark vereinfachen und für alle, die öfter Pakete mit Debian erstellen, mit Sicherheit auch der beste Weg sind.

Hier ist nun aber der althergebrachte Weg mit Linux ein Quellpaket zu übersetzen und der auch vom Wine-Wiki vorgeschlagen wird. Zum Ausprobieren habe ich mir erneut eine minimale chroot Umgebung mit debootstrap erstellt.

  1. Quellpakete herunterladen z.B. auf der offiziellen Sourceforge Seite von Wine oder hier.
  2. Abhängigkeiten installieren

    apt-get build-dep wine

    oder indem die oben erwähnten Pakete manuell mit apt installiert werden.

  3. Quellpaket entpacken z.B. in ~/tmp mit

    tar -xvf wine-1.2.tar.bz2

  4. Kompilieren: In das neue Wine-Verzeichnis in ~/tmp wechseln und

    ./configure
    make

    ausführen.

Wine lässt sich dann direkt aus dieser Umgebung benutzen oder danach auch mit dem Kommando make install in den Pfad des Nutzers installieren.

Sollten Probleme beim Ausführen von ./configure auftreten, fehlen einige Pakete als Abhängigkeiten, die manuell nachinstalliert werden müssen. Das war es im Prinzip schon. War das Ganze nun ein Erfolg?

Ich konnte danach Starcraft II zwar starten und benutzen. Das Spiel stürzte trotzdem nach Klick auf den Kristall im Labor ab, mit dem die Zeratul Missionen gestartet werden. Auch eine weitere Wine Version 1.2.1. brachte das gleiche Ergebnis. 🙁

Das Problem scheint also woanders zu liegen. In Sachen Kompilierung ist die oben beschriebene Methode praktisch auf jeder Linuxdistribution zu verwenden, ist aber gerade bei Debian eine etwas „unsaubere“ Lösung, da der Paketmanager und die von Debian zur Verfügung gestellten Werkzeuge nicht zum Einsatz kommen. Mehr Möglichkeiten zum Erstellen von Binärpaketen mit Debian habe ich hier beschrieben. 🙂

Den eigenen Debian-Kernel bauen

Es kommt nicht oft vor, dass ich den Linuxkernel selbst übersetzen muss. In der Regel bietet der generische Debian- oder Ubuntukernel alle Treiber, die man braucht und da die Module nur dann geladen werden, wenn sie tatsächlich benötigt werden, ist der Performancegewinn eines eigenen Kernel für mich auf neuer Hardware kaum spürbar.

Natürlich gibt es aber auch gute Gründe, warum ein eigener Kernel sinnvoll sein kann. Sei es nur um das letzte bisschen Leistung herauszukitzeln, ein neues Kernelfeature zu aktivieren oder unnötige zu deaktivieren.

Der Standardkernel 2.6.32 von Squeeze und auch der 2.6.26 von Lenny funktionieren beide nicht auf meinem Toshiba Satellite 220cs Laptop. Bei nur 16 MB RAM regt sich nach GRUB für gewöhnlich nichts mehr. Meine Versuche mit Slitaz hingegen waren sehr erfolgreich. Sowohl das Betriebssystem als auch der Kernel sind so angepasst, dass selbst 16 Jahre alte Hardware mit aktueller Software funktioniert.

Als Debian-Fan wollte ich unbedingt den Kernel anpassen, um auszuprobieren wie sich Debian auf dem alten Laptop schlägt. Natürlich stand ich wieder mal vor dem Problem, wie ging das eigentlich bei Debian mit dem Kernelkompilieren.

Debians Kernel Handbook zeigt schon die wichtigsten Schritte auf, doch am einfachsten und nachvollziehbarsten werden sie auf www.adminlife.net beschrieben.

Debian bringt nämlich schon ein Werkzeug mit, welches alle wichtigen Schritte der Kernelkompilierung übernimmt und den angepassten Kernel auch gleich in ein .deb Paket umwandelt, welches sich über Debians Apt dann problemlos verwalten lässt.

Die wichtigsten Schritte sind:

  • Notwendige Programme zum Kompilieren installieren

    aptitude install kernel-package build-essential

  • Gewünschte Kernel Quellen installieren. Entweder die Debian Kernel Sourcen nehmen oder direkt von www.kernel.org herunterladen und in /usr/src entpacken. Z.B.

    aptitude install linux-source-2.6.30

  • Symlink anlegen

    ln -s /usr/src/linux-2.6.30 /usr/src/linux

  • Kernelconfig kopieren. Für den Anfang genügt es die aktuelle config aus /boot zu nehmen. Allgemein geht auch zcat /proc/config.gz > kernel.cfg

    cp /boot/config-`uname -r` /usr/src/linux/.config

  • Kernel an die eigenen Bedürfnisse anpassen
    cd /usr/src/linux
    make oldconfig
    make menuconfig
    
  • Den Kernel kompilieren und ein .deb Paket erstellen

    make-kpkg kernel_image --revision 20110217 --initrd

Ich musste auf meinem im letzten Post vorgestellten Debian-Minimalsystem mit debootstrap noch das Paket lzma installieren, damit das Kompilieren erfolgreich war.

Als Kernelconfig hatte ich die Slitaz 2.6.30-loram config ausgewählt. Beim Übersetzen wurde zuerst ein Fehler mit dem Kernelmodul lguest gemeldet, dass ich danach aus der config gestrichen habe.

Erfreulicherweise lief danach die Kernelkompilierung erfolgreich durch. Das entstandene .deb Paket lässt sich bequem mit dpkg -i installieren.

Mit diesem Kernel ließ sich wie erhofft problemlos sowohl ein Squeeze als auch ein Lenny in Qemu booten. Möglichkeiten zum Optimieren gibt es noch einige. Z.B. benötige ich nicht wirklich das ReiserFS-Dateisystem und gefühlte 100 weitere Module auch nicht.

Vielleicht werde ich deswegen auch in Zukunft die Kernelconfig soweit anpassen, dass tatsächlich nur noch die absolut notwendigen Pakete übrig bleiben. Für den Anfang ist „the Debian way ™“ und ein Minidebian in Ubuntu eine bequeme Möglichkeit um weiter herum zu experimentieren.

Wie sich der neue Kernel auf dem Toshiba 220cs geschlagen hat, dazu demnächst mehr.

Dillo2 mit Debian Squeeze kompilieren

Scheinbar hat es Dillo2 nicht mehr in Squeeze geschafft. Seit dem 06. August 2010 ist die kommende stabile Debian Version „Squeeze“ eingefroren, d.h. es kommen keine neuen Pakete mehr hinzu und nur noch Fehler werden beseitigt. Da Dillo2 selbst in sid nicht auftaucht, wird noch eine Weile vergehen bis man diesen leichtgewichtigen Browser in Debian wiederfinden kann. Passend dazu kann man auf der Fehlerreport Seite von Debian nachlesen, dass auch die alte Version von Dillo aus dem Debianarchiv gelöscht wurde, weil Dillo von veralteten Bibliotheken abhängig war und Fehler seit Monaten nicht mehr ausgebessert werden, was die Entwickler auch zugeben.

Ich habe mich mal hingesetzt und Dillo2 mit der neuen FLTK2 Bibliothek auf meinem Toshiba Portégé 3110CT mit Debian Squeeze kompiliert. Es gibt dazu eine Anleitung auf der offiziellen Dillo Homepage. Leider geht die README.unix Datei nur ungenau darauf ein wie die Pakete heißen, welche für ein erfolgreiches Kompilieren notwendig sind und man muss zuerst einmal die richtigen X, jpeg und mesa Pakete finden.

Als erstes muss die FLTK2 Bibliothek übersetzt werden. Die Quelldateien gibt es hier. Ich habe Version 2.0.x-r7680 benutzt. Für Debian Squeeze müssen dann zuerst folgende Pakete installiert werden.

aptitude install

  • build-essential
  • xserver-xorg-dev
  • libx11-dev
  • libxi-dev
  • libjpeg-dev
  • libglu1-mesa-dev
  • libpng12-dev
  • libxcursor-dev
  • libglut3-dev
  • zlib1g-dev (für Dillo2)

Danach einfach die Datei mit tar jxvf fltk-2.0.x-r7680.tar.bz2 z.B. in /tmp entpacken, in das Verzeichnis wechseln, make ausführen, Root werden oder ein Programm wie fakeroot nutzen und FLTK2 mit make install installieren

cd fltk-2.0.x-r7680
make
su
make install

Die neueste Dillo2 Entwicklerversion herunterladen. In das Dillo Verzeichnis wechseln und Dillo2 kompilieren.

./configure
make
su
make install-strip

dillo auf der Konsole eingeben und loslegen!

Es hilft, wenn man den ./configure Dialog bei FLTK2 und Dillo2 beobachtet. Sollten dort zu viele Tests fehlschlagen, kann es entweder sein, dass man ohne das Installieren von zusätzlichen Paketen Dillo2 gar nicht übersetzen kann oder wie bei mir nach dem ersten Übersetzen ohne PNG Unterstützung dasteht. Die oben aufgelisteten Pakete waren dann aber beim zweiten Mal ausreichend, um Dillo2 zum Laufen zu bekommen.

Hier noch ein kurzer Vergleich zwischen Dillo2 und Links2. Ich habe jeweils Screenshots von bbc.co.uk, dillo.org und gambaru.de aufgenommen. Rechts ist dillo2 zu sehen und links links2. Die dillo.org Seite sah identisch bei beiden aus.

Dillo2 startet in zwei Sekunden auf dem älteren Laptop und bietet nun auch ausreichende CSS Unterstützung. Mit float Anweisungen scheinen beide Browser nicht perfekt umgehen zu können. Zu einem kurzen Blick auf Webseiten reichen beide aus. Die Nachteile gegenüber modernen Alternativen sind aber auch unverkennbar. Besonders beachten sollte man, dass Dillo2 https nicht vollständig unterstützt und deshalb für sicheres Surfen nicht zu empfehlen ist.

Für mich sind beide Browser dennoch nützliche Programme auf einem altersschwachen Rechner, wenn es nur darauf ankommt schnell eine Information zu finden.