8.17. Paketabhängigkeiten anzeigen

Wie in der Einführung zum Buch bereits genannt, besteht Debian aus einer riesigen Menge einzelner Pakete. Dabei werden größere, komplexe Funktionalitäten in kleine, separate Bausteine zerlegt. Diese Bausteine sind als einzelne deb-Pakete verfügbar, die häufig einander bedingen. In der Paketbeschreibung jedes deb-Pakets ist der Bezug zu den anderen Paketen hinterlegt — die Paketabhängigkeiten. Wie diese konkret formuliert werden, lesen Sie unter „Debian-Paketformat im Detail“ in Kapitel 4, Debian-Paketformat im Detail nach.

Vor der Veränderung des Paketbestands – d.h. dem Hinzufügen, Entfernen und Aktualisieren eines oder mehrerer Pakete – prüfen APT und aptitude, ob diese Paketabhängigkeiten nach den Änderungen des Bestand auf ihrem System weiterhin erfüllt sind. Die Abhängigkeiten müssen erfüllt sein, damit Ihr Linuxsystem weiterhin zuverlässig funktioniert und dieses für Sie benutzbar bleibt.

Sind die Abhängigkeiten jedoch nicht erfüllt, weigern sich APT und aptitude zunächst, Software einzuspielen. Sie zeigen Ihnen an, welche Pakete und Einzelschritte erforderlich sind, die zur Wiedererlangung eines sauberen Paketbestands durchzuführen sind. Nur mit etwas Nachdruck können Sie den Zustand auf eigene Verantwortung hin übergehen — mehr dazu erfahren Sie in „Paketoperationen erzwingen“ in Abschnitt 8.43, „Paketoperationen erzwingen“.

8.17.1. Die Abhängigkeiten eines Pakets auflisten

Hier sehen Sie, von welchen weiteren Paketen ein Paket abhängt. Zu dieser Information gelangen Sie mit mehreren Werkzeugen. Dazu zählen dpkg-deb, apt-cache mit den beiden Unterkommandos show und depends, aptitude mit speziellen Suchoptionen, apt-rdepends sowie grep-aptavail und grep-status aus dem Paket dctrl-tools [Debian-Paket-dctrl-tools]. Als weitere Information benötigen die genannten Programme noch den Namen des Pakets, zu dem es die Paketabhängigkeiten ausgeben sollen. Die nachfolgenden Ausgaben illustrieren die Wirkung anhand des Pakets xpdf.

Unterschied zwischen apt-cache und aptitude bei der Suche nach Abhängigkeiten

Hier ist die Bedeutung der Unterkommandos bzw. Schalter zwischen den beiden Werkzeugen genau entgegengesetzt. Während apt-cache depends alle Abhängigkeiten eines gegebenen Pakets heraussucht, „denkt“ aptitude search ?depends(…) andersherum und durchsucht die Abhängigkeiten aller Pakete nach einem Muster, sucht also nach Abhängigkeiten auf ein Paket bzw. einer Zeichenkette oder einem regulären Ausdruck.

Daher entspricht apt-cache depends dem Aufruf aptitude search ~R bzw. aptitude search ?reverse-depends(…) sowie apt-cache rdepends dem Aufruf aptitude search ~D bzw. aptitude search ?depends(…).

Ausgabe der Paketabhängigkeiten mit dpkg-deb

Das Kommando dpkg-deb ist Bestandteil des essentiellen Pakets dpkg [Debian-Paket-dpkg]. Über den Schalter -f (Langform --field) und der Angabe des Feldnamens liest es die Paketinformationen und gibt anschließend den Inhalt des spezifizierten Feldes aus. Das ist identisch zum Aufruf von dpkg -f (Langform dpkg --field).

Beachten Sie bitte beim Aufruf die etwas unintuitiven Abfolge der Parameter — erst den Schalter, danach den Dateinamen der deb-Datei und am Ende der Feldname. Für diese Information muss das entsprechende Paket nicht auf ihrem System installiert sein, sondern nur als Datei in einem Verzeichnis liegen und erreichbar sein.

