Gemeinsam genutzte Bibliotheken unter Linux verwalten

LinuxLinuxBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einleitung

In diesem Labor lernen Sie die Grundlagen der Verwaltung von gemeinsam genutzten Bibliotheken (Shared Libraries) unter Linux. Gemeinsam genutzte Bibliotheken sind wesentliche Komponenten, die es mehreren Programmen ermöglichen, denselben Code zu verwenden, wodurch Speicherplatz und Arbeitsspeicher gespart werden. Sie beginnen damit, den Befehl ldd zu verwenden, um ein ausführbares Programm wie ping zu inspizieren und die spezifischen gemeinsam genutzten Bibliotheken zu identifizieren, von denen es für seine korrekte Funktion abhängt.

Aufbauend darauf lernen Sie, wie Sie die physische Datei einer bestimmten Bibliothek im Dateisystem mit dem Befehl find lokalisieren. Abschließend untersuchen Sie, wie der Cache für gemeinsam genutzte Bibliotheken (Shared Library Cache), eine kritische Systemkomponente für die Leistung, verwaltet wird. Sie verwenden das Dienstprogramm ldconfig, um sowohl den aktuellen Cache anzuzeigen als auch ihn neu zu erstellen, um sicherzustellen, dass das System notwendige Bibliotheken effizient finden und laden kann.

Gemeinsam genutzte Bibliotheksabhängigkeiten mit ldd identifizieren

In diesem Schritt lernen Sie, wie Sie die gemeinsam genutzten Bibliotheken identifizieren, von denen ein ausführbares Programm abhängt. Unter Linux enthalten die meisten Programme nicht den gesamten Code, den sie zum Ausführen benötigen. Stattdessen verlassen sie sich auf gemeinsam genutzte Bibliotheken (Shared Libraries), die Sammlungen von Code sind, die von mehreren Programmen gleichzeitig verwendet werden können. Dieser Ansatz spart Speicherplatz und Arbeitsspeicher. Der Befehl ldd (List Dynamic Dependencies) ist ein Dienstprogramm, das die von jedem Programm oder jeder Bibliothek benötigten gemeinsam genutzten Bibliotheken auflistet.

Verwenden wir ldd, um den Befehl ping zu inspizieren, ein gängiges Netzwerkdienstprogramm. Dies zeigt uns, welche gemeinsam genutzten Bibliotheken ping zum Funktionieren benötigt. Führen Sie den folgenden Befehl in Ihrem Terminal aus:

ldd /bin/ping

Sie sehen eine Ausgabe, die der folgenden ähnelt. Die genauen Speicheradressen (die Zahlen in Klammern) und Pfade können auf Ihrem System leicht variieren, aber die Bibliotheksnamen sollten dieselben 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 gemeinsam genutzten Bibliotheken auf, die von /bin/ping benötigt werden. Jede Zeile stellt eine Abhängigkeit dar.

  • libc.so.6 ist die Standard-C-Bibliothek, die grundlegende Funktionen wie das Öffnen von Dateien, das Schreiben auf den Bildschirm und die Speicherverwaltung bereitstellt. Das Symbol => gibt den Pfad an, unter dem der dynamische Linker des Systems die Bibliotheksdatei gefunden hat.
  • libcap.so.2 stellt Funktionen zur Verwaltung von Capabilities (Berechtigungen) für die Handhabung von Linux-Capabilities bereit.
  • libidn2.so.0 bietet Unterstützung für internationalisierte Domain-Namen.
  • 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 gemeinsam genutzten Bibliotheken verantwortlich ist.

Nachdem Sie nun wissen, wie Sie die Abhängigkeiten eines Programms anzeigen, lernen wir im nächsten Schritt, wie Sie die physische Datei einer dieser Bibliotheken im Dateisystem lokalisieren.

Eine spezifische gemeinsam genutzte Bibliothek mit find lokalisieren

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

Der Befehl find durchsucht eine Verzeichnishierarchie nach Dateien. Seine grundlegende Syntax lautet find [startverzeichnis] -name [dateiname]. Wir beginnen unsere Suche im Verzeichnis /usr, das ein üblicher Speicherort für viele Systembibliotheken ist.

Um die Datei libc.so.6 zu lokalisieren, führen Sie den folgenden Befehl in Ihrem Terminal aus. Wir verwenden sudo, um dem Befehl Administratorrechte zu gewähren, was "Permission denied"-Fehler beim Durchsuchen von systemgeschützten Verzeichnissen verhindert.

sudo find /usr -name libc.so.6

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

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

Dies zeigt den Speicherort der C-Standardbibliotheksdatei im Verzeichnis /usr. Beachten Sie, dass dies vom Pfad abweicht, der von ldd angezeigt wird (/lib/x86_64-linux-gnu/libc.so.6). Dies liegt daran, dass es mehrere Kopien von Bibliotheken an verschiedenen Orten geben kann und das System typischerweise symbolische Links verwendet, um zu verwalten, welche Version tatsächlich geladen wird.

Wenn Sie das gesamte Dateisystem nach allen Kopien einer Bibliothek durchsuchen möchten, können Sie das Stammverzeichnis / als Startpunkt verwenden:

sudo find / -name libc.so.6

Während find ein vielseitiges Werkzeug zum Auffinden jeder Datei ist, verfügt Linux über einen spezialisierten und wesentlich schnelleren Mechanismus zur Verwaltung und Lokalisierung von gemeinsam genutzten Bibliotheken, der als Bibliotheks-Cache (library cache) bekannt ist. Im nächsten Schritt lernen Sie, wie Sie diesen Cache anzeigen.

