Gentoo Logo

Gentoo Linux Prelink Einführung

Inhalt:

1.  Einleitung

Was ist Prelink, und wie kann es mir helfen ?

Die meisten, gebräuchlichen Programme verwenden gemeinsam genutzte Bibliotheken. Diese Shared-Libraries müssen während der Laufzeit in den Speicher geladen und vielfältige Symbolreferenzen aufgelöst werden. Für die meisten, kleineren Anwendungen geschieht dies sehr schnell. Für Programme die in C++ geschrieben worden sind und die zudem viele Bibliotheks-Abhängigkeiten haben, kann das Linken eine nicht unerhebliche Zeit in Anspruch nehmen.

Auf den meisten Systemen werden Bibliotheken nicht sehr oft gewechselt. Daher sind die Operationen, die zum Linken des Programms ausgeführt werden, immer dieselben. Prelink nutzt diesen Umstand aus, indem es das Linken durchführt und in der Programmdatei abspeichert, es also eigentlich bereits vor dem Ausführen linkt (daher prelink).

Prelinking kann die Startzeit von Anwendungen stark verkürzen. Zum Beispiel kann die Ladezeit für ein typisches KDE-Programm um bis zu 50% verkürzt werden. Lediglich beim Ersetzen von Bibliotheken muss durch erneutes Ausführen von Prelink eine neue Programmdatei erzeugt werden.

Warnung: Prelink wird zusammen mit Hardened Gentoo nicht funktionieren. Dies liegt daran, dass beide Projekte versuchen den Adressraum für Shared-Libraries zu adressieren. Jedoch liefert prelink mit der -R Option eine zufällige Zuweisung der Basisadressen für Bibliotheken, was zu einem gewissen Grad von verstärkter Sicherheit führt.

Zusammenfassung

  • Prelinking wird mit einem Programm durchgeführt, das, wie unerwartet, prelink heißt. Es verändert die Programmdatei, um sie schneller starten zu lassen.
  • Wenn Sie Bibliotheken verändern, die in mit Prelink beschleunigten Anwendungen verwendet werden, so müssen Sie diese nochmals mit Prelink bearbeiten. Andernfalls verlieren Sie den Geschwindigkeitsvorteil. Das heißt, jedesmal wenn Sie ein Paket mittels der Portage updaten, müssen Sie diese erneut mit Prelink bearbeiten.
  • Die Veränderung an der Programmdatei kann vollständig wieder rückgängig gemacht werden. prelink besitzt eine Wiederherstellungsoption.
  • Aktuelle Versionen von Portage können mittels prelink die sich verändernden MD5-Summen und mtimes der Programmdateien bearbeiten.
  • Sie müssen nicht FEATURES="prelink" in ihrer make.conf Datei setzen. Portage wird prelink automatisch unterstützten wenn es die Binärdatei von prelink finden kann.

2.  Prelink einrichten

Installation des Programms

Zuerst müssen Sie das prelink Hilfsprogramm installieren. Der emerge Vorgang überprüft automatisch dass Ihr System prelink auf sichere Art und Weise verwenden kann.

Befehlsauflistung 2.1: Installation von Prelink

# emerge prelink

Einige Benutzer erhalten Fehlermeldungen beim emergen von Prelink, weil diese Tests fehlschlagen. Diese Tests wurden aus Sicherheitsgründen hinzugefügt. Prelink's Verhalten ist nicht definiert, wenn Sie sie ausschalten. Die Fehler beim Ausführen von emerge hängen gewöhnlich von den Kern-Paketen binutils, gcc und glibc ab. Versuchen Sie, diese Pakete in der angegebenen Reihenfolge zu emergen.

Notiz: Tipp: Wenn Sie einen Fehler erhalten, versuchen Sie Prelink selbst zu compilieren (./configure ; make ; make check). Bei einem Fehler sehen Sie sich bitte die *.log Dateien im testsuite-Verzeichnis an, sie können wertvolle Hinweise enthalten.

Wenn Sie eine bestimmte, zu einem Fehler führende Vorgehensweise anhand von einzelnen Schritten beschreiben können, überprüfen Sie Bugzilla und erstellen Sie einen Bug-Report, wenn noch keiner dazu erstellt wurde.

Vorbereiten Ihres Systems

Stellen Sie auch sicher, dass Sie -fPIC in Ihren CFLAGS/CXXFLAGS nicht gesetzt haben. Wenn Sie dies haben, werden Sie Ihr gesamtes System ohne neu erstellen müssen.

Konfiguration

Ausführen von env-update wird die /etc/prelink.conf Datei generieren, die Prelink anweist, welche Dateien zu bearbeiten sind.

