Aus Linux-Magazin 02/2006

Workshop: Mit Debtool Debian-Pakete selbst verwalten und nutzen

So wie der Kuckuck die Dienstleistung anderer Vögel bei der Aufzucht seiner Nachkommen in Anspruch nimmt, profitieren Sie mit Debtool bei selbst gemachten Distributionen von den Früchten des Debian-Projekts, indem Sie fertige Debian-Pakete einsetzen statt die Programme selbst zu übersetzen.

Trotz der Vielfalt des Angebots lohnt es sich bei Rettungssystemen, Routern und anderen Spezialfällen, ein eigenes Linux-System zusammenzustellen und nicht eine der bekannten Distributionen zu verwenden. Soll das neue System besonders klein sein, taugen Suse Linux, Fedora und auch Debian kaum als Basis, da die Minimalinstallation oft schon über 100 MByte umfasst.

Der Kernel ist zwar die Grundlage jedes Linux-Systems, reicht aber allein für den Betrieb nicht aus. Eine Reihe von Systemprogrammen ist dafür zuständig, das System hochzufahren, Hardware einzurichten und dem Benutzer überhaupt den Zugang zu ermöglichen. Viele Rettungs- und Live-Linux-Systeme verwenden Busybox [1] als Ersatz für die grundlegenden Systemprogramme.

Wenn Sie Funktionen oder zusätzliche Dienste benötigen, die Busybox in seiner Emulation nicht bereitstellen kann, müssen Sie zwangsläufig die Originalprogramme aus den Quellen übersetzen und mit allen verwendeten Bibliotheken in Ihr eigenes System einbinden. Typische Kandidaten dafür sind »grep«, »tee« oder auch »tar«, von denen Busybox lediglich die Grundfunktionen emuliert.

Compiler-Orgien

Spezialanwendungen – etwa Multimedia-Programme – setzen viele Bibliotheken voraus, oft in sehr speziellen Versionen, die zunächst zu kompilieren und auf dem Development-System zu installieren sind, bevor Sie die eigentliche Applikation übersetzen können. Wenn Sie die Programme nicht fürs eigene Linux-System verändern, müssen Sie die gleichen Schritte vollziehen wie die Maintainer der großen Distributionen.

Zusätzlich sollten Sie sich um etwaige Sicherheitsprobleme kümmern und möglichst zeitnah aktualisierte Versionen der betroffenen Dienste und Programme neu übersetzen und bereitstellen. So entsteht auf Ihrem Entwicklungssystem schnell eine große Zahl an Programmquellen, die Sie aufeinander abstimmen und aktuell halten müssen.

Die Autoren dieses Artikels standen vor dem gleichen Problem, als es darum ging, ein möglichst kleines, aber eigenständiges Linux-System für einen digitalen Videorekorder zu entwickeln – LinVDR [2]. Das voll installierte System hat eine Größe von nur 85 MByte, enthält jedoch neben dem Videorekorder-Programm VDR [3] und den üblichen Systemprogrammen diverse Dienste wie SSH, Samba, FTP und HTTP. Zudem sollte es Anwendern möglich sein, weitere Programme nachzuinstallieren, ohne dass die Distribution dafür Compiler und Bibliotheken enthält.

Um den Aufwand gering zu halten, entschieden sich die Autoren den gleichen Compiler und die gleichen Bibliotheken zu verwenden wie das Debian-Projekt. Während LinVDR 0.7 kompatibel zu Debian Woody war, ist die kommende Version 0.8 binärkompatibel zu Sarge. Entsprechend wurden der Kernel, sämtliche angepassten Programme und die zugehörigen Bibliotheken auf einem Sarge-System übersetzt.

Der Vorteil ist, dass Sie jederzeit Programme aus Debian Sarge nachinstallieren können, da sie die gleichen Systembibliotheken benutzen wie die speziellen Programme aus LinVDR. So gibt es stets nur eine Libc und auch von den meisten anderen Bibliotheken stets nur eine, für alle Programme eingesetzte Version.

Von Debian bedient

