# 1.102.5

# Verwendung des Debian Paketmanagements

Beschreibung: Prüfungskandidaten sollten in der Lage sein, mit dem Debian Paketmanagement umzugehen. Dieses Lernziel beinhaltet das Benutzen von Kommandozeilen- und interaktiver Werkzeuge zum Installieren, Updaten oder Deinstallieren von Paketen sowie das Auffinden von Paketen, die spezifische Dateien oder Software enthalten (installierte bzw. nicht installierte Pakete). Ebenfalls enthalten ist das Abfragen von Informationen wie Version, Inhalt, Abhängigkeiten, Paketintegrität und Installationsstatus (ob installiert oder nicht) von Paketen.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- unpack
- configure
- `/etc/dpkg/dpkg.cfg`
- `/var/lib/dpkg/*`
- `/etc/apt/apt.conf`
- `/etc/apt/sources.list`
- dpkg
- dselect
- dpkg-reconfigure
- apt-get
- alien

Es gibt im Linux Bereich zwei große Modelle einer Paketverwaltung für zu installierende Programmpakete. Nachdem sich das alte `tgz`-Format für die Verwendung bei binären (vorcompilierten) Paketen als unzulänglich erwiesen hatte, weil es keinerlei Mechanismen zur Deinstallation aufwies, begannen zwei verschiedene Distributionen, eigene Paketverwaltungen aufzubauen. Debian und RedHat.

Inzwischen haben nahezu alle Distributionen das RedHat-Paketmanagement übernommen, nur Debian beharrt auf sein eigenes Modell. Und das nicht zu Unrecht, ist es doch gerade die Paketverwaltung von Debian, die schlichtweg als genial bezeichnet werden muß.

Als distributionsübergreifende Zertifizierung fordert LPI das Wissen um beide Formate. Beide Formate werden auch tatsächlich abgefragt und das nicht zu knapp. In diesem Kapitel wird die Debian-Verwaltung besprochen, im nächsten kommt dann die RedHat-Technik zur Sprache.

### Das grundlegende Prinzip der Debian Paketverwaltung

Debian Pakete enden mit der Endung `.deb`. Sie haben ein einheitliches Namensschema, das sich folgendermaßen zusammensetzt:

Programmname_Versionsnummer_Architektur`.deb`

Wobei Programmname der Name des Programmes (oder des Paketes) ist, unter dem es später dann auch angesprochen werden kann, Versionsnummer ist die Version des Programms (oder Paketes) und Architektur bezeichnet die Hardwarearchitektur, für die dieses Paket gedacht ist, also etwa `i386` für die PC-Architektur.

Ein Debian Paket besteht aus einem `ar`-Archiv, das wiederum zwei komprimierte `tar`-Archive und eine Versionsdatei beinhaltet. Das erste `tar`-Archiv (`data.tar.gz`) enthält die zu installierenden Dateien, das zweite (`control.tar.gz`) enthält die Metainformationen über das Paket, die Scripts, die zum Installieren und Deinstallieren benötigt werden sowie eine Prüfsumme.

Jedes Debian-Paket enthält vier Scripte, je eines das vor und nach der Installation bzw. vor und nach der Deinstallation abgearbeitet wird.

Wird ein Debian-Paket installiert, so werden die Informationen über dieses installierte Paket in mehrere Dateien im Verzeichnis `/var/lib/dpkg` abgelegt, so daß jederzeit eine Überprüfung der bereits installierten Pakete und Dateien stattfinden kann. Die Informationen werden folgendermaßen aufgeteilt:

- In der Datei `/var/lib/dpkg/available` werden die Paketinformationen aller zur Verfügung stehender (installierbarer) Pakete abgelegt.
- In der Datei `/var/lib/dpkg/status` werden die Informationen über den Status der Installation abgelegt, so daß unterschieden werden kann zwischen korrekt oder nur teilweise installierten Paketen.
- Im Verzeichnis `/var/lib/dpkg/info` liegen zu jedem installierten Paket die vier Scripte (`*.preinst, *.postinst, *.prerm, *.postrm`), eine Liste aller enthaltener Dateien (`*.list`), die md5-Prüfsummendatei (`*.md5sums`) und evt. noch andere Informationen wie die zur Verfügung gestellten Libraries (`*.shlibs`).

Mit Hilfe dieser Informationen sind sowohl Installation, als auch Deinstallation von Paketen sehr sicher und umfassend möglich. Man kann das Verzeichnis `/var/lib/dpkg` also als Systemdatenbank der installierten Pakete betrachten. In der Regel sind keine manuellen Zugriffe auf dieses Verzeichnis notwendig, alle Zugriffe werden mit den Hilfsprogrammen erledigt, die im Folgenden näher besprochen werden.

