Kapitel 5. Paketmanagement
Zurück | 5.15 `apt-get` | Weiter

## 5.15 `apt-get`

`apt-get` ist die zeitgemäße Benutzerschnittstelle zur Verwaltung von Paketen auf einem Debian-System. Während es mit `dpkg` möglich ist, jedes beliebige Debian-Paket zu installieren (wenn es zuvor auf die lokale Festplatte kopiert wurde), so ist `apt-get` zwingend auf eine Paketliste und damit auch eine sinnvolle `sources.list` angewiesen. Somit ist immer gewährleistet, dass das System in einem stabilen und fest definierten Zustand verbleibt. Mit `apt-get` wird dem Administrator ein ebenso elegantes wie auch mächtiges Werkzeug gegeben. Dies haben auch viele andere Distributionshersteller erkannt und haben `apt-get` in die eigenen Distributionen aufgenommen. `apt-get` ist somit auch auf RPM-basierten Systemen, wie beispielsweise Novell/SuSE oder RedHat/Fedora zu Hause. Die Entwicklung wird dabei über die Webseite koordiniert. Eine Übersicht von Repositories mit RPM-Paketen, die via APT installiert werden können, finden Sie unter http://freshrpms.net/apt/repositories.html.

Dieses Programm ohne grafische Benutzeroberfläche ist recht einfach zu benutzen. Grafische Frontends zu `apt` sind mit `aptitude` und `gnome-apt` verfügbar.

### 5.15.1 Status-Report

Bevor `apt-get` die gewünschten Aktionen, wie zum Beispiel das Löschen oder Installieren einzelner Pakete, ausführt, die das System verändern, werden Sie über den zukünftigen Zustand des Systems informiert. Es werden folgende Informationen angezeigt: die Anzahl der Pakete, die aktualisiert werden (neuere Version), die Anzahl der Pakete, die nicht verändert werden (kept back), die Anzahl der zu löschenden Pakete sowie die Anzahl der neu zu installierenden Pakete.

Zusätzlich werden, wenn Sie die Option `install` benutzen, die Pakete ausgewählt und angezeigt, die aufgrund der Abhängigkeiten der zu installierenden Pakete benötigt werden. Hier ein Beispiel:

         The following extra packages will be installed:
           libdbd-mysql-perl xlib6 zlib1 xzx libreadline2 libdbd-msql-perl
           mailpgp xdpkg fileutils pinepgp zlib1g xlib6g perl-base
           bin86 libgdbm1 libgdbmg1 quake-lib gmp2 bcc xbuffy
           squake pgp-i python-base debmake ldso perl libreadlineg2
           ssh

Sollte es notwendig sein, Pakete zu löschen, oder wurden Pakete zum Entfernen ausgewählt, so werden auch diese gesondert angezeigt.

         The following packages will be REMOVED:
           xlib6-dev xpat2 tk40-dev xkeycaps xbattle xonix
           xdaliclock tk40 tk41 xforms0.86 ghostview xloadimage xcolorsel
           xadmin xboard perl-debug tkined xtetris libreadline2-dev perl-suid
           nas xpilot xfig

Diese Liste sollte aufmerksam geprüft werden, um sicherzugehen, dass nicht versehentlich Pakete entfernt werden.

Wenn Pakete neu installiert werden, so wird auch darüber informiert:

         The following NEW packages will installed:
           zlib1g xlib6g perl-base libgdbmg1 quake-lib gmp2 pgp-i python-base

Dies dient nur zur Information; diese Pakete sind bisher nicht auf Ihrem System installiert.

Bei der Auswahl der Pakete kann es passieren, dass aufgrund von nicht erfüllten Abhängigkeiten einzelne Pakete in der aktuellen Version behalten werden. Da nicht alle benötigten Komponenten installiert werden können, werden diese Pakete nicht aktualisiert (kept back).

         The following packages have been kept back
           compface man-db tetex-base msql libpaper svgalib1
           gs snmp arena lynx xpat2 groff xscreensaver

Immer wenn ein System mit der Option `upgrade` aktualisiert wird, kann es passieren, dass einzelne Pakete nicht aktualisiert werden können, weil diese auf Paketen basieren, die noch nicht in der benötigten Version verfügbar sind, oder aber es bestehen Konflikte mit bereits installierten Paketen. In diesem Fall werden die Pakete im aktuellen Zustand gehalten. Sie können `apt-get install` benutzen, um diese Pakete trotzdem zu aktualisieren.

         The following held packages will be changed:
           cvs

Wenn Sie ein auf „hold“ gesetztes Paket aktualisieren, bekommen Sie die Meldung, dass dieses Paket verändert (changed) wird. Außer bei `apt-get install` kann diese Meldung auch bei `apt-get dist-upgrade` auftreten.

Abschließend findet sich noch eine Zusammenfassung über die Anzahl der betroffenen Pakete. Weiterhin wird angezeigt, welches Datenvolumen übertragen werden muss und wie viel Festplattenplatz zusätzlich benötigt wird (oder auch frei wird).

    206 packages upgraded, 8 newly installed, 23 to remove and 51 not upgraded.
    12 packages not fully installed or removed.
    Need to get 65.7M/66.7M of archives. After unpacking 26.5M will be used.

Die erste Zeile ist eine knappe Zusammenfassung in Zahlen zu den bereits vorher ausgegebenen Informationen. In der zweiten Zeile finden Sie die nicht installierten Pakete, die bereits entpackt, aber nicht konfiguriert wurden („N packages not fully installed or removed“). In der dritten Zeile finden Sie die Informationen über den benötigten Platz und die zu übertragenden Daten. Hierbei steht die erste Zahl für die tatsächlich noch zu übertragenden Daten und die zweite für den Gesamtwert. Wenn bereits Pakete bei einer früheren Installation (möglicherweise auch nur teilweise) übertragen worden sind, aber nicht installiert werden konnten, so werden diese gespeichert und nicht noch einmal übertragen.