Ausgabe der Abhängigkeiten mittels dpkg-deb

$ dpkg-deb -f xpdf_3.03-17+b1_amd64.deb Depends
libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libpoppler46 (>= 0.26.2), libstdc++6 (>= 4.1.1), libx11-6, libxm4 (>= 2.3.4), libxt6
$

Ausgabe der Paketabhängigkeiten mit apt-cache

Variante 1 verfolgt einen typischen UNIX-Ansatz — es kombiniert die beiden Werkzeuge apt-cache und grep miteinander. Dazu filtert es die Ausgabe der vollständigen Paketinformationen, wie es apt-cache mit dem Unterkommando show liefert. Über eine Pipe und mittels grep filtert es danach die Zeile mit den Abhängigkeiten heraus, die mit dem Schlüsselwort Depends beginnt. Für diese Information muss das entsprechende Paket nicht auf ihrem System installiert sein, sondern nur in der Paketdatenbank als Paket gelistet sein.

Suche mittels grep in der Ausgabe von apt-cache

$ apt-cache show xpdf | grep Depends
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libpoppler46 (>= 0.26.2), libstdc++6 (>= 4.1.1), libx11-6, libxm4 (>= 2.3.4), libxt6
$

Variante 2 verwendet das spezifische Unterkommando depends. apt-cache gibt jedes benötigte Debianpaket in einer einzelnen Zeile in alphabetisch aufsteigender Reihenfolge und ohne die Versionsnummer aus. Für diese Information muss das entsprechende Paket nicht auf ihrem System installiert sein, aber in der Paketdatenbank gelistet sein.

Detaillierte Ausgabe der Paketabhängigkeiten. 

$ apt-cache depends xpdf
xpdf
  Hängt ab von: libc6
  Hängt ab von: libgcc1
  Hängt ab von: libpoppler46
  Hängt ab von: libstdc++6
  Hängt ab von: libx11-6
  Hängt ab von: libxm4
  Hängt ab von: libxt6
  Empfiehlt: poppler-utils
    poppler-utils:i386
  Empfiehlt: poppler-data
  Empfiehlt: gsfonts-x11
  Empfiehlt: cups-bsd
    cups-bsd:i386
  Kollidiert mit: <xpdf-common>
  Kollidiert mit: <xpdf-common:i386>
  Kollidiert mit: <xpdf-reader>
  Kollidiert mit: <xpdf-reader:i386>
  Ersetzt: <xpdf-common>
  Ersetzt: <xpdf-common:i386>
  Ersetzt: <xpdf-reader>
  Ersetzt: <xpdf-reader:i386>
  Kollidiert mit: xpdf:i386
$

Ohne weitere Optionen enthält die Ausgabe alle Abhängigkeiten, Empfehlungen und Konflikte zu dem Paket. Mit den folgenden Optionen spezifizieren Sie die Ausgabe noch genauer.

-i (Langform --important)
Einschränkung auf die wichtigen Abhängigkeiten, d.h. nur unerfüllte (unmet) und direkte Abhängigkeiten (depends und pre-depends). Es entspricht damit exakt den Angaben im Feld Depends der Paketinformationen.

Beschränkung auf die wichtigen Abhängigkeiten mittels -i

$ apt-cache depends -i xpdf
xpdf
  Hängt ab von: libc6
  Hängt ab von: libgcc1
  Hängt ab von: libpoppler46
  Hängt ab von: libstdc++6
  Hängt ab von: libx11-6
  Hängt ab von: libxm4
  Hängt ab von: libxt6
$