### Das dpkg-Programm

Das Programm dpkg ist sozusagen das Low-Level Paketverwaltungsprogramm. Mit ihm ist es möglich, direkt bestimmte Pakete zu installieren uder zu deinstallieren. Noch eine Stufe weiter unten liegt das Programm dpkg-deb, das die reine Archivverwaltung (Packen/Entpacken) erledigt, aber niemals manuell aufgerufen wird.

Das dpkg Programm muß nur dann manuell aufgerufen werden, wenn direkt vorliegende `.deb`-Pakete installiert werden sollen. Später werden wir das Programm apt-get kennenlernen, das sich auch um den Bezug der Pakete kümmert, dann aber selbstständig dpkg aufruft, um Pakete zu installieren bzw. zu deinstallieren. Ist jedoch ein Paket manuell z.B. aus dem Internet besorgt worden, dann benötigen wir dpkg.

#### Pakete installieren mit dpkg

Um ein Paket mit dpkg zu installieren wird folgender Befehl ausgeführt:

      dpkg [Optionen] -i | --install Paketdatei.deb

(-i | --install bedeutet entweder -i oder --install). Wenn als Option `-R` oder `--recursive` angegeben wurde, so steht statt eines Paketnamens ein Verzeichnisname. Alle Debianpakete des genannten Verzeichnisses werden dann installiert.

Die Installation besteht aus folgenden Einzelschritten:

1. Die Kontrolldateien des neuen Paketes werden entpackt.
2. Wenn eine ältere Version des selben Paketes bereits installiert war, wird das PreRemove-Script der älteren Version ausgeführt.
3. Das PreInst-Script des neuen Paketes wird ausgeführt.
4. Die Dateien des neuen Paketes werden entpackt und gleichzeitig werden die Dateien einer eventuell existierenden älteren Version gesichert, so daß im Falle eines Fehlers die Installation des neuen Paketes rückgängig gemacht werden kann.
5. Wenn eine ältere Version existierte, dann wird das PostRemove-Script der älteren Version ausgeführt.
6. Das neue Paket wird durch das Abarbeiten des PostInstall-Scripts konfiguriert.

#### Pakete deinstallieren mit dpkg

Wenn ein installiertes Paket entfernt werden soll. dann werden zwei Möglichkeiten angeboten. Entweder werden zwar alle Dateien entfernt, aber die Konfigurationsdateien des Paketes bleiben installiert, oder es werden wirklich alle Dateien, auch die Konfigurationsdateien entfernt.

Zum normalen Deinstallieren (ohne Entfernung der Konfigurationsdateien) wird folgender Befehl benutzt:

      dpkg [Optionen] -r | --remove Paketname

Um wirklich alles zu entfernen benutzt man

      dpkg [Optionen] -P | --purge Paketname

Paketname ist hier der Name des Paketes, nicht der Name der Paketdatei. Wurde die Datei `foo_1.0.23_i386.deb` installiert, so ist der Paketname einfach nur `foo`.

Das Entfernen der Pakete geht in folgenden Schritten vor sich:

1. Das PreRemove-Script des Paketes wird abgearbeitet.
2. Die zu entfernenden Dateien werden gelöscht.
3. Das PostRemove-Script wird abgearbeitet.

#### Informationen über installierte Pakete abfragen

Um Informationen über ein bestimmtes installiertes Paket zu erhalten, wird der Befehl

      dpkg  -p|--print-avail Paketname

ausgeführt. dpkg liesst daraufhin die Informationen aus der Datei `/var/lib/dpkg/available` und gibt sie aus.

#### Auflisten der installierten Pakete

Um eine Liste aller oder bestimmter installierter Pakete zu bekommen, wird der Befehl

      dpkg -l | --list [Paketnamensmuster]

ausgeführt. Wird kein Namensmuster angegeben, so werden alle installierten Paketnamen ausgegeben, ansonsten nur die Pakete, deren Namen auf das angegebene Muster passen. Als Muster werden die üblichen Shell-Wildcards benutzt. Zu beachten ist, daß die Muster in Anführungszeichen gesetzt werden sollten, um die Shell daran zu hindern, sie zu interpretieren.

#### Auflisten der Dateien installierter Pakete

Um alle Dateien eines bestimmten Paketes aufzulisten, existiert der Befehl

      dpkg -L | --listfiles Paketname

Die Dateien, die von Installationsscripts angelegt wurden, werden hier nicht angezeigt.

#### Abfrage des Installationsstatus

Debian-Pakete, die installiert werden, bekommen einen bestimmten Status, der angibt, wie weit die Installation fortgeschritten ist. Wenn eine Installation aus welchen Gründen auch immer, nicht vollständig abgeschlossen wurde, so kann das später aus dem Status entnommen werden. Folgende Stati sind gültig:

