5.7 Debian-Repositories

5.7.1 Komplexe Repositories
5.7.2 Einfache Repositories
5.7.3 Erzeugen von Index-Dateien
5.7.4 Erzeugen von Release-Dateien
5.7.5 Paket-Pools

Ein Debian-Repository ist eine Sammlung von Debian-Paketen, die durch einige zusätzlich Dateien so organisiert sind, dass aus diesem Verzeichnisbaum heraus Pakete installiert werden können. Dies wird durch einige (wenige) zusätzliche Dateien ermöglicht. Dies sind im Wesentlichen Index-Dateien und Dateien mit Checksummen zu den Paketen. Fügt ein Anwender ein Repository seiner Datei /etc/apt/sources.list hinzu, so können alle darin anthaltenen Dateien mit den verfügbaren Werkzeugen leicht eingesehen oder installiert werden.

Repositories können sowohl online, auf einem FTP- oder HTTP-Server, als auch offline, beispielsweise auf CD-ROM, abgelegt werden und bestehen mindestens aus einem Verzeichnis mit Debian-Paketen sowie einer Datei Packages.gz (bei einem Binär-Repository) oder Sources.gz (bei einem Quellcode-Repository).

In der Datei Packages.gz sind zu jedem Paket Informationen über den Paketnamen, die Version, die Größe sowie eine Kurz- und Langbeschreibung, die Abhängigkeiten zu anderen Paketen und einige andere Informationen abgelegt. Diese Informationen können mit den Programmen zur Installation (wie beispielsweise dselect, apt-cache oder auch aptitude) angezeigt werden.

In der Datei Sources.gz finden Sie Informationen über den Namen, die Version und die Abhängigkeiten zum Übersetzen des Quellcodes („build dependencies“) zu jedem Paket. Diese Informationen werden von apt-source und anderen Programmen genutzt.

Die Datei Release, die nicht zwingend vorhanden sein muss, enthält einige Informationen über das Repository, die für das „Pinning (siehe APT Pinning ) von Paketen benötigt werden. Das Erzeugen einer Release-Datei ist in Verwaltung des Spiegels beschrieben.

Neben dieser vereinfachten Form von Repositories besteht auch die Möglichkeit, Repositories für unterschiedliche Hardware-Architekturen anzulegen. APT wird dann automatisch die für die verwendete Architektur passenden Pakete finden und installieren. Weiterhin können Pakete zu Gruppen zusammengefasst werden, beispielsweise main, contrib und non-free.

Aus Benutzer- und Adminstratorsicht gibt es zwei Arten von Repositories. Einfach zu benutzende Repositories sind für den Administrator recht aufwendig einzurichten. Repositories mit einer einfachen Struktur sind dagegen für den Benutzer schwieriger zu handhaben. Für Repositories, die Pakete für verschiedene Architekturen bereitstellen sollen, sind die komplexen Repositories vorzuziehen. Diese sind für den Benutzer einfacher zu handhaben, erfordern aber vom Administrator einen erhöhten Aufwand.

5.7.1 Komplexe Repositories

Die Verzeichnisstruktur eines komplexen (oder auch „automatischen“) Repositorys stellt sich für die verschiedenen Debian-Architekturen und Bereiche wie folgt dar:

(Wurzelverzeichnis des Repositories) 
| 
+-dists
  | 
  |-stable
  | |-main
  | | |-binary-alpha 
  | | |-binary-arm
  | | |-binary-...
  | | +-source 
  | |-contrib
  | | |-binary-alpha 
  | | |-binary-arm
  | | |-binary-...
  | | +-source 
  | +-non-free
  |   |-binary-alpha
  |   |-binary-arm
  |   |-binary-...
  |   +-source
  |
  |-testing 
  | |-main
  | | |-binary-alpha 
  | | |-binary-arm
  | | |-binary-...
  | | +-source 
  | |-contrib
  | | |-binary-alpha 
  | | |-binary-arm
  | | |-binary-...
  | | +-source 
  | +-non-free
  |   |-binary-alpha
  |   |-binary-arm
  |   |-binary-...
  |   +-source
  |
  +-unstable 
    |-main
    | |-binary-alpha 
    | |-binary-arm
    | |-binary-...
    | +-source 
    |-contrib
    | |-binary-alpha 
    | |-binary-arm
    | |-binary-...
    | +-source 
    +-non-free
      |-binary-alpha
      |-binary-arm
      |-binary-...
      +-source

Pakete, die einer freien Lizenz unterliegen (siehe Debian Free Software Guidelines) finden sich im Bereich „main“. Nicht-freie Software befindet sich in „non-free“, und in „contrib“ finden sich freie Pakete, die aber auf nicht-freien Paketen basieren. Debian unterstützt eine Anzahl weiterer Hardware-Architekturen, die in diesem Beispiel nicht alle aufgeführt sind.

In jedem binary-...-Verzeichnis befindet sich eine Index-Datei Packages.gz sowie eine optionale Datei Release. Die Pakete müssen nicht im Verzeichnis der Index-Datei liegen, da die Pfade zu den Paketen in der Index-Datei stehen. Dies ermöglicht es, sogenannte „Package-Pools“ zu erzeugen.

Es können beliebig viele Architekturen und Bereiche mit beliebigen Namen angelegt werden.

5.7.2 Einfache Repositories

Einfache Repositories bestehen aus einem Wurzelverzeichnis und beliebig vielen Unterverzeichnissen. Da die Benutzer sowohl das Wurzelverzeichnis als auch den relativen Pfad zu den Unterverzeichnissen angeben müssen, kann hier eine beliebige Struktur angelegt werden. So können auch alle Dateien (Index-Dateien und Pakete) im Wurzelverzeichnis liegen. Hier sehen Sie ein einfaches Repository mit zwei Unterverzeichnissen:

(Wurzelverzeichnis des Repositorys) 
|
|-binary
+-source

5.7.3 Erzeugen von Index-Dateien

Das Erzeugen der Index-Dateien für Binärpakete übernimmt das Programm dpkg-scanpackages (siehe dpkg-scanpackages ) bzw. dpkg-scansources (siehe dpkg-scansources für die Quellcodepakete. Beide Programme erzeugen die Ausgabe auf der Standard-Ausgabe, so dass dieses Ergebnis in eine Datei umgeleitet werden muss. Um die entstehenden Dateien zu komprimieren, kann im gleichen Arbeitsschritt noch das Programm gzip verwendet werden. Für ein einfaches Repository können die Index-Dateien für die Binär- und Quellcode-Pakete wie folgt erstellt werden:

$ cd Pfad/zum/Repository
$ dpkg-scanpackages binary /dev/null | gzip -9c > binary/Packages.gz
$ dpkg-scansources source | gzip -9c > source/Sources.gz

Eine detaillierte Anleitung zu den beiden Programmen findet sich in den oben beschriebenen Abschnitten, dort wird auch auf die notwendigen Argumente eingegangen.

Debian Pakete auf Webseiten verfügbar machen

Mit einem kleinen PHP-Skript (zu finden unter http://elonen.iki.fi/code/parse-apt-files.inc) ist es sehr einfach möglich die Dateien Packages.gz, bzw. Sources.gz zu durchsuchen und die Informationen zu den Paketen automatisch aufzubereiten. Alle gefundenen Pakete werden auf einer Webseite mit einem Link zum Download angeboten. Darüber hinaus wird zu jedem Paket die Beschreibung angezeigt.

Die Einbindung in die eigene Webseite erfolgt über die beiden Zeilen

include_once("parse-apt-files.inc");
parse_and_list( "Packages.gz", "Sources.gz" );

Werden auf der Seite Pakete für unterschiedliche Hardware-Architekturen zur Verfügung gestellt, so erfolgt die Einbindung in die Webseite wie folgt

include_once("parse-apt-files.inc");
parse_and_list( Array("i386/Packages.gz", "powerpc/Packages.gz"), "Sources.gz" );

5.7.4 Erzeugen von Release-Dateien

Um das „Pinning“ von Paketen zu ermöglichen (siehe Pinning ) muss eine Release-Datei in jedem Verzeichnis, in dem sich eine Index-Datei befindet, zur Verfügung gestellt werden. Release-Dateien sind einfach Text-Dateien mit folgendem Aufbau:

Archive: archive
Component: component
Origin: YourCompany
Label: YourCompany Debian repository
Architecture: architecture

Zum Erzeugen dieser Dateien kann auch das in Verwaltung des Spiegels beschriebene Skript verwendet werden.

Einträge in der Release-Datei

Archive

Der Name der Distribution, für die die Pakete vorgesehen sind, beispielsweise „stable“, „testing“ oder auch „unstable“.

Component

Der Bereich, dem die Pakete zugeordnet sind. Dies kann „main“, „non-free“ oder „contrib“ sein.

Origin

Der Name der Person, die dieses Repository erzeugt hat.

Label

Eine beliebige Beschreibung für dieses Repository.

Architecture

Hardware-Architektur, für die die Pakete erzeugt wurden, beispielsweise „i386“, „powerpc“, „alpha“ oder auch „sparc“.

Insbesondere müssen Sie darauf achten, dass die Angaben zu Archive und Architecture korrekt sind, da diese am häufigsten für das Pinning von Paketen eingesetzt werden. Alle anderen Angaben sind eher unwichtig.

5.7.5 Paket-Pools

Bei komplexen Repositories führt die umfangreiche Verzeichnisstruktur schnell zur Unübersichtlichkeit und auch zur Verschwendung von Plattenplatz, da viele Pakete (beispielsweise Dokumentation) für unterschiedliche Architekturen geeignet sind. Diese Pakete müssen nicht mehrfach im Repository vorgehalten werden.

Die Lösung dieses Problems sind so genannte „Package Pools“. Ein Pool ist ein gesondertes Verzeichnis unterhalb des Wurzelverzeichnisses des Repositorys, in dem alle Pakete (Binaries für alle Architekturen, für alle Distributionen und Bereiche sowie die Quellcode-Pakete) abgelegt werden. Durch die Verwendung von „override-files“ und einige Skripte können die oben genannten Probleme umgangen werden. Ein gutes Beispiel für die Verwendung eines solchen Pools ist sicherlich das Debian-Repository selbst.

Um die notwendigen Index-Dateien für ein solches Repository zu erzeugen, sollten Sie den Abschnitt zu apt-ftparchive aus dem Paket apt-utils zu Rate ziehen. Für einfache Repositories ist apt-move eine gute Hilfe.