Gentoo Linux Prelink Gids
1.
Inleiding
Wat is Prelink en hoe kan het me helpen ?
De meest voorkomende applicaties maken gebruiken van gedeelde bibliotheken.
Deze gedeelde bibliotheken moeten in het geheugen geladen worden als die worden
gestart en verschillende symbolische referenties worden gemaakt. Voor het
kleinste programma is deze dynamische link erg snel gemaakt. Maar voor
programma's die in C++ zijn geschreven en die veel bibliotheek afhankelijkheden
hebben, kan de dynamische links wel wat tijd in beslag nemen.
Op de meeste systemen, zijn bibliotheken niet vaak veranderd, en zijn de
ondernomen taken om een programma te starten vaak dezelfde. Prelink neemt
daaruit een voordeel, door het koppelen uit te voeren en het op te slaan in de
uitvoerbaar bestand, dus een prelink maken.
Prelinking kan de opstarttijd van applicaties fel verminderen. Bijvoorbeeld,
een typische KDE programma's laadtijd kan voor 50% verminderen. Het enige wat
men moet doen is iedere keer een bibliotheek is geupgrade, de prelink
herstarten, om het uitvoerbaar bestand aangepast te hebben.
Waarschuwing:
Prelink zal niet werken met Hardened Gentoo. Dit is omdat bijde projecten
proberen het adress space mapping of gedeelde bibliotheken te
veranderen. Maar prelink met de -R optie verdeelt willekeurig basis bibliotheek
adressen, die enige verlaging van hardened bescherming oplevert.
|
Omschrijving
-
Prelinking wordt gebeurd via een programma die, verrassend, prelink
heet. De veranderingen in het binair bestand om het sneller te laten
starten.
-
Als een applicatie afhangelijke bibliotheken veranderen na het prelinken,
moet je de applicatie opnieuw prelinken, anders zal je het
snelheidsvoordeel verliezen. Dit wil zeggen dat iedere keer je een
pakket download via de portage, je die bibliotheken update, ze moeten
her-prelinkt worden.
-
De verandering aan het binair bestand is volledig omkeerbaar.
prelink heeft een ongedaan functie.
-
De huidige versies van de portage kunnen omgaan, via prelink, met
het veranderen van MD5sums en mtimes van de binaire bestanden.
-
Je hoeft FEATURES="prelink" niet in stellen in je
make.conf bestand; de Portage zal die automatisch gaan
ondersteunen als prelink het binair bestand kan vinden.
2.
Instellen van Prelink
Installaren van Programmas
Eerst en vooral moet je het prelink hulpmiddel installeren. Het emerge
proces zal automatisch controleren dat je systeem prelink veilig kunt
gebruiken.
Codevoorbeeld 2.1: Installeren van Prelink |
# emerge prelink
|
Een groep mensen krijgen fouten bij het installeren van prelink omdat ze dat ze
niet slagen bij de systeem-testen. De testen zijn ingevoegt uit
veiligheidsredenen, prelink's gedrag is niet ingesteld als je ze uitschakelt.
De emerge fouten zijn meestal enkel afhangend van kern-pakketten; binutils, gcc
en glibs. Probeer ze in die volgorde opnieuw te installeren.
Nota:
Tip: als je een fout krijgt, probeer prelink dan zelf te compileren en
te testen. (./configure ; make ; make check ). Bij een
fout kun je dan de *.log bestanden bekijken in de testsuite map. Ze kunnen
handige hints opleveren. |
Als je een aantal stappen hebt die een emerge probleem genereren op een ander
systeem, gelieve Bugzilla te
controleren en een bug report aan te maken als dit nog niet is gebeurd.
Voorbereiden van je systeem
Controleer ook dat -fPIC niet hebt in gesteld in je CFLAGS/CXXFLAGS. Als
je dit doet, zal je heel je system moeten herbouwen zonder deze instelling.
Configuratie
Het uitvoeren van env-update zal het /etc/prelink.conf
bestand genereren en prelink zeggen welke files hij moet
prelinken.
Codevoorbeeld 2.2: uitvoeren van env-update |
# env-update
|
Jammer genoeg kun je nie prelink bestanden die compileerd werden door oudere
versies van binutils. De meeste aplicaties komen van voorgecompileerde, binaire
pakketten die geinstalleerd zijn in /opt. Door volgend bestand te
maken vertel je prelink geen aanstalten te maken om ze te prelinken.
Codevoorbeeld 2.3: /etc/env.d/60prelink |
PRELINK_PATH_MASK="/opt"
|
Nota:
Je kunt meerdere of mindere mappen aan de dubbelpunt gescheiden lijst.
|
3.
Prelinken
Prelink Gebruik
Ik gebruik het volgende commando om alle binaire bestanden in de mappen in
/etc/prelink.conf te prelinken.
Codevoorbeeld 3.1: Prelinken van de lijst van bestanden |
# prelink -amR
|
Waarschuwing:
Men heeft opgemerkt dat als u op schijf bijna vol is en u prelinkt uw volledig
systeem kan er een mogelijkheid zijn dat uw binaire bestanden beknot kunnen
worden. Dit kan resulteren in een gebroken systeem. Gebruik het file of
readelf commando om de staat van de binaire bestanden te controleren.
Alternatief, controleer de hoeveelheid vrije schrije ruimte op de harde schijf
met df -h.
|
| De opties uitgelegt: |
| -a |
"Alle": prelinks alle binaire bestanden |
| -m |
Behoud de virtueel geheugenruimte. Dit is nodig als u heel wat bibliotheken
hebt die moeten zijn geprelinked.
|
| -R |
Willekeurig -- het verdelen van adres opdrachten in willekeurige volgorde,
verbetert de veiligheid tegen bufferoverstromingen.
|
Nota:
Voor meer opties en details, raadpleeg man prelink.
|
Prelink Cron Taken
sys-devel/prelink-20060213 en later installeren een cron taak in
/etc/cron.daily/prelink. Om dit in te schakelen, pas het
configuratie bestand /etc/conf.d/prelink aan. Dit zal prelink elke
dag uitvoeren in de achtergrond, zoals nodig is geacht. Dit bespaard je de
moeite het manueel te moeten starten.
De snelheid van KDE opdreiven na het Prelinken
KDE's laadtijd kan goed worden verkleint na het prelinken. Als je KDE
informeerd dat prelink is uitgevoert zal deze het laden van kdeinit
(omdat het niet meer verplicht is) die KDE nog sneller kan mekan.
Stel KDE_IS_PRELINKED="true" in, in /etc/env.d/99kde-env om
KDE te informeren over de prelink.
4.
Gekende problemen en oplossingen
"Cannot prelink against non-PIC shared library"
De oorzaak van dit probleem is van een slecht gecompileerde bibliotheek die
werd gecompileerd zonder de -fPIC gcc optie voor al zijn object bestanden.
Hier zijn de bibliotheken die niet zijn opgelost of niet kunnen opgelost
worden:
-
De bibliotheek in het wine pakket, waaronder winex. Prelinken kan de
snelheid van MS Windows uitvoerbare bestanden niet verbeteren.
-
De bibliotheek in media-video/mjpegtools,
/usr/lib/liblavfile-1.6.so.0.
-
Nvidia OpenGl bibliotheken,
/usr/lib/opengl/nvidia/lib/libGL.so.*. Door prestatie redenen
werden ze gecompileerd zonder PIC ondersteuning.
Als je probleem bibliotheek hieronder niet vermeld is, gelieve dit te melden
met, bij voorkeur, een patch om -fPIC toe te voegen aan de relevante
CFLAGS.
Wanneer ik mijn systeem prelink, willen enkele staties binaire bestanden
niet meer werken.
Waar glibc betrokken is, is er niet siets als een 100% statisch binair bestand.
Als je een binair bestand statisch compileert met glibc, kan het nog steeds
afhangen van een ander systeem bestand(en). Hieronder is een verklaring door
Dick Howell,
"Ik veronderstel dat het idee is dat alles in het gedownload bestand zal zijn,
dus hangt er niets af van lokale bibliotheken in het doel systeem. Jammer
genoeg met linux, en ik denk alles die GLIBC gebruikt, kan dit niet mogelijk
zijn. Daar is dit "libnss" (name service switch, sommige mensen noemen het
network security system) die functies levert om verschillende authenticatie
databasesn, netwerk informatie en andere dingen te raadplegen. Het wordt
verondersteld om programmas onafhankelijk te maken van de gescheiden
geconfigureerde echte netwerk omgeving van de machine. Een goed idee, maar
veranderingen aan GLIBC kan leiden tot problemen bij het laden. Je kunt
"libnss" ok niet statisch koppelen, omdat dit voor iedere machine anders is
geconfigureerd. Het probleem komt er, denk ik, bij het statisch koppelen van
andere GLIBC bibliotheken, waaronder "libpthread", "libm", en "libc", van welke
imcompabiliteit is tegenover "libnss" functies."
Prelink breekt af bij "prelink: dso.c:306: fdopen_dso: Assertion
`j == k' failed."
Dit is een gekend probleem, en goed gediagnostiseerd hier. Prelink kan
niet werken met UPX-gecompreseerde uitvoerbare bestanden. Vanaf
prelink-20021213 is er geen andere oplossing dan de uitvoerbare bestanden te
verbergen wanneer je prelinkt. Raadpleeg het Configuratie hoofdstuk hierboven om dit op een
gemakkelijke manier op te lossen.
Ik gebruik grsecurity en het blijkt dat prelink niet werkt.
Om prelink op een systeem met grsecurite, die gebruikt maakt van een
randomized mmap() base, is het nodig om "randomized mmap()
base" uit te schakelen voor /lib/ld-2.3.*.so. Dit kan worden
bereikt met het chpax hulpmiddel, maar het moet gedaan worden wanneer
het bestand niet in gebruik is (start bijvoorbeeld met een herstelCD)
Prelink gaat de mist in met de foutmelding "prelink: Can't walk directory tree
XXXX: Too many levels of symbolic links"
Je snelkoppelingen zijn te diep genest. Dit gebeurd waneer een snelkoppeling
wijst naar zichzelf. Bijvoorbeeld is /usr/lib/lib -> lib de
meest voorkomende. Om dit op te lossen, kun je deze snelkoppeling manueel
vinden of door gebruik te maken van het symlinks pakket.
Codevoorbeeld 4.1: Verbeteren van symlinks |
# emerge symlinks
# symlinks -drv /
|
Meer details kunnen gevonden worden op de volgende locaties: Bugzilla en dit forum
bericht.
5.
Conclusie
Prelink kan de opstartsneleheid drastisch verhogen voor vele programma's.
Ondersteuning is ingebouwd in de Portage. Prelinken is ook veilig aangezien je
dit altijd kunt ongedaan maken voor een binair bestand als je er een tegen komt
met problmen. Denk eraan dat je prelink moet herstarten als je
glibc of een andere bibliotheek update! Veel succes!
The contents of this document are licensed under the Creative Commons -
Attribution / Share Alike license.
|