installed
  Das Paket ist vollständig installiert
half-installed
  Die Installation wurde nicht vollständig ausgeführt
not-installed
  Das Paket ist nicht installiert
unpacked
  Das Paket ist zwar ausgepackt, aber nicht konfiguriert
half-configured
  Das Paket ist ausgepackt und die Konfiguration wurde begonnen, aber nicht korrekt abgeschlossen
config-files
  Nur die Konfigurationsdateien des Paketes existieren auf dem System (typischerweise nach einer Deinstallation mit -R)

Um den Status eines Paketes abzufragen wird der Befehl

      dpkg -s | --status Paketname

ausgeführt. Die Informationen werden der Datei `/var/lib/dpkg/status` entnommen.

#### Aus welchem Paket stammt eine bestimmte Datei?

Mit dem Befehl

      dpkg -S | --search Dateinamesmuster

werden die installierten Dateien aus `var/lib/dpkg/info` durchsucht und alle Paketnamen zurückgegeben, die entsprechende Dateien enthalten. Zur Musterbildung stehen alle Shell-Wildcards zur Verfügung.

#### Optionen für dpkg

Vor jedem der besprochenen Befehle können verschiedene Optionen gesetzt werden, die den Ablauf des Befehls modifizieren können. Diese Optionen beziehen sich z.B. auf den Umgang mit Abhängigkeiten, oder ab wievielen Fehlern sich dpkg weigert, weiterzuarbeiten. Diese Optionen können entweder direkt an der Kommandozeile eingegeben werden, oder in die Datei `/etc/dpkg/dpkg.cfg` eingetragen werden. In letzterem Fall, werden die Optionen für jeden dpkg Befehl angewandt. Wichtige Optionen sind:

--abort-after=Zahl
  Gibt an, nach wievielen Fehlern dpkg beendet werden muß. Voreingestellt ist 50.
-B|--auto-deconfigure
  Wenn ein Paket deinstalliert wird, so ist es möglich, daß ein anderes installiertes Paket dieses Paket gebraucht hätte. Mit dieser Option werden automatisch alle anderen Pakete auch deinstalliert, die das zu installierende Paket benötigt hätten.
--ignore-depends=Paket
  Abhängigkeiten für das angegebene Paket werden ignoriert. Es werden solche Abhängigkeiten zwar überprüft, aber es werden nur Warnungen statt Fehlermeldungen angezeigt, wenn nicht erfüllte Abhängigkeiten auftreten.
--refuse-downgrade | -G
  Ein Paket, von dem eine neuere Version bereits installiert ist, wird nicht installiert

Eine vollständige Liste aller denkbaren Optionen sind der Handbuchseite zu entnehmen.

### dpkg-reconfigure

Wenn ein bereits installiertes Paket erneut konfiguriert werden soll, so kann das durch den Aufruf von

      dpkg-reconfigure Paketname

vorgenommen werden. Das hat aber nur dann eine tatsächliche Bedeutung, wenn ein Paket ein `debconf`-Script enthält.

### dselect

Das Programm dselect ist ein menügeführtes Frontend für dpkg. Es übernimmt aber nicht nur die Aufgabe, Pakete zu installieren oder zu deinstallieren, sondern auch die Verwaltung der zur Verügung stehenen Pakete und der gegenseitigen Abhängigkeiten.

dselect bietet verschiedene Methoden an, um die zur Verfügung stehenden Pakete zu managen. Dabei geht es hauptsächlich darum, woher die Debian-Pakete bezogen werden sollen. Folgende Methoden werden angeboten:

cdrom
  Installiert von einer Debian-CDROM. Die CDROM kann, muß aber nicht gemountet sein und sollte ein ISO9660 Dateisystem beinhalten.
nfs
  Installiert über einen (noch nicht gemounteten) NFS-Server. Der Server muß die Paketbeschreibungsdateien (`Packages.gz`) jeder Distributionsabteilung (stable, contrib und non-free) zur Verfügung stellen und natürlich die entsprechenden `.deb` Dateien.
harddisk
  Installiert von einer noch nicht gemounteten Festplattenpartition. Diese Partition muß die selben Elemente wie ein NFS-Server enthalten.
mounted
  Installation von einem bereits gemounteten Dateisystem. Dabei kann es sich entweder um eine gemountete Festplattenpartition oder um eine gemounteten NFS-Freigabe handeln. Zum Inhalt gilt das selbe wie bei NFS-Server und Festplatte.
floppy
  Installation über einen Stapel Disketten, von dem die erste Disk die Paketinformationen enthalten sollte. Veraltert.