Mit dem gleichen Ansatz sparen Sie sich ebenfalls viel Arbeit bei Ihrem eigenen Linux-System. Wenn Sie die aktuelle Stable-Release von Debian verwenden, können Sie zudem auf die Sicherheits-Updates des Debian-Projekts zurückgreifen, statt bei jeder Lücke die Arbeit der Debian-Maintainer nochmals für Ihr eigenes System nachzuholen.

Ein Problem von LinVDR und allen ähnlich aufgebauten Spezial-Distributionen ist, dass die Paketverwaltung per Apt fehlt. Es gibt auch keine Paketdatenbank für die mit LinVDR ausgelieferten Programme, da aus Platzgründen oft nur Teile eines Debian-Pakets installiert wurden, also auch Bibliotheken fehlen, die »apt-get« auf einem Debian-System automatisch nachladen würde.

Abbildung 1: Die Datei »control« enthält nicht nur die Paketbeschreibung, mit einer für Debian nicht auflösbaren Abhängigkeit wie »linvdr-base« verhindern Sie, dass das Paket versehentlich auf dem falschen System installiert wird.

Abbildung 1: Die Datei »control« enthält nicht nur die Paketbeschreibung, mit einer für Debian nicht auflösbaren Abhängigkeit wie »linvdr-base« verhindern Sie, dass das Paket versehentlich auf dem falschen System installiert wird.

Folglich kann LinVDR nicht einfach auf Apt von Debian zurückgreifen – über die Abhängigkeiten würde praktisch jedes neu installierte Debian-Paket dafür sorgen, dass Apt das halbe Betriebssystem ersetzt und dabei auch lebenswichtige Teile wie »busybox« überschreibt. Die Lösung war das Perl-Skript »debtool« [4], das die Paketliste von einem Debian-Server herunterlädt, die gewünschten Pakete bestimmt und auspackt, ohne dabei vorhandene Systemprogramme zu überschreiben.

Paketlisten

Die Organisation der Verzeichnisse auf einem Debian-Mirror scheint zunächst problematisch, da sämtliche Versionen eines Pakets im selben Unterverzeichnis liegen, ohne einen Hinweis darauf, welche Version des Pakets zu welcher Debian-Release gehört. Diese Information entnimmt »debtool« der Paketliste.

Grundsätzlich haben alle Debian-Mirror die gleiche Verzeichnisstruktur, Sie sind nicht auf einen speziellen Server angewiesen. Die Verzeichnisse für die einzelnen Debian-Releases liegen unter »/debian/dists«, derzeit handelt es sich um »woody«, »sarge« und »etch« sowie »sid«.

Die Struktur unterhalb der einzelnen Versionsverzeichnisse ist ebenfalls genormt: In den Unterverzeichnissen für die verschiedenen Rechnerplattformen gibt es drei Unterverzeichnisse, die jeweils die Paketbeschreibung »Packages« enthalten: »main« listet nur die regulären freien Debian-Pakete auf, »contrib« Pakete, die nicht-freie Software für den Betrieb benötigen, und »non-free« alle anderen Programme, die nicht unter einer freien Lizenz stehen.

Die Paketliste für freie Programme der aktuellen stabilen Debian-Version Sarge steht unter [5] zum Download, »debtool« aus LinVDR speichert sie lokal unter »/etc/apt/Packages«. Durch ihren einfachen Aufbau ist die Paketliste leicht zu analysieren: Jede Paketbeschreibung beginnt mit »Packages:« gefolgt vom Namen des Pakets und reicht bis zur nächsten Leerzeile. Listing 1 zeigt die Paketdaten von »mgetty-viewfax«.

Jede Zeile, mit Ausnahme der Paketbeschreibung, enthält ein eindeutiges Label gefolgt von einem Doppelpunkt, einem Leerzeichen und den Parametern des Labels. Die Paketbeschreibung kann als einziges Label mehrzeilig ausfallen, alle weiteren Zeilen beginnen dann jedoch mit einem Leerzeichen.

Um auf Ihrem eigenen System Debian-Pakete nachzuinstallieren, brauchen Sie nur wenige Labels aus der Paketliste auszuwerten. Der Name des Pakets steht hinter dem Label »Package«, die URL für den Download gewinnen Sie aus »Filename«: Vor den in Zeile 10 genannten Pfad müssen Sie lediglich den Hostnamen des Servers sowie »/debian/« einfügen. Unter Perl liest Listing 2, ein Auszug von »debtool«, sämtliche Felder eines Debian-Pakets aus der Paketliste ein. Anschließend überprüft »debtool«, ob es sich um das gesuchte Paket handelt, und liefert die passende Download-URL zurück:

if($package{"Package"} eq $pattern) {
  return "$HOST/debian/" . $package{"Filename"};
}

Ohne eine eigene Paketverwaltung ist Debtool jedoch nicht in der Lage, die in der Paketliste genannten Abhängigkeiten aus Zeile 9 von Listing 1 aufzulösen. Der Benutzer muss also selbst herausfinden, welche weiteren Pakete er benötigt, um ein Programm benutzen zu können. LinVDR hat dieses Problem über die Hacking-FAQ auf der Projekt-Homepage gelöst, die für einige ausgewählte Programme alle benötigten abhängigen Pakete auflistet.

Listing 1: Auszug aus der
Paketbeschreibung

01 Package: mgetty-viewfax
02 Priority: extra
03 Section: comm
04 Installed-Size: 108
05 Maintainer: Andreas Barth <aba@not.so.argh.org>
06 Architecture: i386
07 Source: mgetty
08 Version: 1.1.33-2
09 Depends: libc6 (>= 2.3.2.ds1-21), libx11-6 | xlibs (>> 4.1.0)
10 Filename: pool/main/m/mgetty/mgetty-viewfax_1.1.33-2_i386.deb
11 Size: 63902
12 MD5sum: 2fa51a86f73d807e22d0af304f8f537b
13 Description: Program for displaying Group-3 Fax files under X
14  The program 'viewfax' allows you to view Group-3 fax files in an X window.
15  Group-3 is the "standard" format for faxes.

Ausgepackt

Haben Sie das gewünschte Debian-Paket vom Mirror heruntergeladen, müssen Sie es entpacken und installieren. Alle Debian-Pakete sind einfache »ar«-Archive, in denen die Dateien »control.tar.gz«, »data.tar.gz« sowie »debian-binary« zu einer Datei zusammengefasst sind. Sie entpacken das Archiv mit »ar -x« in einem temporären Verzeichnis und die beiden Tar-Archive in die Unterverzeichnisse »control« und »data«.

Das »control«-Verzeichnis enthält mindestens die Datei »control« mit den Paketinformationen, die Sie zum Teil bereits aus der Paketliste kennen. Weiterhin kann es die vier Skripte »preinst«, »postinst«, »prerm« und »postrm« geben, die ihrem Namen entsprechend vor oder nach der Installation oder Deinstallation laufen. Da diese Skripte davon ausgehen, auf jener Debian-Release zu arbeiten, für die das Paket gebaut ist, können Sie auf Ihrer eigenen Distribution nichts damit anfangen. Sie bräuchten schon speziell auf Ihren Einsatzfall angepasste Skripte, doch dazu später mehr.

Im »data«-Verzeichnis liegen alle Dateien des Pakets. Prinzipiell müssten Sie lediglich den Inhalt des Verzeichnisses samt Unterverzeichnissen nach »/« kopieren oder »data.tar.gz« gleich in »/« entpacken – allerdings ist zu beachten, dass die Paket-Maintainer davon ausgehen, ein reguläres Debian-System vor sich zu haben. Gerade im Zusammenspiel mit Busybox kommt es allerdings regelmäßig vor, dass eine im Debian-Paket enthaltene Datei einen symbolischen Link auf Busybox – und damit Busybox selbst – überschreiben würde. Das Ergebnis wäre fatal, das System würde nicht einmal mehr booten.

Listing 2: Auszug aus
»debtool«

01 my %package;
02 if(/^Package: /) {
03   my($key, $value) = split(": ", $_, 2);
04   chomp($value);
05   $package{$key} = $value;
06   while(<FILE>) {
07     if(/^n/) {
08       last;
09     } else {
10       chomp;
11       my($key, $value) = split(": ", $_, 2);
12       $package{$key} = $value;
13     }
14   }
15 }