--no-pre-depends
blendet die Pakete aus, die vorher installiert sein müssen
--no-depends
direkte Abhängigkeiten ausblenden
--no-recommends
die Empfehlungen für weitere Pakete ausblenden
--no-suggests
Angaben für Vorschläge werden unterdrückt
--no-conflicts
blendet die Pakete aus, die mit dem Paket in Konflikt stehen, d.h. nicht gleichzeitig installiert sein dürfen
--no-breaks
blendet die Pakete aus, die das Paket funktionsunfähig machen
--no-replaces
Pakete, die das aktuelle Paket ersetzen, werden nicht angezeigt
--no-enhances
Pakete, die das aktuelle Paket erweitern, werden nicht angezeigt
--installed
begrenzt die Ausgabe nur auf die installierten Pakete
--recurse
führt die Unterkommandos depends und rdepends rekursiv aus, so dass alle erwähnten Pakete einmal ausgegeben werden. Diese Liste kann sehr lang sein.

Die nachfolgende Ausgabe grenzt die Auflistung auf die Pakete ein, die lediglich als Vorschlag oder Empfehlung hinterlegt sind. Im Aufruf nutzen Sie dafür die Option --no-depends.

Ausgabe der vorgeschlagenen und empfohlenen Pakete zu xpdf

$ apt-cache depends xpdf --no-depends
xpdf
  Empfiehlt: poppler-utils
    poppler-utils:i386
  Empfiehlt: poppler-data
  Empfiehlt: gsfonts-x11
  Empfiehlt: cups-bsd
    cups-bsd:i386
  Kollidiert mit: <xpdf-common>
  Kollidiert mit: <xpdf-common:i386>
  Kollidiert mit: <xpdf-reader>
  Kollidiert mit: <xpdf-reader:i386>
  Ersetzt: <xpdf-common>
  Ersetzt: <xpdf-common:i386>
  Ersetzt: <xpdf-reader>
  Ersetzt: <xpdf-reader:i386>
  Kollidiert mit: xpdf:i386
$

Recherche mit apt-rdepends

Deutlicher wird apt-rdepends aus dem gleichnamigen Paket. Es löst die Abhängigkeiten noch weitaus stärker auf. Nachfolgende Darstellung zeigt daher nur einen Ausschnitt. Für diese Information muss das entsprechende Paket nicht auf ihrem System installiert sein, aber in der Paketdatenbank gelistet sein.

Ausgabe der Paketabhängigkeiten mit apt-rdepends (Ausschnitt). 

$ apt-rdepends xpdf | more
xpdf
  Depends: libc6 (>= 2.4)
  Depends: libgcc1 (>= 1:4.1.1)
  Depends: libpoppler46 (>= 0.26.2)
  Depends: libstdc++6 (>= 4.1.1)
  Depends: libx11-6
  Depends: libxm4 (>= 2.3.4)
  Depends: libxt6
libc6
  Depends: libgcc1
libgcc1
  Depends: gcc-4.9-base (= 4.9.2-10)
...
$

Das Ergebnis von apt-rdepends wird vielleicht leichter verständlich, wenn Sie die Paketabhängigkeiten graphisch darstellen. Bei der Veranschaulichung hilft Ihnen das Programm dotty aus dem Paket graphviz [Graphviz]. Für das Paket tcpdump sieht der Aufruf wie folgt aus.

Erzeugung der Abhängigkeiten als dot-Datei. 

$ apt-rdepends -d tcpdump | dot > tcpdump.dot
Reading package lists... Done
Building dependency tree
Reading state information... Done
$

Das Ergebnis der von apt-rdepends zu dot weitergeleiteten und in der Datei tcpdump.dot abgespeicherten Relationsmenge zeigen Sie mit dem Programm dotty an (siehe Abbildung 8.6, „Darstellung der umgekehrten Paketabhängigkeiten mit dotty).

Aufruf von dotty

$ dotty tcpdump.dot
$

Abbildung 8.6. Darstellung der umgekehrten Paketabhängigkeiten mit dotty

werkzeuge/paketoperationen/tcpdump-apt-rdepends.png

Ausgabe der Paketabhängigkeiten mit aptitude

aptitude versteht eine Reihe von speziellen Suchmustern. Eines davon ist ~Rmuster als Abkürzung für die Langform ?reverse-depends(Paketname), welches Sie mit dem Unterkommando search kombinieren. muster bezeichnet hier den Namen oder das Textfragment eines Pakets. Für diese Information muss das entsprechende Paket nicht auf ihrem System installiert sein, aber in der Paketdatenbank gelistet sein.

Mit dem nachfolgenden Aufruf erhalten Sie alle Pakete, die xpdf benötigt. Es entspricht dem Aufruf apt-cache depends -i xpdf. Die Ausgabe beinhaltet nur die notwendigen Abhängigkeiten ohne weitere Empfehlungen. Analog zur Ausgabe von dpkg umfaßt die verwendete Darstellungsform den Installationsstatus, den Namen und die Kurzbeschreibung des Pakets (siehe dazu „Liste der installierten Pakete anzeigen und deuten“ in Abschnitt 8.5, „Liste der installierten Pakete anzeigen und deuten“).

Anzeige der Paketabhängigkeiten mit aptitude

$ aptitude search ~Rxpdf
i   libc6                           - GNU C-Bibliothek: Dynamische Bibliotheken
i   libgcc1                         - GCC Support-Bibliothek
i A libpoppler46                    - Bibliothek zur PDF-Darstellung
i   libstdc++6                      - GNU-Implementierung der Standard-C++-Bibli
i A libx11-6                        - Clientseitige X11-Bibliothek
i A libxm4                          - Motif - X/Motif shared library
i A libxt6                          - X11-Bibliothek mit wesentlichen Werkzeugen
$

Ausgabe der Paketabhängigkeiten mit grep-status

Die beiden Werkzeuge grep-aptavail und grep-status aus dem Paket dctrl-tools [Debian-Paket-dctrl-tools] filtern die gewünschten Felder aus der Paketbeschreibung heraus. Während grep-status eher die Sichtweise von dpkg benutzt und sich nur auf die (jemals) installierten Pakete in der aktuellen Architektur bezieht, entspricht grep-aptavail eher aptitude und durchsucht alle lokalen Paketlisten. Benutzen Sie bspw. mehrere Archtekturen (Multiarch), erhalten Sie einen Suchtreffer pro Paketliste der Architektur.

Für diese Information muss das entsprechende Paket nicht auf ihrem System installiert sein, aber in der Paketdatenbank gelistet sein.

Im nachfolgenden Aufruf kommen -F Package zum Abgleich des Musters mit dem Paketnamen und -s Depends zur Ausgabe des Feldes für die Paketabhängigkeiten zum Einsatz.

Ausgabe der Paketabhängigkeiten mit grep-status

$ grep-status -F Package -s Depends xpdf
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libpoppler46 (>= 0.26.2), libstdc++6 (>= 4.1.1), libx11-6, libxm4 (>= 2.3.4), libxt6
$

Eine kürzere Schreibweise erlaubt der Schalter -P, welcher dem Schalter -F Package entspricht. Nachfolgende Ausgabe zeigt grep-aptavail mit den Feldern für die Paketabhängigkeit (Depends), den Paketnamen (Package) und die Architektur (Architecture).

Ausgabe der Paketabhängigkeiten mit grep-aptavail

$ grep-aptavail -P -s Package,Depends,Architecture xpdf
Package: xpdf
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libpoppler46 (>= 0.26.2), libstdc++6 (>= 4.1.1), libx11-6, libxm4 (>= 2.3.4), libxt6
Architecture: amd64

Package: xpdf
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libpoppler46 (>= 0.26.2), libstdc++6 (>= 4.1.1), libx11-6, libxm4 (>= 2.3.4), libxt6
Architecture: i386

$

8.17.2. Anzeige der umgekehrten Paketabhängigkeiten

Diese Aktivität übersetzen Sie mit der Frage „Welche anderen Pakete benötigen Paket x?“, auch genannt Rückwärtsabhängigkeit. Zur Beantwortung der Frage helfen Ihnen einerseits wiederum apt-cache mit dem Unterkommando depends, andererseits das Kommando apt-rdepends aus dem gleichnamigen Paket apt-rdepends [Debian-Paket-apt-rdepends] und auch aptitude selbst weiter.