apt
  Benutzt die neue Methode, die weiter unten bei apt-get beschrieben wird. Hier kann die Installationsquelle entweder über ein Netz (ftp/http) oder über das Dateisystem (file) angesprochen werden.

Das dselect Programm wird normalerweise ohne weitere Parameter aufgerufen. Es bietet menügeführt folgende Möglichkeiten:

Zugriff (access)
  Auswahl der Zugriffsmethode (siehe oben).
Erneuern (update)
  Erneuert die Liste der verfügbaren Pakete, wenn möglich.
Auswählen (select)
  Menügeführte Auswahl aller zu installierender oder zu entfernender Pakete.
Install
  Installiert die Pakete, die angewählt wurden.
Konfig
  Konfiguriert Pakete, die bei der letzten Installation nicht vollständig konfiguriert wurden.
Löschen (remove)
  Entfernt die zum Löschen markierten Pakete.

Als menügeführtes Programm ist die Bedienung von dselect zwar manchmal gewöhnungsbedürftig, jedoch nicht weiter schwierig.

### apt-get

apt-get ist das Kommandozeilenprogramm, das die modernste der Zugriffsmethoden auf Debian-Pakete steuert. Damit ist es möglich, die Installation und verschiedene andere Aufgaben der Paketverwaltung über ein einfaches Kommando auszuführen. Das Programm speichert seine Konfiguration in der Datei `/etc/apt/apt.conf` oder bei den moderneren Versionen in mehreren Verzeichnissen unter `/etc/apt/apt.conf.d`.

Die Quellen, von denen apt-get seine Debian-Pakete bezieht, werden in der Datei `/etc/apt/sources.list` angegeben. Diese Datei kann entweder von Hand erstellt/manipuliert werden oder über das Programm dselect im Menüpunkt Zugriff.

apt-get wird immer in einer der folgenden Formen aufgerufen:

apt-get upgrade
  Holt die neuesten Paketbeschreibungen der in `/etc/apt/sources.list` angegebenen Installationsquellen.
apt-get install Paketname
  Installiert das angegebene Paket von den eingestellten Installationsquellen. Das Paket und alle weiteren notwendigen Pakete die von ihm erfordert werden, wird vollständig installiert (mit dpkg -i).
apt-get remove Paketname
  Das angegebene Paket wird deinstalliert.
apt-get source Paketname
  Das Quellcode-Paket des angegebenen Paketes wird installiert.

Seine wahre Stärke spielt apt-get aus, wenn als Quellen offizielle Debian-Server im Internet angegeben wurden und der Paketname des zu installierenden Paketes bekannt ist. Wird z.B. festgestellt, daß auf einem System das Programm foo nicht installiert ist, so kann durch die Angabe des Befehls

      apt-get install foo

die Installation des Programms ausgeführt werden, ohne lange ein menügeführtes Programm aufzurufen. Es existieren inzwischen auch mehrere Frontends für apt-get. Für Textterminals gibt es aptitude und für graphische Terminals kann gnome-apt verwendet werden.

### alien

Debian ist die Distribution, die die meisten Pakete von allen bekannten Distributionen anbietet. Falls trotzdem einmal ein Paket nicht im `.deb` Format vorliegen sollte, man also gezwungen ist, auf ein `.rpm`-Paket zurückzugreifen, gibt es speziell dafür das Programm alien.

alien konvertiert verschiedene Paketformate in jeweils andere um. Das Programm kann mit folgenden Formaten umgehen:

- RedHat (rpm)
- Debian (deb)
- Stampede (slp)
- Slackware (tgz)
- Solaris (pkg)

Die Aufrufform ist sehr einfach. alien erkennt das Format einer angegebenen Paketdatei automatisch und konvertiert es dann in das angegebene Format. Das gewünschte Ausgabeformat wird durch die folgenden Parameter angegeben:

--to-deb
  Aus dem angegebenen Paket wird ein Debian-Paket erstellt
--to-rpm
  Aus dem angegebenen Paket wird ein RedHat-Paket erstellt
--to-tgz
  Aus dem angegebenen Paket wird ein Slackware-Paket erstellt
--to-slp
  Aus dem angegebenen Paket wird ein Stampede-Paket erstellt

Wenn also das Paket `foo-1.2.34.i386.rpm` existiert, und daraus ein Debian-Paket erstellt werden soll, so genügt der Befehl

      alien --to-deb foo-1.2.34.i386.rpm

und alien erzeugt daraus das Paket `foo_1.2.34_i386.deb`

Jetzt kann dieses neu erstellte Paket mit dpkg -i installiert werden und wird so nahtlos in die Debian-Paketverwaltung integriert.