Wenn Sie nun mit der Installation beginnen (dies müssen Sie bei `apt-get install` mit einem `y` anstoßen), werden die Pakete von dem ausgewählten Medium gelesen und installiert.

### 5.15.2 Status-Anzeige

Während des Herunterladens von Archiven und Paketdateien zeigt `apt-get` eine Reihe von Informationen an:

    sushi:/root# apt-get update
    Get:1 ftp://linux frozen/main Packages [833kB]
    Get:2 ftp://linux frozen/main Release [93B]
    Get:3 ftp://linux frozen/contrib Packages [33.4kB]
    Get:4 ftp://linux frozen/contrib Release [96B]
    Get:5 ftp://linux frozen/non-free Packages [78.1kB]
    Get:6 ftp://linux frozen/non-free Release [97B]
    Get:7 ftp://linux stable/non-US Packages [8880B]
    Get:8 ftp://linux stable/non-US Release [95B]
    Fetched 953kB in 12s (74.1kB/s)
    Reading Package Lists... Done
    Building Dependency Tree... Done

Unmittelbar während des Downloads wird auch der Fortschritt angezeigt, inklusive der voraussichtlich noch benötigten Zeit für die Übertragung:

    11% [5 frozen/non-free `Waiting for file' 0/32.1k 0%] 2203b/s 1m52s

In den mit `Get:` beginnenden Zeilen stehen die benutzte Methode (hier `ftp`) und der benutzte Server. Den Servernamen können Sie in einem lokalen Netz auch verkürzt angeben, wie hier mit `linux` gezeigt. Weiterhin werden der Bereich (`frozen` und `stable`) sowie die Verzeichnisse (`main`, `contrib` usw.) und die Dateinamen mit der Dateigröße angezeigt.

Bei der Installation von Paketen sieht der Vorgang ähnlich aus:

    sushi:/root# apt-get install aptitude
    Reading Package Lists... Done
    Building Dependency Tree... Done
    The following NEW packages will be installed:
    aptitude
    0 packages upgraded, 1 newly installed, 0 to remove and 3 not upgraded.
    Need to get 148kB of archives. After unpacking 471kB will be used.
    Get:1 ftp://ftp.debian.de potato/main aptitude 0.0.4a-3 [148kB]
    Fetched 148kB in 5s (25.3kB/s)
    Selecting previously deselected package aptitude.
    (Reading database ... 22625 files and directories currently installed.)
    Unpacking aptitude (from .../aptitude_0.0.4a-3_i386.deb) ...
    Setting up aptitude (0.0.4a-3) ...

Hier wird, in der Zeile „Get:“, der Paketname der zu installierenden Software angezeigt. Danach wird das Paket entpackt und installiert.

### Installation von Paketen überwachen

Für den laufenden Betrieb werden von den verschiedenen Diensten auf einem System Logdateien (im Verzeichnis `/var/log/`) erzeugt. Leider findet sich dort keine Datei die Informationen zu den installierten Debian Paketen bietet. Das Programm `apt-history` (http://redclay.altervista.org/archivio/python/apt-history/apt-history_0.1/) bietet die Möglichkeit Informationen zum aktuellen Status der installierten Pakete zu sammeln und diese anzuzeigen. Die Informationen dazu werden im Verzeichnis `/var/log/apt-history/` abgelegt.

Mit der Option `log` wird der aktuelle Zustand der installierten Pakete gespeichert. Nach dem Upgrade oder auch der Installation von neuen Paketen wird `apt-history log` erneut (mit Administratorrechten) aufgerufen um die Informationen zu aktualisieren. Mit der Option `show` lässt sich der Zustand der Pakete anzeigen, hier ein kleines Beispiel

    fr@wasabi:~$ apt-history show
    2005-06-13 15:07:08: upgrade  dpkg=1.10.27                             1.10.28

Hier wurde lediglich das Paket `dpkg` auf den aktuellen Stand gebracht.

Die Option `show` kann noch mit den Begriffen `install`, `upgrade`, `remove` erweitert werden, es werden dann nur die betreffenden Pakete angezeigt. Die Option `clean` löscht die Informationen über den Paketstatus. Ein etwas ausführlicheres Beispiel, nachdem weitere Pakete aktualisiert wurden

    fr@wasabi:~$ python apt-history show
    2005-06-13 15:07:08: upgrade  dpkg=1.10.27                             1.10.28
    2005-06-13 15:23:01: upgrade  mutt=1.5.9-1                             1.5.9-2
    2005-06-13 15:23:01: upgrade  mysql-server=4.0.24-5                    4.0.24-10
    2005-06-13 15:23:01: upgrade  mysql-common=4.0.24-5                    4.0.24-10
    2005-06-13 15:23:01: upgrade  libmysqlclient12=4.0.24-5                4.0.24-10
    2005-06-13 15:23:01: upgrade  passwd=1:4.0.3-31sarge3                  1:4.0.3-31sarge5
    2005-06-13 15:23:01: upgrade  mysql-client=4.0.24-5                    4.0.24-10

Um nicht nach jeder Paketaktion das Programm `apt-history` von Hand aufrufen zu müssen, kann die Datei `/etc/apt/apt.conf.d/30apt-history` mit dem folgenden Inhalt angelegt werden

    // Update apt-history log
    DPkg::Post-Invoke {"apt-history log; true"};

Dies führt dazu das `apt-history` nach jedem Aufruf von `dpkg` (alle APT-Werkzeuge setzen auf `dpkg` auf) ausgeführt wird.

### 5.15.3 Optionen und Kommandos

apt-get benutzt folgende Syntax:

`apt-get [options] [command] [package ...]`

Die Optionen werden Sie sicher seltener benötigen, daher zuerst einige Worte zu den einzelnen Kommandos:

`check`

  Bei jedem Start von `apt` (es sei denn, Sie benutzen die Option `update`) wird eine Reihe von Prüfungen durchgeführt, um sicherzustellen, dass `apt` funktionsfähig und Ihr System in einem guten Zustand ist. Sie können diese Prüfungen auch zu jeder Zeit selbst anstoßen:

      sushi:/root# apt-get check
      Reading Package Lists... Done
      Building Dependency Tree... Done

  Als Erstes werden die Paketdateien anhand der Informationen in `/etc/apt/sources.list` eingelesen. Wenn Sie diesen Vorgang noch einmal wiederholen, werden Sie feststellen, dass der zweite Test deutlich schneller beendet ist, die Informationen werden von `apt` zwischengespeichert. Für Paketdateien, die nicht gefunden werden, wird ggf. eine Warnung ausgegeben; diese Pakete werden dann ignoriert.

  Im zweiten Schritt wird eine detaillierte Analyse des Systems durchgeführt, inklusive aller Abhängigkeiten. Es werden von jedem installierten oder bereits entpackten, aber noch nicht konfigurierten Paket die Abhängigkeiten geprüft. Wenn dabei ein Problem auftaucht, wird dies angezeigt, und `apt-get` bricht die weitere Bearbeitung ab.

      sushi:/root# apt-get check
      Reading Package Lists... Done
      Building Dependancy Tree... Done
      You might want to run apt-get -f install' to correct these.
      Sorry, but the following packages have unmet dependencies:
        9fonts: Depends: xlib6g but it is not installed
        uucp: Depends: mailx but it is not installed
        blast: Depends: xlib6g (>= 3.3-5) but it is not installed
        adduser: Depends: perl-base but it is not installed
        aumix: Depends: libgpmg1 but it is not installed
        debiandoc-sgml: Depends: sgml-base but it is not installed
        bash-builtins: Depends: bash (>= 2.01) but 2.0-3 is installed
        cthugha: Depends: svgalibg1 but it is not installed
                 Depends: xlib6g (>= 3.3-5) but it is not installed
        libreadlineg2: Conflicts:libreadline2 (< 2.1-2.1)

  In diesem Beispiel gibt es eine ganze Reihe Probleme: Einige Pakete sind gar nicht installiert, bei anderen Paketen sind falsche Versionen installiert. Für jedes einzelne Paket, bei dem ein Problem festgestellt wurde, wird eine Zeile ausgegeben, mit den Informationen, um welches Paket es sich handelt und welches Problem festgestellt wurde.

  Es gibt zwei Möglichkeiten, wie es zu solchen Problemen kommen kann: Bei einem „Upgrade“ kann es passieren, dass ein benötigtes Paket fehlt, oder es ist während der Installation eines Pakets ein Problem aufgetreten. Wenn Letzteres der Fall ist, dann wurde das Paket zwar entpackt, aber nicht korrekt konfiguriert.

  Beide Situationen können von `apt` in den meisten Fällen mit der Option `-f` selbst behoben werden. Wenn Sie `dselect` mit der Methode `apt` benutzen, wird immer die Option `-f` verwendet, um eine einfache Verwendung zu gewährleisten.

  Trotzdem kann es passieren, dass bei einem schweren Problem apt nicht in der Lage ist, das Problem zu beheben. In diesem Fall müssen Sie von Hand mit dem Programm `dpkg` den Konflikt beseitigen. Sie können danach mit `apt-get` fortfahren.

`update`

  aktualisiert die Übersicht der verfügbaren Pakete, liest also die Informationen aus den Dateien `Packages.gz` der jeweiligen Distribution ein. Sie sollten `update` immer ausführen, wenn Sie wissen, dass sich die Inhalte der Paketdateien beziehungsweise die verfügbaren Pakete auf dem Server geändert haben. Auf jeden Fall sollten Sie `update` vor dem Aufruf von `upgrade` oder `dist-upgrade` aufrufen.

`upgrade`

  Um alle auf dem System installierten Pakete auf die aktuelle Version zu bringen, können Sie `upgrade` benutzen. Alle bereits installierten Pakete, von denen eine neuere Version verfügbar ist, werden aktualisiert. Es werden keine Pakete gelöscht, die bereits installiert sind (und in den neuen Paketdateien nicht mehr enthalten sind), oder Pakete installiert, die noch nicht auf dem System vorhanden sind. Pakete, die bereits installiert sind und es bei einem Upgrade erforderlich machen, den Status anderer Pakete zu verändern, werden nicht aktualisiert. `apt-get update` muss vorab ausgeführt werden, so dass sichergestellt ist, dass die Paketinformationen auf dem neuesten Stand sind.

`dist-upgrade`

  ist eigentlich eine Ergänzung oder Erweiterung zu `upgrade`. Es wird hierbei dafür Sorge getragen, dass für das System wichtigere Pakete zuerst installiert werden. Hierbei werden in engen Grenzen auch Abhängigkeiten verändert, um ein Paket installieren zu können. Dies ist dann notwendig, wenn ein System komplett auf eine neue Version umgestellt werden soll und kein „sanfter“ Übergang gewährleistet werden kann.

`dselect-upgrade`

  Mit dieser Option werden auch die Paketinformationen „recommends“ und „suggests“ ausgewertet. Dies ist sonst nur mit `dselect` möglich. Diese Vorschläge für weitere Pakete sind zur Funktion des gewünschten Pakets nicht zwingend erforderlich, können aber durchaus sinnvoll sein.

`install`

  Diese Option benötigt noch einen oder mehrere Paketnamen. Jedes dieser Pakete (der Paketname, also beispielsweise `sendmail`, reicht hierbei aus) sowie die noch benötigten Pakete (diese werden automatisch ermittelt) werden auf Basis der Informationen in `/etc/apt/sources.list` geholt und installiert. Wenn Sie hinter den Namen des Pakets ein Minuszeichen (`-`) setzen, wird das Paket aus dem System entfernt, wenn es bereits installiert ist. Achten Sie darauf, dass das Minuszeichen (ohne ein Leerzeichen dazwischen) unmittelbar nach dem Paketnamen steht. Diese Funktion kann auch bei Konflikten bei der Installation einzelner Pakete sehr nützlich sein: Sie können so Pakete in einem Vorgang löschen und installieren. Die Option „install“ wählt immer die aktuellste verfügbare Version eines Pakets aus. Es kann jedoch sinnvoll sein, auch Zugriff auf ältere Programmversionen zu haben. Hierzu kann ab der Version 0.5.3 von `apt` folgende Syntax verwendet werden: `apt-get install sane/unstable`. Durch einen Slash (/) getrennt kann hinter dem Paketnamen das gewünschte Release eines Pakets angegeben werden.

  Eine weitere Möglichkeit ist es, falls verschiedene Versionen eines Pakets verfügbar sind, direkt die gewünschte Versionsnummer anzugeben. Zunächst sollte man mit `apt-cache` prüfen, welche Versionen eines Pakets verfügbar sind. Mit `apt-get install vim=6.0.093-2` kann dann ganz gezielt die gewünschte Version installiert werden.

`--reinstall`

  Diese Option installiert das gewünschte Paket komplett neu, auch wenn es bereits installiert ist. Beachten Sie, dass hierbei auch die Option `install` anzugeben ist!

`remove`

  Diese Funktion ist analog zu „install“, nur mit dem Unterschied, dass die Pakete standardmäßig entfernt werden, anstatt sie zu installieren. Analog zu dem eben Beschriebenen können Sie hier ein Pluszeichen (`+`) verwenden, um Pakete zu installieren.

`check`

  dient lediglich zur Diagnose. Es wird überprüft, ob sich irgendwelche Unstimmigkeiten in den Paketen finden.

`--purge remove`

  Löscht das gewünschte Paket und alle weiteren Pakete, die direkt von diesem Paket abhängig sind. Weiterhin werden alle zu den Paketen gehörenden Konfigurationsdateien gelöscht.

`clean`

  Dies löscht das lokale Verzeichnis, in dem sich die zu installierenden Pakete befinden. Alles, mit Ausnahme der lock-Datei, wird aus `/var/cache/apt/archives/` und `/var/cache/apt/archives/partial/` gelöscht.

`source`

  Dieses Kommando holt die notwendigen Dateien zur Erzeugung eines Binärpakets. Es können so angepasste Pakete erzeugt werden oder aber Pakete auf einer anderen Architektur übersetzt werden. Wichtig ist hierbei ein entsprechender „deb-src“-Eintrag in der Datei `sources.list`. Um alle zu einem Paket gehörenden Dateien von einem Server zu holen, reicht das Kommando `apt-get source paketname`. Es werden die aktuellen Versionen der Dateien `paketname.orig.tar.gz`, `paketname.dsc` und `paketname.diff.gz` im aktuellen Verzeichnis gespeichert.

  Um aus den Quellen direkt ein Binärpaket zu erzeugen, kann die Option `-b` angegeben werden. Das komplette Kommando lautet dann `apt-get source -b paketname`. Wenn die benötigten Source-Pakete bereits vorliegen, kann das Binärpaket auch direkt mit dem Kommando `dpkg-buildpackage -rfakeroot -us -uc` erzeugt werden.

`build-dep`

  Die meisten Softwarepakete benötigen bei der Übersetzung aus den Quellpaketen weitere Entwicklungspakete wie Libraries und Header-Dateien. Diese werden häufig nicht mitgeliefert und liegen in gesonderten Paketen vor. Das Debian-Paketsystem sieht so genannte „build dependencies“ vor, in denen alle Abhängigkeiten zur Erzeugung eines Pakets beschrieben sind.

  Das Kommando `apt-get build-dep paketname` sorgt dafür, dass alle zur Übersetzung eines Pakets benötigten Dateien auf dem System vorhanden sind.

`moo`

  Als kleine versteckte Option haben die Entwickler auch noch noch ein so genanntes „Easter-Egg“ eingebaut:

      fr@sushi:~$ apt-get moo
               (__)
               (oo)
         /------\/
        / |    ||
       *  /\---/\
          ~~   ~~
      ...."Have you mooed today?"...

Soweit zu den Parametern. Sie können noch folgende Optionen benutzen, um `apt-get` zu steuern:

`-h`

  Zeigt die Hilfe zu `apt-get` an.

`-m`

  Ignoriert eventuell fehlende Pakete.

`-d`

  Holt die gewünschten Pakete vom Server, ohne diese zu installieren.

`-f`

  Behebt die defekten Abhängigkeiten zwischen den Paketen. `apt-get -f install` versucht, diese automatisch zu reparieren.

`-s`

  Simulation, führt keine Aktionen aus.

`-u`

  Zeigt auch die zu aktualisierenden Pakete an.

`-y`

  Aktualisiert alle Pakete automatisch, indem alle Fragen mit „Yes“ beantwortet werden.

Hier nun ein Beispiel aus der Praxis zur Benutzung von APT:

Beachten Sie bitte, dass Pakete nur mit Superuser-Rechten (root) installiert werden können.

Zuallererst muss `apt` die Informationen über die verfügbaren Pakete erhalten; hierzu dient das Kommando `apt-get update`.

    sushi:/root # apt-get update
    Hit ftp://192.168.0.5 potato/main Packages
    Hit ftp://192.168.0.5 potato/main Release
    Get:1 ftp://192.168.0.5 potato/non-free Packages [78.6kB]
    Get:2 ftp://192.168.0.5 potato/non-free Release [99B]
    Fetched 68.5kB in 0s (104kB/s)
    Reading Package Lists... Done
    Building Dependency Tree... Done

Nachdem das System nun über den aktuellen Stand der Pakete informiert ist, können Sie weitere Pakete mittels `apt` installieren, was hier am Beispiel von `sane` gezeigt wird:

    sushi:/root# apt-get install sane
    Reading Package Lists... Done
    Building Dependency Tree... Done
    The following extra packages will be installed:
      libgimp1 libsane
    The following NEW packages will be installed:
      libgimp1 libsane sane
    0 packages upgraded, 3 newly installed, 0 to remove and 3 not upgraded.
    Need to get 703kB of archives. After unpacking 1729kB will be used.
    Do you want to continue? [Y/n]

Beachten Sie hierbei, dass automatisch die benötigten Pakete `libgimp1` und `libsane` ausgewählt wurden. Insgesamt werden also drei Pakete installiert. Weiter unten erhalten Sie noch Informationen über den später benötigten Festplattenplatz der Pakete sowie über die Größe der Pakete, die ja eventuell via FTP erst übertragen werden müssen. Wenn Sie mit den Angaben so einverstanden sind, bestätigen Sie dies mit der Eingabetaste, oder drücken Sie die Taste `n` und danach die Eingabetaste, um den Vorgang abzubrechen.

Wenn mehrere Pakete gleichzeitig installiert werden sollen, so können diese einfach hintereinander auf der Kommandozeile angegeben werden.

### Download aller installierten Pakete

Manchmal kann es wünschenswert sein, alle bereits installierten Pakete eines Systems erneut auf den Rechner zu kopieren, beispielsweise um eine Sicherungskopie zu haben oder um ein System zu duplizieren. Natürlich können die Pakete auch auf eine CD-ROM/DVD gebrannt oder in einen Spiegel eingefügt werden. Vorteilhaft bei dieser Methode ist es, dass ein in sich konsistentes System entsteht, in dem alle Abhängigkeiten erfüllt sind.

Ein Download der gewünschten Pakete kann mit folgenden Befehlen erzeugt werden:

    # COLUMNS=200 dpkg -l | grep '^ii' | awk '{ print $2 }' > /tmp/pkgliste
    # cat /tmp/pkgliste | xargs apt-get --download-only --reinstall -y install

Die erste Zeile listet via `dpkg` alle Pakete auf und filtert mittels `grep` nur die installierten heraus. Danach wird die zweite Spalte in die Datei `/tmp/pkgliste` geschrieben.

Die zweite Zeile gibt via `cat` die Liste der Dateien aus. Mit `xargs` wird jede Zeile an das Kommando `apt-get` weitergegeben. Die Kombination der `apt-get` Optionen `--reinstall` und `--download-only` sowie `-y` führt dazu, dass auch bereits installierte Pakete aus dem Netz geholt werden, aber keine Installation durchgeführt wird.

Die Debian-Pakete sind nach dem Download im Verzeichnis `/var/cache/apt/archives/` zu finden und können mit `apt-move` (siehe `apt-move` ) in eine Verzeichnisstruktur wie auf einem Debian-Spiegel verschoben werden. `apt-move` ist auch in der Lage, die entsprechenden `Packages.gz`-Dateien zu erzeugen.

### 5.15.4 `apt_preferences`

Über die APT Konfigurationsdatei `/etc/apt/preferences` kann detailliert festgelegt werden welche Versionen von Paketen installiert werden sollen.

Enthält die Datei `/etc/apt/sources.list` unterschiedliche Quellen für Pakete, dies kann auch unterschiedliche Distributionen (beispielsweise „stable“ und „testing“) betreffen, so kann es vorkommen, dass ein bestimmtes Paket in verschiedenen Versionen verfügbar ist. APT vergibt für jede Version eines bekannten Paketes eine Priorität. Installiert wird jeweils die Version eines Paketes mit der höchsten Priorität. Die APT Konfigurationsdatei überschreibt die ermittelte Priorität und erlaubt so eine genaue Kontrolle darüber welche Version installiert wird.

Sind über die Informationen in der `sources.list` gleiche Versionen eines Paketes aus unterschiedlichen Quellen verfügbar, so wird die in der `sources.list` zuerst genannte Quelle genutzt. Bei gleichen Versionsnummern eines Paketes ist keine Auswahl der Quelle über die APT Konfigurationsdatei möglich.

#### 5.15.4.1 Voreingestellte Prioritäten

Ist keine APT Konfigurationsdatei vorhanden, oder ist kein Eintrag in der Konfigurationsdatei vorhanden der auf ein Paket passt, so wird für dieses Paket die voreingestellte Priorität verwendet, welche der Distribution entspricht. Es besteht die Möglichkeit eine bestimmte Ziel-Release festzulegen aus der die Pakete installiert werden sollen, diese Distribution wird als „Target Release“ bezeichnet. Die Ziel-Release kann dem Programm `apt-get` auf der Kommandozeile übergeben werden, oder in der Konfigurationsdatei `/etc/apt/apt.conf`(siehe apt.conf) gesetzt werden. Auf der Kommandozeile wird die Ziel-Release wie folgt angegeben

    apt-get install -t testing paketname

Wurde eine Ziel-Release angegeben, so nutzt APT den folgenden Algorythmus um die Prioritäten eines Paketes zu ermitteln.

Priorität 100

  Wenn das Paket bereits installiert ist

Priorität 500

  Wenn das Paket nicht installiert ist und auch nicht zur Ziel-Release gehört

Priorität 990

  Wenn das Paket nicht installiert ist und zur Ziel-Release gehört.

Wird die Ziel-Release nicht angegeben, so vergibt APT die Priorität 100 an alle installierten Pakete und die Priorität 500 an alle nicht installierten Pakete. Danach folgt APT den nachfolgend beschriebenen Regeln, wobei die Regeln in der beschriebenen Reihenfolge abgearbeitet werden.

1. Ein Paket wird niemals mit einer kleineren Versionsnummer installiert (Downgrade) wenn die Priorität unter 1001 liegt. „Downgrade“ bedeutet, dass eine nicht aktuelle Version eines Paketes installiert wird, obwohl bereits eine aktuelle Version des Paketes installiert ist. Keine voreingestellte Priorität innerhalb von APT übersteigt den Wert 1000, ein solcher Wert kann ausschliesslich über die Voreinstellungsdatei (`preferences`) gesetzt werden. Der Downgrade eines Paketes ist in jedem Fall als problematisch anzusehen und sollte nach Möglichkeit vermieden werden. In vielen Fällen führt ein Downgrade zu einem nicht funktionierenden Paket oder gar zu schweren Problemen mit dem Gesamtsystem.

2. Das Paket mit der höchsten Priorität wird installiert.

3. Wenn zwei oder mehr Versionen eines Paketes die gleiche Priorität haben, so wird die Version mit der höchsten Versionsnummer installiert.

4. Wenn zwei oder mehr Versionen eines Paketes die gleiche Priorität und Versionnummer haben, aber die Pakete sich in den Metadaten unterscheiden, oder aber die Option `--reinstall` auf der Kommandozeile angegeben ist, so wird das nicht installierte Paket augewählt.

Am häufigsten ist die Situation anzutreffen, dass ein bereits installiertes Paket (Priorität 100) in einer Version installiert ist die nicht so aktuell (hoch) ist wie ein Paket welches über eine Quelle in der Datei `/etc/apt/sources.list` (Priorität 500 oder 990) verfügbar ist. Dieses Paket wird aktualisiert wenn das Kommando `apt-get install paketname` oder `apt-get upgrade` ausgeführt wird.

Seltener Tritt der Fall ein, dass ein bereits installiertes Paket in einer aktuelleren Version vorhanden ist und kein Paket aus einer der in der Datei `/etc/apt/sources.list` genannten Quellen eine höhere Versionsnummer aufweist . In diesem Fall wird kein Downgrade durchgeführt wenn das Kommando `apt-get install paketname` oder `apt-get upgrade` ausgeführt wird.

Manchmal ist die bereits installierte Version eines Paketes aktueller als die zur Ziel-Release gehörende Version, jedoch nicht so aktuell wie ein Paket welches aus einer anderen Distribution verfügbar ist. In diesem Fall wird das Paket durch das Kommando `apt-get install paketname` oder `apt-get upgrade` aktualisiert, da eine der verfügbaren Versionen eine höhere Priorität besitzt wie die aktuell installierte Version.

#### 5.15.4.2 Verwenden von Voreinstellungen

Die APT Konfigurationsdatei `/etc/apt/preferences` erlaubt dem Administrator die Zuweisung von Prioritäten detailliert zu steuern. Die Konfigurationsdatei besteht aus Einträgen die sich über mehrere Zeilen erstrecken und untereinander durch Leerzeilen getrennt sind. Die Einträge beziehen sich auf ein einzelnes Paket (spezifische Form) oder auf eine Anzahl von Paketen (generelle Form).

1. Die spezifische Form weist einem Paket eine (Pin-) Priorität zu und übergibt dabei eine gewünschte Version oder einen Versionsbereich. Das folgende Beispiel weist allen Versionen des Paketes `perl` eine hohe Priorität zu, solange die Versionsnummer mit „5.8“ beginnt.

       Package: perl
       Pin: version 5.8*
       Pin-Priority: 1001

2. Die generelle Form setzt eine Priorität für die angegebene Distribution oder für alle Pakete von einem bestimmten Server, welcher über den vollen Domainnamen (FQDN) identifiziert wirdsetzt eine Priorität für die angegebene Distribution oder für alle Pakete von einem bestimmten Server, welcher über den vollen Domainnamen (FQDN) identifiziert wird.

   Diese, generelle Form, wirkt sich ausschliesslich auf Gruppen von Paketen aus. Als Beispiel weist folgendes Beispiel alle Paket Versionen auf einem lokalen Repository mit Paketen eine hohe Priorität zu.

       Package: *
       Pin: origin ""
       Pin-Priority: 999

   Zu beachten ist hier das Schlüsselwort „origin“. Dieses entspricht nicht dem gleich lautenden Begriff in einer „Release“-Datei! In einer „Release“-Datei wird mit dem Schlüsselwort „Origin“ ein Autor oder Hersteller (beispielsweise „Debian“ oder „Ximian“) beschrieben, nicht eine Internetadresse.

   Der folgende Eintrag setzt eine geringe Priorität für alle Paketversionen die zu einer als „unstable“ bezeichneten Distribution gehören.

       Package: *
       Pin: release a=unstable
       Pin-Priority: 50

   Das letzte Beispiel zeigt einen Eintrag der eine hohe Priorität allen Paketen zuweist die zur Release „stable“ gehören und eine Versionsnummer von „3.0“ aufweisen.

       Package: *
       Pin: release a=unstable, v=3.0
       Pin-Priority: 50

#### 5.15.4.3 Bewertung von Prioritäten

Prioritäten (P) die in der APT Konfigurationsdatei vergeben werden, müssen positive oder negative Integerzahlen sein. Diese werden wie folgt interpretiert.

P > 1000

  Installiert ein Paket, auch wenn dies ein „Downgrade“ des Paketes bewirkt.

990 < P <= 1000

  Installiert ein Paket, auch wenn es nicht aus der „Target“-Release stammt, ausser die bereits installierte Version ist aktueller.

500 < P <= 990

  Installiert ein Paket, wenn kein Paket passend zur „Target“-Release vorhanden ist oder die bereits installierte Version aktueller ist.

100 < P <= 500

  Bewirkt dass eine Version installiert wird, solange keine andere Version aus irgeneiner anderen Distribution verfügbar ist oder aber die installierte Version aktueller ist.

0 < ? <= 100

  Installiert eine Version eines Paketes nur wenn dieses Paket noch nicht installiert ist.

P < 0

  Verhindert dass diese Version eines Paketes installiert wird.

Die Einträge werden in der aufgeführten Reihenfolge in der Konfigurationsdatei abgearbeitet. Wird ein auf das Paket oder die Paketgruppe passender Eintrag gefunden, so werden die folgenden Einträge ignoriert.

Sind die vorab beschriebenen Einträge in einer Konfigurationsdatei in der beschriebenen Reihenfolge abgelegt, so ergibt sich folgende Konfigurationsdatei

    Package: perl
    Pin: version 5.8*
    Pin-Priority: 1001

    Package: *
    Pin: origin ""
    Pin-Priority: 999

    Package: *
    Pin: release unstable
    Pin-Priority: 50

In diese Zusammenstellung gelten folgende Regeln:

1. Es wird die aktuellste Version des Paketes „perl“ installiert, solange diese Version mit „5.8“ beginnt. Ist eine Version 5.8 von Perl verfügbar und ist die Version 5.9 bereits installiert, so wird ein „Downgrade“ durchgeführt durchgeführt.

2. Jedes andere Paket, welches nicht das Paket „perl“ ist, und auf dem lokalen System verfügbar ist, bekommt eine höhere Priorität. Dies bewirkt das nur wenige, nicht lokal verfügbare Pakete, aus dem Netz installiert werden. Dies betrifft auch Versionen der „Target“-Release.

3. Ein Paket welches nicht auf dem lokalen System verfügbar ist, aber in einer Quelle in der Datei `/etc/apt/sources.list` aufgeführt wird und zu einer „unstable“ Release gehört, wird nur installiert wenn es zur Installation ausgewählt wird und noch keine Version dieses Paketes installiert ist.

#### 5.15.4.4 Paket Versionen und Distributions Eigenschaften

Die Paketquellen, welche in der Datei `/etc/apt/sources.list` aufgeführt werden, enthalten im Idealfall die Dateien `Packages` (bzw. `Packages.gz`) und `Release` mit denen die an der jeweiligen Quelle verfügbaren Pakete beschrieben werden.

Die Datei `Packages` befindet sich normalerweise im Pfad `.../dists/dist-name/component/arch` also beispielsweise `.../dists/stable/main/binary-i386/Packages`. Diese Datei besteht einem mehrzeiligen Eintrag für jedes Paket, von dem für die APT Prioritäten lediglich die beiden Zeilen `Package` und `Version` benötigt werden.

Die Datei `Release` befindet sich im Pfad `.../dists/dist-name`, also beispielsweise unter `.../dists/stable/Release` oder auch `.../dists/sarge/Release`. Abweichend von der Datei `Packages` werden fast alle Informationen aus der `Release` Datei benötigt. Diese sind:

Archive:

  Bezeichnet das Archiv zu dem alle Pakete dieses Verzeichnisses gehören. Beispielsweise gibt die Zeile `Archive: stable` an, dass alle Pakete in dem Verzeichnisbaum unterhalb der Datei `Release` zur „stable“-Release von Debian gehören.

  In der APT Konfigurationsdatei wird dieser Wert wie folgt gesetzt:

      Pin: release a=stable

Version:

  Diese Zeile bezeichnet die Release Version der Distribution. Der Wert „3.1“ sagt auch das alle Pakete im Verzeichnisbaum zur Release 3.1 „Sarge“ von Debian gehören. Für Versionen wie „testing“ und „unstable“ werden keine Versionsnummern vergeben, da diese Versionen noch nicht veröffentlicht sind. Um diesen Wert in der APT Konfigurationsdatei anzugeben ist eine der folgenden Zeilen notwendig

      Pin: release v=3.0
      Pin: release a=stable, v=3.0
      Pin: release 3.0

Component:

  Bezeichnet den Abschnitt der Distribution aus der die Pakete stammen. Beispielsweise bezeichnet die Zeile `Component: main` in der `Release`-Datei, dass alle Pakete unterhalb diese Verzeichnisses zum Abschnitt „main“ gehören. Dies bedeutet auch, dass alle diese Pakete einer Lizenz entsprechen die in den Debian Free Software Guidelines (siehe auch DFSG). Diese Angabe wird wie folgt in der APT Konfigurationsdatei `preferences` festgelegt

      Pin: release c=main

Origin:

  Bezeichnet den Ursprung der Pakete, meist ist hier „Debian“ angegeben. In der APT `preferences`-Datei sieht diese Zeile wie folgt aus.

      Pin: release o=Debian

Label:

  Eine Bezeichnung für die Pakete in diesem Verzeichnisbaum, dieser Eintrag hat meistens den Wert „Debian“. In der APT `preferences`-Datei sieht diese Zeile wie folgt aus.

      Pin: release l=Debian

Alle verfügbaren Dateien (`Packages` und `Release`) die über Quellen in der Datei `/etc/apt/sources.list` verfügbar sind, werden im Verzeichnis `/var/lib/apt/lists/` abgelegt. Dieses Verzeichnis kann durch die Variable `Dir::State::Lists` in der Datei `apt.conf` verändert werden. Die Dateinamen der gespeicherten `Packages` und `Release` Dateien werden mit dem Namen des Servers, sowie dem Pfad und der Architektur ergänzt, beispielsweise `debiananwenderhandbuch.de_debian_dists_stable_main_binary-i386_Packages`.

Weiterhin ist es möglich eine oder mehrere Zeilen beginnend mit dem Schlüsselwort `Explanation:`, mit einer Erklärung dieses Eintrages einzufügen.

Die Zeile `Pin-Priority:` in jedem Eintrag ist nicht zwingend erforderlich, wird ein solcher Eintrag nicht gefunden, so wird eine um den Wert 1 reduzierte Priorität gegenüber dem vorhergehenden Eintrag vergeben.

#### 5.15.4.5 Beispiele

Das erste Beispiel zeigt wie man allen Paketen der „stable“ Distribution eine Priorität über der vorgegebenen (von 500) zuweist. Bei allen anderen Paketen wird die Priorität um den Wert 10 verringert.

    Explanation: Uninstall or do not install any Debian-originated
    Explanation: package versions other than those in the stable distro
    Package: *
    Pin: release a=stable
    Pin-Priority: 900

    Package: *
    Pin: release o=Debian
    Pin-Priority: -10

Die beschriebene Konfiguration führt dazu das alle Pakete aus der aktuellen „stable“ Distribution installiert werden, bzw. das bereits installierte Pakete immer aktuell gehalten werden. Darüber hinaus ist es möglich einzelne Pakete aus anderen Distributionen zu installieren, hier am Beispiel eines Paketes aus „testing“.

    apt-get install paketname/testing

Das so aus „testing“ installierte Paket wird zu einem späteren Zeitpunkt nicht weiter aktualisiert. Dies muss von Hand durch den erneuten Aufruf des oben beschriebenen Kommandos erfolgen.

Das zweite Beispiel setzt eine hohe Priorität für Pakete aus dem „testing“-Zweig, eine etwas niedrigere Priorität für den „unstable“-Zweig und eine noch geringe Priorität für Pakete aus anderen Bereichen.

    Package: *
    Pin: release a=testing
    Pin-Priority: 900

    Package: *
    Pin: release a=unstable
    Pin-Priority: 800

    Package: *
    Pin: release o=Debian
    Pin-Priority: -10

Diese Konfiguration bewirkt das bevorzugt Pakete aus „testing“ in den jeweils aktuellen Versionen installiert werden. Auch hier ist es möglich mittels

    apt-get install paketname/unstable

gezielt einzelne Pakete aus dem „unstable“ Bereich zu installieren.

### 5.15.5 APT Pinning

Eine besondere Stärke des Debian-Paketmanagements ist, dass unterschiedliche Release-Stände verwendet werden können. Hierzu sind zumindest zwei Releases (beispielsweise „woody“ und „testing“) mit entsprechenden Einträgen in der Datei `/etc/apt/sources.list` anzugeben. Nun kann mittels `apt-get --target-release` der gewünschte Release-Stand für ein Paket gewählt werden.

Sinnvoll ist dieses Feature leider nur mit zwei Releases einsetzbar; werden drei Debian-Releases (beispielsweise zusätzlich „unstable“) oder aber eine Nicht-Debian-Paketquelle gemischt, so kommt es zu seltsamen Ergebnissen. Die Lösung für dieses Problem ist eine Erweiterung der Datei `/etc/apt/preferences`.

Hier zunächst ein Beispiel für eine sinnvolle `/etc/apt/preferences`-Datei. Auf den meisten Systemen wird diese Datei nicht existieren (sie wird auch nicht zwingend benötigt) und muss daher neu angelegt werden.

         * Track stable:
    Explanation: see http://www.argon.org/~roderick/apt-pinning.html
    Package: *
    Pin: release o=Debian,a=stable
    Pin-Priority: 900

    Package: *
    Pin: release o=Debian,a=testing
    Pin-Priority: 400

    Package: *
    Pin: release o=Debian,a=unstable
    Pin-Priority: 300

    Package: *
    Pin: release o=Debian
    Pin-Priority: -1
         * Track testing:
    Explanation: see http://www.argon.org/~roderick/apt-pinning.html
    Package: *
    Pin: release o=Debian,a=testing
    Pin-Priority: 900

    Package: *
    Pin: release o=Debian,a=unstable
    Pin-Priority: 300

    Package: *
    Pin: release o=Debian
    Pin-Priority: -1

Bereits beim einmaligen Aufruf von `apt-get` kann mit der Option `-t` der Wert für „APT::Default-Release“ gesetzt werden. Diese Einstellung gilt jedoch lediglich für diesen einen Aufruf von `apt-get`. Beispiel: `apt-get -t unstable install paketname`. Dies kann durchaus ein sehr nützliches Feature sein, kann sich aber in anderen Fällen auch problematisch auswirken.

Die gute Seite: Sind in der `sources.list` die Releases `testing` und `unstable` definiert und ist in der Datei `apt.conf` der Wert für `APT::Default-Release` auf „testing“ gesetzt, so ergeben sich folgende Prioritäten für das Paket „foo“:

       release    version        priority
                            no -t switch       -t unstable
       testing      1.1          990               500
       unstable     1.2          500               990

Ist das Paket „foo“ nicht installiert und wird `apt-get install foo` aufgerufen, so wird die Version 1.1 aus „testing“ installiert, da diese die höchste Priorität hat.

Mittels `apt-get -t unstable install foo` kann gezielt die Version 1.2 aus „unstable“ installiert werden, da für diesen einen Aufruf von `apt-get` die Priorität erhöht wird.

Zurück | Nach oben | Weiter
5.14 `apt-cdrom` | Zum Anfang | 5.16 `apt` - Offline nutzen

© 1999-2006 Frank Ronneburg - Dieser Inhalt ist unter einem Creative Commons Namensnennung - Nicht-kommerziell - Keine Bearbeitung Lizenzvertrag lizenziert (creativecommons.org/licenses/by-nc-nd/2.0/de/legalcode).