Gentoo Linux Prelink Einführung
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="true" 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!
Die Inhalte dieses Dokuments sind unter der Creative Commons -
Namensnennung / Weitergabe Lizenz lizenziert.
|