Den Cache für gemeinsam genutzte Bibliotheken mit ldconfig -p anzeigen

Im vorherigen Schritt haben Sie den Befehl find verwendet, um das gesamte Dateisystem nach einer Bibliothek zu durchsuchen, was langsam sein kann. Um den Prozess der Lokalisierung von gemeinsam genutzten Bibliotheken zu beschleunigen, pflegen Linux-Systeme eine Cache-Datei, die sich typischerweise unter /etc/ld.so.cache befindet. Dieser Cache enthält eine kompilierte Liste von gemeinsam genutzten Bibliotheken, die in Standard-Systemverzeichnissen verfügbar sind, wodurch Programme ihre Abhängigkeiten wesentlich schneller laden können.

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

Führen Sie den folgenden Befehl aus, um alle vom Cache erkannten Bibliotheken anzuzeigen:

ldconfig -p

Die Ausgabe wird ziemlich lang sein, da ein typisches System viele gemeinsam genutzte Bibliotheken hat. Der Befehl listet die Anzahl der gefundenen Bibliotheken auf und gibt dann jede einzelne aus. Hier ist ein kleines Beispiel, wie die Ausgabe aussieht:

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 Bibliotheksnamen, seine Architektur und ABI (z. B. libc6,x86-64) sowie den vollständigen Pfad zur Bibliotheksdatei an.

Um das Durchscrollen der gesamten Liste zu vermeiden, können Sie die Ausgabe an grep weiterleiten, um nach einer bestimmten Bibliothek zu suchen. Suchen wir den Eintrag für libc.so.6, mit dem wir gearbeitet haben:

ldconfig -p | grep libc.so.6

Dies filtert die Liste und zeigt Ihnen 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 können, ist dies eine wesentlich schnellere und direktere Methode, den Speicherort einer gecachten Bibliothek zu finden, als das gesamte Dateisystem zu durchsuchen. Die Ausgabe zeigt nicht nur den Bibliotheksnamen und den Pfad, sondern auch Architekturinformationen (libc6,x86-64) und die 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 aktualisieren, damit das System sie finden kann. Im nächsten Schritt lernen Sie, wie Sie genau das tun.

Den Cache für gemeinsam genutzte Bibliotheken mit ldconfig -v neu erstellen

In diesem Schritt lernen Sie, wie Sie den Cache für gemeinsam genutzte Bibliotheken manuell aktualisieren oder neu erstellen. Dies ist eine gängige Aufgabe für Systemadministratoren, insbesondere nach der Installation neuer Bibliotheken aus dem Quellcode oder wenn eine Paketinstallation nicht automatisch eine Cache-Aktualisierung auslöst. Ein aktueller Cache ist entscheidend dafür, dass 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 gemeinsam genutzten Bibliotheken und erstellt die Cache-Datei /etc/ld.so.cache neu.

Um diesen Prozess in Aktion zu sehen, verwenden wir die Option -v (verbose), die ldconfig veranlasst, die Namen der Verzeichnisse während des Scannens und die von ihm erstellten symbolischen Links auszugeben. Da dieser Befehl eine Systemdatei modifiziert, müssen Sie ihn mit sudo ausführen.

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

sudo ldconfig -v

Der Befehl wird viele Ausgaben erzeugen, da er alle Bibliotheksverzeichnisse auf Ihrem System verarbeitet. Die Ausgabe wird einem Ausschnitt wie diesem ähneln:

/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:
...
(etc.)

Die Ausgabe zeigt zuerst einen Verzeichnispfad an, den es scannt (z. B. /lib/x86_64-linux-gnu:), gefolgt von den symbolischen Links, die es in diesem Verzeichnis überprüft oder erstellt. Diese ausführliche Ausgabe ist eine hervorragende Möglichkeit, zu bestätigen, dass der Cache erfolgreich neu erstellt wurde und alle erwarteten Bibliotheks Pfade enthält.

Sie haben nun die grundlegenden Aufgaben der Verwaltung von gemeinsam genutzten Bibliotheken unter Linux abgeschlossen: Identifizierung von Abhängigkeiten, Lokalisierung von Bibliotheksdateien und Verwaltung des Caches des dynamischen Linkers.

Zusammenfassung

In diesem Lab haben Sie wesentliche Fähigkeiten für die Verwaltung von gemeinsam genutzten Bibliotheken in einer Linux-Umgebung erlernt. Sie haben zunächst den Befehl ldd verwendet, um die dynamischen Abhängigkeiten eines ausführbaren Programms zu identifizieren und aufzudecken, welche gemeinsam genutzten Bibliotheken es für seine Funktion benötigt. Anschließend haben Sie den Befehl find geübt, um die physische Datei einer bestimmten Bibliothek im Dateisystem zu lokalisieren, eine nützliche Fähigkeit zur Fehlerbehebung und Verifizierung.

Darüber hinaus haben Sie die Rolle des Caches für gemeinsam genutzte Bibliotheken erkundet, den das System verwendet, um den Prozess des Auffindens von Bibliotheken zu beschleunigen. Sie haben gelernt, wie Sie den Inhalt dieses Caches mit dem Befehl ldconfig -p anzeigen können. Schließlich haben Sie ldconfig -v verwendet, um den Cache neu zu erstellen, ein entscheidender Schritt, der nach der Installation neuer Bibliotheken erforderlich ist, um sicherzustellen, dass diese erkannt und dem System zur Verfügung gestellt werden.