Unterschied zwischen apt-cache und aptitude bei der Suche nach Abhängigkeiten

Hier ist die Bedeutung der Unterkommandos bzw. Schalter zwischen den beiden Werkzeugen genau entgegengesetzt. Während apt-cache depends alle Abhängigkeiten eines gegebenen Pakets heraussucht, „denkt“ aptitude search ?depends(…) andersherum und durchsucht die Abhängigkeiten aller Pakete nach einem Muster, sucht also nach Abhängigkeiten auf ein Paket bzw. einer Zeichenkette oder einem regulären Ausdruck.

Daher entspricht apt-cache depends dem Aufruf aptitude search ~R bzw. aptitude search ?reverse-depends(…) sowie apt-cache rdepends dem Aufruf aptitude search ~D bzw. aptitude search ?depends(…).

Recherche mit apt-cache

Über das Unterkommando rdepends zeigt apt-cache alle Pakete an. Pakete, die von weiteren Paketen abhängen, sind in der Ausgabe von apt-cache mit einem senkrechten Strich („Pipe“) gekennzeichnet. Für diese Information muss das entsprechende Paket nicht auf ihrem System installiert sein, aber in der Paketdatenbank gelistet sein.

Ausgabe der umgekehrten Paketabhängigkeiten mit apt-cache für das Paket xpdf

$ apt-cache rdepends xpdf
xpdf
Reverse Depends:
 |xmds-doc
  xfe
  wiipdf
 |vim-latexsuite
  python-scapy
 |ruby-tioga
 |python-tables-doc
 |page-crunch
 |octave-doc
 |muttprint-manual
  mozplugger
  mlpost
  libmlpost-ocaml-dev
 |mc
 |libjgoodies-forms-java-doc
 |libinventor1
 |gprolog-doc
 |geomview
  libfontconfig1
  eficas
 |auctex
$

Recherche mit apt-rdepends

apt-rdepends löst die Abhängigkeiten der Pakete zueinander noch weitaus stärker auf. Für diese Information muss das entsprechende Paket nicht auf ihrem System installiert sein, aber in der Paketdatenbank gelistet sein.

Ausgabe der umgekehrten Paketabhängigkeiten mit apt-rdepends

$ apt-rdepends -r xpdf
Reading package lists... Done
Building dependency tree
Reading state information... Done
xpdf
  Reverse Depends: eficas (6.4.0-1-1.1)
  Reverse Depends: muttprint-manual (0.73-5.1)
  Reverse Depends: wiipdf (1.4-2)
eficas
muttprint-manual
wiipdf
$

Recherche mit aptitude

Mit einer Reihe von speziellen Suchmustern zum Unterkommando search unterstützt Sie aptitude bei der Recherche in der Paketdatenbank. Eines davon ist ~Dmuster und dessen Langform ?depends(muster). Sie suchen in den Abhängigkeiten\footnote{Engl. Dependencies; ohne weitere Angaben wird in den Abhängigkeiten des Feldes Depends gesucht.} aller Pakete nach dem regulrären Ausdruck muster. Dabei findet es nicht nur vollständige Paketnamen sondern auch Bestandteile von Paketnamen. Für diese Information muss das entsprechende Paket nicht auf ihrem System installiert sein, aber in der Paketdatenbank vorhanden sein.

Um beispielsweise alle Pakete zu erhalten, die eine Abhängigkeit auf ein Paket mit der Zeichenkette xpdf im Paketnamen haben, nutzen Sie das Kommando aptitude search ~Dxpdf. Das Ergebnis ist eine mehrspaltige Auflistung der Pakete mit deren Installationsstatus, Paketnamen und Kurzbeschreibung (siehe dazu „Liste der installierten Pakete anzeigen und deuten“ in Abschnitt 8.5, „Liste der installierten Pakete anzeigen und deuten“).

Auflistung aller Pakete, deren Abhängigkeiten die Zeichenkette xpdf beinhalten, mit aptitude

$ aptitude search '~Dxpdf'
p   eficas               - Graphical editor for Code Aster command files
p   impressive           - Werkzeug zur Präsentation von PDF-Dateien mit
p   muttprint-manual     - Handbuch für muttprint
p   page-crunch          - PDF and PS manipulation for printing needs
p   wiipdf               - Präsentiert eine PDF-Datei mittels Wiimote
$

Diese Liste beinhaltet auch das Paket impressive, welches eine Abhängigkeit auf poppler-utils | mupdf-tools | xpdf-utils hat. Will man nur Abhängigkeiten auf das Paket xpdf, so muß man Anfangs- und End-Anker verwenden:

Auflistung aller Pakete, die eine harte Abhängigkeit auf das Paket xpdf beinhalten, mit aptitude

$ aptitude search '~D^xpdf$'
p   eficas               - Graphical editor for Code Aster command files
p   muttprint-manual     - Handbuch für muttprint
p   wiipdf               - Präsentiert eine PDF-Datei mittels Wiimote
$

8.17.3. Prüfen, ob die Abhängigkeiten des gesamten Systems erfüllt sind

APT liefert über das Werkzeug apt-get und dessen Unterkommando check ein kleines Diagnosewerkzeug mit. Es aktualisiert den Paketzwischenspeicher (siehe Kapitel 7, Paketcache) und prüft, ob auf Ihrem Linuxsystem beschädigte Abhängigkeiten vorliegen. Das beinhaltet alle installierten Pakete sowie die bereits entpackten, aber noch nicht konfigurierten Pakete [Debian-Anwenderhandbuch-apt-optionen].

Prüfung auf beschädigte Abhängigkeiten mit apt-get check

# apt-get check
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
#

8.17.4. Zusammenfassung aller unerfüllten Abhängigkeiten im Paketcache

Das Werkzeug apt-cache zeigt Ihnen eine Zusammenfassung aller unerfüllten Abhängigkeiten im Paketzwischenspeicher (siehe Kapitel 7, Paketcache). Dazu bietet es das Unterkommando unmet, welches Sie auch noch um einen Paketnamen bzw. eine Liste davon ergänzen können. Die dargestellte Liste zeigt die Funktionalität zum Paket wireshark und beinhaltet auch die nicht installierten Vorschläge der Pakete.

Auflistung aller unerfüllten Abhängigkeiten für Pakete, die mit wireshark beginnen. 

$ apt-cache unmet wireshark*
Paket wireshark Version 1.8.2-5wheezy10 hat eine unerfüllte Abhängigkeit:
 Ersetzt: ethereal (< 1.0.0-3)
Paket libwireshark2 Version 1.8.2-5wheezy10 hat eine unerfüllte Abhängigkeit:
 Ersetzt: wireshark-common (< 1.4.0~rc2-1)
Paket libwireshark-data Version 1.8.2-5wheezy10 hat eine unerfüllte Abhängigkeit:
 Ersetzt: wireshark-common (< 1.4.0~rc2-1)
Paket wireshark-common Version 1.8.2-5wheezy10 hat eine unerfüllte Abhängigkeit:
 Ersetzt: ethereal-common (< 1.0.0-3)
Paket libwireshark-dev Version 1.8.2-5wheezy10 hat eine unerfüllte Abhängigkeit:
 Ersetzt: wireshark-dev (< 1.4.0~rc2-1)
Paket wireshark-dev Version 1.8.2-5wheezy10 hat eine unerfüllte Abhängigkeit:
 Ersetzt: ethereal-dev (< 1.0.0-3)
frank@efho-mobil:~$ apt-cache unmet wireshark
Paket wireshark Version 1.8.2-5wheezy10 hat eine unerfüllte Abhängigkeit:
 Ersetzt: ethereal (< 1.0.0-3)
$