Befehlsauflistung 2.2: Ausführen von env-update

# env-update

Unglücklicherweise kann man Dateien, die mit alten Versionen der binutils compiliert wurden, nicht mit Prelink bearbeiten. Die meisten dieser Dateien stammen aus Programmen, die nur als fertig gelinkte Versionen geliefert werden, die unter /opt installiert werden. Durch das Erstellen folgender Dateien weisen Sie Prelink an, nicht zu versuchen, diese Dateien zu bearbeiten.

Befehlsauflistung 2.3: /etc/env.d/60prelink

PRELINK_PATH_MASK="/opt"

Notiz: Sie können ein oder mehrere Verzeichnisse zu der durch Doppelpunkt getrennten Liste hinzufügen.

3.  Prelinking

Verwendung von Prelink

Ich verwende das folgende Kommando um alle Programmdateien in den in /etc/prelink.conf angegebenen Verzeichnissen zu bearbeiten.

Befehlsauflistung 3.1: Angegebene Dateien mit Prelink bearbeiten

# prelink -amR

Warnung: Es ist beobachtet worden, dass wenn Sie nicht mehr viel Festplattenplatz zur Verfügung haben und Sie das ganze System mit Prelink bearbeiten, Programmdateien verstümmelt werden können.Das Ergebnis ist ein zerstörtes System. Verwenden Sie file oder readelf Kommando um den Zustand der Programmdateien zu überprüfen. Alternativ können Sie die Menge an freiem Speicher auf Ihrer Festplatte mit df -h überprüfen.

Erläuterung der Optionen:
-a "All": bearbeitet alle Programmdateien mit Prelink
-m Beibehalten des virtuellen Speicherbereichs. Dies ist notwendig, wenn Sie eine größere Menge an Bibliotheken haben, die mit Prelink bearbeitet werden sollen.
-R Zufall -- zufällige Anordnung der Adressen, dies erhöht die Sicherheit gegen Pufferüberläufe.

Notiz: Für weitere Optionen und Details siehe man prelink.

Prelink Cron-Job

sys-devel/prelink-20060213 und neuer installieren einen Cron-Job in /etc/cron.daily/prelink. Um ihn zu aktivieren editieren sie die Konfigurationsdatei /etc/conf.d/prelink. Dies wird prelink täglich im Hintergrund, wenn benötigt, ausführen und Ihnen es esparen den Befehl manuell aufzurufen.

KDE beschleunigen nach Prelink

KDEs Ladezeit kann enorm reduziert werden nach Prelink. Wenn Sie KDE davon informieren, dass Sie Prelink ausgeführt haben, dann wird es das Laden von kdeinit deaktivieren (da es nun nicht mehr benötigt wird), was KDE noch schneller macht.

Setzen Sie KDE_IS_PRELINKED=1 in /etc/env.d/*kdepaths* um KDE über Prelink zu informieren.

Entfernen von Prelink

Wenn Sie jemals Ihre Meinung über das Prelinken ändern, müssen Sie zuerst den prelink-Cronjob aus /etc/cron.daily und /etc/conf.d/prelink/ entfernen, bevor Sie prelink deinstallieren. Danach müssen Sie prelinking aus allen Binärdateien entfernen:

Befehlsauflistung 3.2: Entfernen von prelinking aus allen Binärdateien

# prelink -au

Zuletzt entfernen Sie das Paket prelink selbst:

Befehlsauflistung 3.3: Deinstallation von prelink

# emerge -aC prelink

4.  Bekannte Probleme und Bereinigungen

"Prelink gegen non-PIC Shared-Library nicht möglich"

Der Grund für dieses Problem sind fehlerhaft kompilierte Shared-Libraries, die ohne die -fPIC Option für alle Objekt-Dateien erstellt wurden.

Hier ist eine Liste von Bibliotheken, die nicht korrigiert wurden oder nicht korrigierbar sind:

  • Die Bibliotheken im Wine-Paket, inklusive WineX. Die Verwendung von Prelink würde MS Windows Programme sowieso nicht beschleunigen.
  • Die Bibliothek in media-video/mjpegtools, /usr/lib/liblavfile-1.6.so.0.
  • Nvidia OpenGl-Bibliotheken in /usr/lib/opengl/nvidia/lib/libGL.so.*. Aus Gründen der Performance wurden Sie ohne PIC-Unterstützung kompiliert.

Wenn Ihre, Probleme verursachende Bibliothek hier nicht aufgeführt wurde, benachrichtigen Sie uns bitte, Vorzugsweise mit einem Patch, der das -fPIC zu den relevanten CFLAGS hinzufügt.

Wenn ich mein System mit Prelink bearbeite, funktionieren statische Programmdateien nicht mehr.

Soweit es die glibc angeht, gibt es kein 100% statisches Programm. Wenn Sie ein Programm statisch mit der glibc compilen, können immer noch Abhänigkeiten zu anderen Systemdateien bestehen. Unten finden Sie eine Erläuterung von Dick Howell,

"Ich vermute die dahinter stehende Idee ist, dass Alles in der heruntergeladenen Datei enthalten ist und somit keine Abhängigkeiten von den lokalen Bibliotheken des Zielsystems vorhanden sein sollen. Unglücklicherweise ist dies bei Linux, und ich vermute bei jedem anderen System, welches die GLIBC verwendet, nicht korrekt. Da ist die "libnss" (name service switch, manche Leute nennen sie network security system), welche Funktionen zum Zugriff auf diverse Datenbanken mit Authentifikations- und Netzwerk-Informationen, sowie anderen Informationen. Sie ist dafür gedacht, Anwendungen unabhängig vom getrennt davon konfigurierten Netzwerk zu machen. Eine gute Idee, jedoch können Änderungen an der GLIBC zu Problemen beim Laden dieser Bibliothek führen. Zudem kann man die "libnss" nicht statisch linken, da sie für jede Maschine individuell konfiguriert wird. Das Problem rührt meiner Meinung nach hauptsächlich daher, dass andere GLIBC-Bibliotheken, insbesondere "libpthread", "libm" and libc", statisch gelinkt werden, was zu inkompatiblen Aufrufen von Funktionen der "libnss" führt."

Prelink bricht mit ";prelink: dso.c:306: fdopen_dso: Assertion `j == k' failed." ab

Dies ist ein bekanntes Problem, freundlicherweise hier diagnostiziert. Prelink kann nicht mit UPX-komprimierten Programmdateien umgehen. Seit prelink-20021213 ist ein Fix erhältlich, der die ausführbaren Dateien versteckt, während Prelink läuft. Siehe hierzu in die Kapitel Konfiguration bezüglich eines einfachen Wegs, dies zu tun.

Ich verwende grsecurity und es hat den Anschein, dass Prelink nicht funktioniert.

Um auf einem System mit grsecurity Prelink benutzen zu können, welches eine zufällige mmap() Basis verwendet, muss man die "randomized mmap() base" für /lib/ld-2.3.*.so ausschalten. Dies kann man mit dem chpax Tool bewerkstelligen. Es muss jedoch verwendet werden, wenn die Dateien nicht in Benutzung sind (z.B. von einer Rettungs-CD aus).

Prelink versagt mit der Fehlermeldung "prelink: Can't walk directory tree XXXX: Too many levels of symbolic links"

Ihre symbolischen Links sind zu tief verschachtelt. Dies passiert, wenn ein symbolischer Link auf sich selbst verweist. Zum Beispiel ist der häufigste /usr/lib/lib -> lib. Um dies zu beheben, können Sie den symbolischen Link per Hand ausfindig machen oder das Hilfsprogramm vom symlinks Paket verwenden:

Befehlsauflistung 4.1: Beheben symbolischer Links

# emerge symlinks
# symlinks -drv /

Weitere Einzelheiten finden sich in Bugzilla und diesem Forenbeitrag.

5.  Zusammenfassung

Die Verwendung von Prelink kann die Startzeiten von großen Anwendungen drastisch verkürzen. Die Unterstützung dafür ist in Portage enthalten. Es ist also sicher, da man die Änderungen jederzeit rückgängig machen kann, wenn Probleme auftreten. Sie müssen lediglich darauf achten, dass Sie die Programmdateien neu mit Prelink bearbeiten müssen, wenn Sie die glibc oder andere Bibliotheken mit denen Sie Prelink verwendet haben, updaten. Dazu müssen Sie prelink erneut starten! Kurz: Viel Glück!



Drucken

Seite aktualisiert 12. Januar 2010

Die Originalversion dieser Übersetzung wird nicht länger gepflegt

Zusammenfassung: Diese Einführung erläutert, wie man die Prelink-Unterstützung in Portage 2.0.46 und neuer verwendet.

Stefan Jones
Autor

John P. Davis
Bearbeiter

Jorge Paulo
Bearbeiter

Sven Vermeulen
Bearbeiter

Erwin
Bearbeiter

Joshua Saddler
Bearbeiter

Torsten Evers
Übersetzer

Jan Hendrik Grahl
Korrektor

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.