Die Funktion »InstallDEB« von »debtool« kopiert daher nur Dateien aus »data«, die es nicht schon im System gibt. Nur mit dem Parameter »-o« überschreibt »debtool« auch vorhandene Dateien. Zusätzlich ignoriert »InstallDEB« einige Dateien wie zum Beispiel Manpages, die auf einem System ohne »man« ohnehin überflüssig wären.

Jede installierte oder ignorierte Datei protokolliert »debtool« in dem Verzeichnis »/var/cache/apt/packages« in einer Textdatei, die den Namen des Debian-Pakets trägt. So lässt sich jederzeit nachvollziehen, welche Dateien nachträglich installiert wurden. Das ist sinnvoll, damit Sie später Debian-Pakete von Hand wieder entfernen können, da »debtool« diese Funktionalität nicht bietet.

Hausgemachte Pakete

Mit Hilfe von »debtool« können Sie nicht nur Original-Debian-Pakete nachinstallieren, sondern auch eigene Updates oder Zusatzprogramme zum Download anbieten, die für interessierte Benutzer leicht zu installieren sind. Falls Sie für diesen Zweck keinen eigenen Debian-Mirror aufsetzen wollen, können die Benutzer die Update-Pakete auch einfach von Hand herunterladen, speichern und mit dem Kommando »debtool -f Name.deb« installieren.

Diese Methode benutzen die Autoren in LinDVR 0.7, um etwa das unzulängliche »tee« von Busybox nachträglich gegen das Original auszutauschen oder um fehlende Dateien eines Plugin komfortabel nachzuinstallieren. Dazu müssen Sie allerdings die Pakete von Hand zusammenstellen: Wie bereits beim manuellen Auspacken im letzten Abschnitt beschrieben, besteht ein Debian-Paket aus den Dateien »control.tar.gz«, »data.tar.gz« sowie »debian-binary«. In »data.tar.gz« packen Sie alle nötigen Dateien zusammen – dabei sollten Sie beachten, dass »debtool« standardmäßig keine Dateien überschreibt. Deshalb trägt »tee« im Paket »linvdr-tee.deb« von [6] auch den Namen »tee.new«. Erst das Post-Install-Skript »postinst-linvdr« aus »control.tar.gz«, das »debtool« nach dem Entpacken aller Dateien aufruft, löscht den symbolischen Link »/usr/bin/tee« und benennt »tee.new« in »tee« um.

Abbildung 1 zeigt den Inhalt der Datei »control« des Tee-Pakets als Beispiel für eine Paketbeschreibung. Der Aufbau ist nicht weiter kompliziert, achten Sie nur darauf, bei mehrzeiligen Beschreibungstexten stets ein Leerzeichen am Zeilenanfang einzufügen, damit jede Zeile mit einem eindeutigen Label beginnt.

Gut verpackt

Haben Sie in »control.tar.gz« den Inhalt des Verzeichnisses »control« und in »data.tar.gz« den Inhalt von »data« zusammengeschnürt, legen Sie von Hand noch mit »echo 2.0 > debian-binary« die letzte fehlende Datei an. Anschließend verpacken Sie alle drei Dateien mit dem Aufruf:

ar r Paket.deb debian-binary control.tar.gz data.tar.gz

Das Ergebnis könnten Sie sogar per »dpkg« auf einem echten Debian-System einspielen, auch wenn dies nicht sinnvoll ist – der Debian-Installer bemerkt keinen Unterschied. Umgekehrt können Sie jedoch Ihr eigenes Linux-System mit hunderten Debian-Paketen erweitern, ohne erst jedes einzeln mühsam selbst übersetzt zu haben. Sie können sich auf die wesentlichen Unterschiede konzentrieren und von der guten Arbeit des Debian-Projekts direkt profitieren.

Infos

[1] Busybox: [http://www.busybox.net]

[2] LinVDR: [http://linvdr.org]

[3] VDR: [http://www.cadsoft.de/vdr]

[4] Debtool von LinVDR 0.7: [https://www.linux-magazin.de/Service/Listings/2006/02/debtool/debtool]

[5] Paketbeschreibung für Debian Sarge (i386): [ftp://ftp.de.debian.org/debian/dists/sarge/main/binary-i386/]

[6] Tee-Update für LinVDR: [http://linvdr.org/download/linvdr/beta/0.7/linvdr-tee.deb]

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben