Verwalten von Shared Libraries unter Linux

CompTIABeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie die Grundlagen der Verwaltung von Shared Libraries (gemeinsam genutzten Bibliotheken) unter Linux kennen. Shared Libraries sind essenzielle Komponenten, die es mehreren Programmen ermöglichen, denselben Code zu verwenden, was sowohl Speicherplatz auf der Festplatte als auch Arbeitsspeicher spart. Sie beginnen mit dem Befehl ldd, um ein ausführbares Programm wie ping zu untersuchen und die spezifischen Bibliotheken zu identifizieren, von denen es für eine korrekte Funktion abhängt.

Darauf aufbauend lernen Sie, wie Sie die physische Datei einer bestimmten Bibliothek im Dateisystem mit dem Befehl find lokalisieren. Abschließend untersuchen Sie die Verwaltung des Shared-Library-Cache, einer kritischen Systemkomponente für die Performance. Sie werden das Dienstprogramm ldconfig verwenden, um sowohl den aktuellen Cache anzuzeigen als auch ihn neu aufzubauen. So stellen Sie sicher, dass das System notwendige Bibliotheken effizient finden und laden kann.

Abhängigkeiten von Shared Libraries mit ldd identifizieren

In diesem Schritt lernen Sie, wie Sie die Shared Libraries identifizieren, von denen ein ausführbares Programm abhängt. Unter Linux enthalten die meisten Programme nicht den gesamten Code, den sie zur Ausführung benötigen. Stattdessen verlassen sie sich auf Shared Libraries – Sammlungen von Code, die von mehreren Programmen gleichzeitig genutzt werden können. Dieser Ansatz spart Ressourcen. Der Befehl ldd (List Dynamic Dependencies) ist ein Werkzeug, das die von jedem Programm oder jeder Bibliothek benötigten Shared Libraries ausgibt.

Lassen Sie uns ldd verwenden, um den Befehl ping zu untersuchen, ein gängiges Netzwerk-Tool. Dies zeigt uns, welche Bibliotheken ping benötigt. Führen Sie den folgenden Befehl in Ihrem Terminal aus:

ldd /bin/ping

Sie sehen eine Ausgabe ähnlich der folgenden. Die exakten Speicheradressen (die Zahlen in Klammern) und Pfade können auf Ihrem System leicht variieren, aber die Bibliotheksnamen sollten identisch sein.

        linux-vdso.so.1 (0x00007ffcfa17e000)
        libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007f29235c4000)
        libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f29235a3000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f292337a000)
        libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f29231d0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f29235f5000)

Diese Ausgabe listet die von /bin/ping benötigten Bibliotheken auf. Jede Zeile repräsentiert eine Abhängigkeit.

  • libc.so.6 ist die Standard-C-Bibliothek, die grundlegende Funktionen wie das Öffnen von Dateien, die Bildschirmausgabe und die Speicherverwaltung bereitstellt. Das Symbol => zeigt den Pfad an, unter dem der dynamische Linker des Systems die Bibliotheksdatei gefunden hat.
  • libcap.so.2 bietet Funktionen zur Verwaltung von Linux-Capabilities.
  • libidn2.so.0 ermöglicht die Unterstützung für internationalisierte Domainnamen.
  • libunistring.so.2 stellt Funktionen zur Manipulation von Unicode-Strings bereit.
  • linux-vdso.so.1 ist eine virtuelle Bibliothek, die vom Kernel bereitgestellt wird, um bestimmte Systemaufrufe zu beschleunigen.
  • /lib64/ld-linux-x86-64.so.2 ist der Programm-Interpreter selbst, der für das Laden der anderen Shared Libraries verantwortlich ist.

Nachdem Sie nun wissen, wie Sie die Abhängigkeiten eines Programms einsehen, lernen wir im nächsten Schritt, wie man die physische Datei einer dieser Bibliotheken im Dateisystem aufspürt.

Eine spezifische Shared Library mit find lokalisieren

Im vorherigen Schritt haben Sie mit dem Befehl ldd gesehen, dass /bin/ping von der Bibliothek libc.so.6 abhängt. Jetzt lernen Sie, wie Sie den genauen Speicherort dieser Bibliotheksdatei im Dateisystem Ihres Systems finden. Für diese Aufgabe verwenden wir den Befehl find, ein mächtiges Werkzeug zum Suchen von Dateien und Verzeichnissen.

Der Befehl find sucht nach Dateien in einer Verzeichnishierarchie. Die grundlegende Syntax lautet find [Startverzeichnis] -name [Dateiname]. Wir beginnen unsere Suche im Verzeichnis /usr, einem üblichen Ort für viele Systembibliotheken.

Um die Datei libc.so.6 zu lokalisieren, führen Sie den folgenden Befehl im Terminal aus. Wir verwenden sudo, um dem Befehl Administratorrechte zu geben, was Fehlermeldungen wie "Permission denied" (Zugriff verweigert) beim Durchsuchen systemgeschützter Verzeichnisse verhindert.

sudo find /usr -name libc.so.6

Der Befehl sollte relativ schnell abgeschlossen sein, da wir nur im Verzeichnis /usr suchen. Sie erhalten eine Ausgabe wie diese:

/usr/lib/x86_64-linux-gnu/libc.so.6

Dies zeigt den Speicherort der C-Standardbibliothek im Verzeichnis /usr. Beachten Sie, dass sich dieser Pfad von dem von ldd angezeigten Pfad (/lib/x86_64-linux-gnu/libc.so.6) unterscheiden kann. Das liegt daran, dass Bibliotheken oft an mehreren Orten existieren können und das System typischerweise symbolische Links (Symlinks) verwendet, um zu steuern, welche Version tatsächlich geladen wird.

Wenn Sie das gesamte Dateisystem nach allen Kopien einer Bibliothek durchsuchen möchten, können Sie das Wurzelverzeichnis / als Startpunkt wählen:

sudo find / -name libc.so.6

Obwohl find ein vielseitiges Werkzeug zum Aufspüren beliebiger Dateien ist, verfügt Linux über einen spezialisierten und wesentlich schnelleren Mechanismus zum Verwalten und Finden von Shared Libraries: den Library-Cache. Im nächsten Schritt lernen Sie, wie Sie diesen Cache einsehen.

Den Shared-Library-Cache mit ldconfig -p einsehen

Im vorangegangenen Schritt haben Sie den Befehl find genutzt, um das gesamte Dateisystem nach einer Bibliothek zu durchsuchen, was zeitaufwendig sein kann. Um das Auffinden von Shared Libraries zu beschleunigen, pflegen Linux-Systeme eine Cache-Datei, die sich normalerweise unter /etc/ld.so.cache befindet. Dieser Cache enthält eine kompilierte Liste der in den Standard-Systemverzeichnissen verfügbaren Bibliotheken, wodurch Programme ihre Abhängigkeiten viel schneller laden können.

Der Befehl ldconfig ist das primäre Werkzeug zur Verwaltung dieses Cache. Um den Inhalt des aktuellen Library-Cache anzuzeigen, können Sie die Option -p (print) verwenden.

Führen Sie den folgenden Befehl aus, um alle dem Cache bekannten Bibliotheken aufzulisten:

ldconfig -p

Die Ausgabe wird sehr lang sein, da ein typisches System über sehr viele Shared Libraries verfügt. Der Befehl gibt die Anzahl der gefundenen Bibliotheken an und listet dann jede einzelne auf. Hier ist ein kleiner Ausschnitt der Ausgabe:

1234 libs found in cache `/etc/ld.so.cache'
 libzstd.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libzstd.so.1
 libz.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so.1
 libz.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so
 libyield.so.2 (libc6,x86-64) => /lib/x86_64-linux-gnu/libyield.so.2
...
 libc.so.6 (libc6,x86-64) => /lib/x86_64-linux-gnu/libc.so.6
...

Jede Zeile zeigt den Namen der Bibliothek, ihre Architektur und das ABI (z. B. libc6,x86-64) sowie den vollständigen Pfad zur Bibliotheksdatei.

Um nicht durch die gesamte Liste scrollen zu müssen, können Sie die Ausgabe an grep weiterleiten, um nach einer bestimmten Bibliothek zu suchen. Suchen wir nach dem Eintrag für libc.so.6, mit der wir bereits gearbeitet haben:

ldconfig -p | grep libc.so.6

Dies filtert die Liste und zeigt nur die Einträge an, die sich auf libc.so.6 beziehen:

        libc.so.6 (libc6,x86-64, OS ABI: Linux 3.2.0) => /lib/x86_64-linux-gnu/libc.so.6

Wie Sie sehen, ist dies ein viel schnellerer und direkterer Weg, den Speicherort einer im Cache befindlichen Bibliothek zu finden, als das gesamte Dateisystem zu durchsuchen. Die Ausgabe zeigt neben Name und Pfad auch Informationen zur Architektur (libc6,x86-64) und zur OS-ABI-Kompatibilität (OS ABI: Linux 3.2.0). Dieser Cache wird jedoch nicht automatisch in Echtzeit aktualisiert. Wenn Sie eine neue Bibliothek installieren, müssen Sie den Cache manuell aktualisieren, damit das System sie finden kann. Im nächsten Schritt lernen Sie, wie das geht.

Den Shared-Library-Cache mit ldconfig -v neu aufbauen

In diesem Schritt lernen Sie, wie Sie den Shared-Library-Cache manuell aktualisieren oder neu aufbauen. Dies ist eine häufige Aufgabe für Systemadministratoren, insbesondere nach der Installation neuer Bibliotheken aus dem Quellcode oder wenn eine Paketinstallation die Cache-Aktualisierung nicht automatisch auslöst. Ein aktueller Cache ist entscheidend, damit der dynamische Linker des Systems neu hinzugefügte Bibliotheken finden kann.

Wir verwenden erneut den Befehl ldconfig, diesmal jedoch, um die Aktualisierung durchzuführen. Wenn ldconfig ohne die Option -p ausgeführt wird, scannt es die vertrauenswürdigen Verzeichnisse (definiert in /etc/ld.so.conf und /etc/ld.so.conf.d/*.conf) nach Shared Libraries und baut die Cache-Datei /etc/ld.so.cache neu auf.

Um diesen Prozess im Detail zu verfolgen, verwenden wir die Option -v (verbose/ausführlich). Dadurch gibt ldconfig die Namen der Verzeichnisse aus, während sie gescannt werden, sowie die symbolischen Links, die es erstellt. Da dieser Befehl eine Systemdatei ändert, müssen Sie ihn mit sudo ausführen.

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

sudo ldconfig -v

Der Befehl erzeugt eine umfangreiche Ausgabe, während er alle Bibliotheksverzeichnisse auf Ihrem System verarbeitet. Die Ausgabe sieht ähnlich aus wie dieser Ausschnitt:

/lib/x86_64-linux-gnu:
 libip6tc.so.2 -> libip6tc.so.2.0.0
 libip4tc.so.2 -> libip4tc.so.2.0.0
 libxtables.so.12 -> libxtables.so.12.1.0
 ...
/usr/lib/x86_64-linux-gnu:
 libfakeroot-0.so -> libfakeroot-0.so
 ...
/lib:
...
(usw.)

Die Ausgabe zeigt zuerst den Pfad des Verzeichnisses an, das gerade gescannt wird (z. B. /lib/x86_64-linux-gnu:), gefolgt von den symbolischen Links, die innerhalb dieses Verzeichnisses geprüft oder erstellt werden. Diese ausführliche Rückmeldung ist eine hervorragende Möglichkeit, um zu bestätigen, dass der Cache erfolgreich neu aufgebaut wurde und alle erwarteten Bibliothekspfade enthält.

Sie haben nun die grundlegenden Aufgaben zur Verwaltung von Shared Libraries unter Linux abgeschlossen: Identifizierung von Abhängigkeiten, Lokalisierung von Bibliotheksdateien und Verwaltung des Caches für den dynamischen Linker.

Zusammenfassung

In diesem Lab haben Sie grundlegende Fertigkeiten für die Verwaltung von Shared Libraries in einer Linux-Umgebung erworben. Sie haben mit dem Befehl ldd begonnen, um die dynamischen Abhängigkeiten eines ausführbaren Programms zu identifizieren und zu verstehen, welche Bibliotheken es zum Betrieb benötigt. Anschließend haben Sie geübt, den Befehl find zu nutzen, um die physische Datei einer bestimmten Bibliothek im Dateisystem aufzuspüren – eine nützliche Fähigkeit zur Fehlerbehebung und Verifizierung.

Darüber hinaus haben Sie die Rolle des Shared-Library-Cache kennengelernt, den das System nutzt, um den Suchvorgang nach Bibliotheken zu beschleunigen. Sie haben gelernt, wie Sie den Inhalt dieses Caches mit ldconfig -p einsehen können. Schließlich haben Sie ldconfig -v verwendet, um den Cache neu aufzubauen – ein kritischer Schritt nach der Installation neuer Bibliotheken, um sicherzustellen, dass diese vom System erkannt und bereitgestellt werden.