6    Paketmanagement

Der Umgang mit Software – Quellcode, Paketen und Paketmanagementlösungen – steht im Vordergrund dieses Kapitels. Erfahren Sie, wie Sie Ihre selbst entwickelte Software in Pakete schnüren, Update-Pakete erstellen und das Paketmanagement Ihrer Distribution richtig einsetzen.

Zu den Aufgaben einer Paketverwaltung (engl. packet management) gehören das Installieren, das Aktualisieren und das Deinstallieren von Software. Schon in den Anfangsjahren von Linux wurde solch ein System erforderlich. Durch die wachsende Anzahl von Programmen der GNU-Sammlung konnten Linux-Systeme fast alle Aufgaben bewältigen. Lediglich das Installieren der Software sorgte für Unmut, da das Übersetzen des Quellcodes (Kompilieren) auf dem eigenen System oft beschwerlich war. Vorausgesetzte Software (dependencies[ 6 ]) musste von Hand nachinstalliert werden, Updates sorgten für Konflikte mit anderer installierter Software, und die Deinstallation musste ebenfalls von Hand durchgeführt werden.

6.1    Paketverwaltung

Hier setzt die Paketverwaltung an. Sie löst Abhängigkeiten auf und versucht, notwendige Software selbstständig nachzuinstallieren. Sie entfernt Programme sauber aus dem System und prüft bei Updates, ob Überschneidungen existieren und wie diese gelöst werden können. Dafür musste die Software aber in eine entsprechende Form gebracht werden: in Pakete.

Eine Paketverwaltung besteht aus zwei Teilen. Der erste Teil ist für das Laden der Programme aus einem Repository[ 7 ] sowie für das Auflösen von Abhängigkeiten und Konflikten verantwortlich. Der zweite Teil, zum Beispiel dpkg (Debian Packet Management) oder rpm (RPM Packet Management), sorgt für die eigentliche Installation.

In diesem Kapitel erfahren Sie alles zu den zwei größten Paketverwaltungen dpkg und rpm. Sie erfahren, wie Pakete zu diesen Paketverwaltungen konvertiert werden, welche weiteren Programme es gibt und wie Sie selbst Pakete aktualisieren, erstellen und patchen können.

6.1.1    »rpm« oder »deb«?

Trotz aller Vorteile, die eine Paketverwaltung bietet, besitzen Paketverwaltungen auch Nachteile. Zum einen verfügen Sie zum Großteil lediglich über Binärpakete. Diese Pakete sind für eine Architektur übersetzt und für diese optimiert und auch nur auf dieser lauffähig. Dies führt zu statischen Paketen, die nicht voll an das System, auf dem sie laufen, angepasst sind. Zum anderen kommt es bei Paketverwaltungen auch zu Konflikten.

[»] Wenn in den Paketen Alpha und Beta teilweise die gleichen Dateien enthalten sind, können Sie nicht beide Pakete gleichzeitig installieren. Falls die Aktualisierung des Pakets Gamma auch die Aktualisierung des Pakets Delta fordert, das Paket Epsilon aber die »alte Version« des Pakets Delta benötigt, ist eine Aktualisierung von Gamma nicht möglich. Eine gute Paketverwaltung zeichnet sich dadurch aus, dass sie diese Konflikte effektiv löst.

In der heutigen Zeit haben sich drei Konzepte durchgesetzt:

Die ersten beiden Paketverwaltungen haben die Linux-Welt quasi in zwei Lager gespalten. Die letzte Variante findet eher selten Anwendung, aber Distributionen wie zum Beispiel Gentoo Linux verzichten ganz auf Binärpakete und stellen lediglich den Quellcode zur Verfügung, sodass jede Installation voll an das System angepasst wird.

Jede Distribution verfügt über ihre eigene Implementierung einer Paketverwaltung. Das hat zur Folge, dass zum Beispiel zwei auf rpm basierende Distributionen nicht zwingend miteinander kompatibel sein müssen.

»rpm«

Die Paketverwaltung rpm wurde ursprünglich als Red Hat Packet Management bezeichnet, da sie von Red Hat entwickelt wurde. Da rpm aber ein Teil der Linux Standard Base werden wollte, wurde das Projekt einfach in ein rekursives Akronym umbenannt: RPM Packet Management. Das Ziel vom rpm bestand darin, Softwarepakete sowohl für Entwickler als auch für den Anwender einfacher zu gestalten. Abhängigkeiten sollten berücksichtigt und automatisch aufgelöst werden, Redundanzen sollten vermieden werden, und das saubere Entfernen von Software sollte möglich gemacht werden. Ebenso sollte das Einspielen von Updates einfacher gestaltet werden, ebenso wie das sichere Verwalten von Konfigurationen.

1999 kam es zur Zweiteilung von rpm, da der Hauptentwickler Jeff Johnson Red Hat verließ und einen Fork des Projekts startete. Jetzt gibt es zwei rpm-Versionen: zum einen das in SUSE, Red Hat, Fedora und vielen anderen Distributionen verwendete rpm von rpm.org, zum anderen den Fork von Johnson, rpm5, der zum Beispiel in Alt Linux, ArkLinux und Unity Linux Anwendung findet.

Bei rpm-Paketen handelt es sich um komprimierte Dateien, denen ein binärer Header vorangestellt ist. Dieser Header ist nicht komprimiert, sodass er leicht durchsucht werden kann.

Die zentrale Datei eines Pakets im rpm-Format ist die SPEC-Datei. Sie enthält alle Metainformationen des Pakets, also Informationen darüber, was in dem Paket enthalten ist, wohin es installiert wird, wie es installiert wird, sowie Informationen zum Paket selbst.

Diese Datei ist in folgende acht Sektionen unterteilt:

Die Dateinamen der rpm-Pakete haben folgende Konvention:

<Bezeichnung>-<Versionsnummer>-<Revisionsnummer>.<Architektur>.rpm

Listing 6.1    Schema der »rpm«-Paketdateinamen

»deb«

Die Paketverwaltung deb wurde von Ian Murdock entwickelt. Die Bezeichnung deb bezieht sich hierbei auf die ersten drei Buchstaben der Linux-Distribution Debian. Die Zielsetzung von deb entspricht der von rpm, allerdings sind beide nicht miteinander kompatibel. Hierfür gibt es aber Konvertierungstools, die es erlauben, Pakete für die jeweils andere Paketverwaltung nutzbar zu machen.

Ein deb-Paket setzt sich aus folgenden Abschnitten zusammen:

Auch hier gibt es eine zentrale Datei, die für das Paket verantwortlich ist: control. In ihr sind sowohl alle Metainformationen zum Paket enthalten als auch die Installationsanweisungen.

Dateinamen von deb-Paketen folgen einer definierten Syntax:

<Bezeichnung>_<Versionsnummer>-<Revisionsnummer>_<Architektur>.deb

Listing 6.2    Schema der »deb«-Paketdateinamen

6.1.2    »yum«, »yast«, »zypper« oder »apt«?

Wie bereits erläutert wurde, besteht eine Paketverwaltung nicht allein aus einem Programm. Zu ihr gehört immer (mindestens) ein Tool, das sich um das Laden der Software, das Auflösen von Abhängigkeiten und die Beseitigung von Konflikten kümmert. Jede Distribution besitzt eine eigene Umsetzung. So findet yum auf Red-Hat-basierten Systemen Anwendung, yast und zypper auf SUSE-basierten und apt auf Debian-basierten. Wenn Distributionen binärkompatibel miteinander sind, können Sie auch Pakete aus der jeweils anderen Distribution installieren.

[»] Ubuntu- und Debian-Pakete sind zum Teil binärkompatibel, sodass Debian-Pakete auch unter einigen Ubuntu-Versionen lauffähig sind. Ebenso gilt dies für Red Hat und SUSE.

Die Bedienung der einzelnen Tools unterscheidet sich erheblich voneinander. Die Debian-basierte Variante apt ist eine Suite mit mehreren Anwendungen, die jeweils eine Anwendung für spezielle Aufgaben zur Verfügung stellt. Die Red-Hat-Variante yum kommt hingegen mit nur einem Programm aus, und die SUSE-Variante yast kann sowohl als Kommandozeilentool als auch im ASCII-Menü gesteuert werden, wobei ab openSUSE 10.2 das zusätzliche Tool zypper parallel zu yast eingesetzt werden kann.

[+] Neben den von den Distributionen ausgelieferten Programmen können auch unabhängige Programme eingesetzt werden. Dies ist aber in den meisten fällen nicht notwendig.

Tabelle 6.1 zeigt einen Auszug der Befehle, mit denen Sie die Paketverwaltung verschiedener Distributionen über die Kommandozeile bedienen können. Tabelle 6.2 zeigt, wie Sie lokale Pakete verwalten.

Aktion CentOS openSUSE Leap Debian/Ubuntu
Paket installieren yum install yast -i
zypper install
apt install
Paket deinstallieren yum remove yast --remove
zypper remove
apt remove
Paketinformationen abfragen yum info zypper info apt show
Paket zur Datei suchen yum provides zypper wp apt-file search
Alle installierten Pakete anzeigen yum list * - -

Tabelle 6.1    Auszug: Kommandozeilenbefehle für Repositorys

Aktion CentOS openSUSE Leap Debian/Ubuntu
Paket installieren yum install rpm -i dpkg -i
Paket deinstallieren yum remove rpm -e dpkg -r
Paketinformationen abfragen yum info rpm -qi dpkg -p
Paket zur Datei suchen yum provides rpm -qf -
Alle installierten Pakete anzeigen yum list * rpm -qa dpkg -l

Tabelle 6.2    Auszug: Kommandozeilenbefehle für lokale Pakete

6.1.3    Außerirdische an Bord – »alien«

Es gibt Software, die nur in einer Paketform angeboten wird und nicht als Quellcode zur Verfügung steht. Um diese Software auf dem eigenen System betreiben zu können, müssen Sie das Paket umwandeln. Hier eilt Ihnen alien zur Hilfe. Das ursprünglich vom Debian-Entwickler Christoph Lameter geschriebene Tool konvertiert Pakete in die Formate rpm, deb, slp (Stampedes), tgz (Slackwares) und pkg (Solaris).

Die Installation von alien setzt viele weitere Pakete voraus, unter anderem auch die Kompilierungsprogramme (gcc, make etc.). Auf Systemen, die auf Debian basieren, können Sie alien aus den Paketquellen installieren. Leider ist alien weder in CentOS noch in openSUSE Leap oder Ubuntu enthalten. Laden Sie den aktuellen Quellcode unter http://packages.debian.org/stable/source/alien herunter, und führen Sie nach dem Entpacken wie in der enthaltenen Datei INSTALL beschrieben die folgenden Befehle aus:

daniel@example:/usr/local/alien# perl MakeFiles.pl
[…]
root@example:/usr/local/alien# make
root@example:/usr/local/alien# make install

Listing 6.3    »alien« aus dem Quellcode installieren

Oder erzeugen Sie auf einem Debian-basierten System einfach ein rpm-Paket mit alien. Laden Sie dafür die entsprechende deb-Datei mit apt download alien herunter. Wenden Sie alien nun mit dem Schalter -r (oder --to-rpm) an:

root@example:/opt# alien -r alien_8.95_all.deb
alien-8.95-2.noarch.rpm generated

Listing 6.4    Umwandeln von »deb« in »rpm«

alien erzeugt nun die Datei alien-8.95-2.noarch.rpm. Wie Sie dem neuen Dateinamen entnehmen können, wurde auch die Versionsnummer angepasst. Falls Sie die eigentliche Versionsnummer des Pakets behalten wollen, verwenden Sie den Parameter -k beim Aufruf von alien.

[+]  Speicherort installierter Pakete

Installierte Pakete auf Systemen mit deb-Paketverwaltung finden Sie im Verzeichnis /var/cache/apt/archives/. Bei openSUSE Leap finden Sie die installierten Pakete unter /var/cache/zypp/packages/<Repository>:<RepoName>/rpm/ und bei CentOS unterhalb von /var/cache/yum.

Falls Sie ein Paket auf dem System konvertieren, auf dem die Software installiert werden soll, können Sie diese mit dem Schalter -i auch direkt von alien installieren lassen.