Ghid Prelink pentru Gentoo Linux
1.
Introducere
Ce este Prelink şi cum mă poate ajuta?
Multe aplicaţii folosesc biblioteci partajate. Aceste biblioteci partajate
trebuiesc încărcate în memorie la execuţie şi diferitele referinţe simbolice
trebuie rezolvate. Pentru majoritatea programelor mici acest proces de link
dinamic este foarte rapid. Totuşi, pentru unele programe scrise în C++ şi care
au multe dependinţe de biblioteci, procesul de link dinamic poate dura o
perioadă semnificativă de timp.
Pe majoritatea sistemelor, bibliotecile nu sunt schimbate foarte des şi, când
un program este rulat, operaţiile de link sunt aceleaşi de fiecare dată.
Prelink-ul se foloseşte de asta executând procesul de link şi stocându-l în
executabil.
Prelinking-ul poate să reducă timpul de pornire al aplicaţiilor. De exemplu,
timpul de încărcare al unui program tipic KDE poate fi redus până la 50%.
Singura operaţie necesară este re-rularea prelink-ului pentru executabil de
fiecare dată când o bibliotecă este actualizată.
Atenţie:
Prelink nu va funcţiona cu Hardened Gentoo. Aceasta, pentru că ambele
proiecte încearcă să modifice asocierea spaţiului de adresare a
bibliotecilor partajate. Însă prelink, cu opţiunea -R, amestecă în mod
aleator adresele de bază ale bibliotecilor, oferind un anume grad de
protecţie securizată.
|
Sumar
-
Prelinking-ul este executat de un program numit, surprinzator,
prelink. Acesta modifică fişierul binar pentru a-l face să
pornească mai repede.
-
Dacă bibliotecile de care este dependentă o aplicaţie se schimbă după
prelink, procesul de prelink trebuie repetat, altfel avantajul vitezei este
pierdut. Cu alte cuvinte, de fiecare dată când portage actualizează
bibliotecile, prelink-ul trebuie repetat.
-
Schimbarea fişierului binar este în întregime reversibilă.
prelink are o funcţie de refacere (undo).
-
Versiunile noi de Portage pot să gestioneze, prin prelink,
sumele MD5 schimbate şi timpii de modificare (mtime) pentru fişierele
binare.
-
Nu este necesar să setaţi FEATURES="prelink" în fişierul dvs.
make.conf; Portage va suporta automat prelink dacă va găsi
binarul prelink.
2.
Configurarea Prelink
Instalarea programelor
Mai întâi, trebuie să instalaţi utilitarul prelink. Procesul de
instalare verifică automat dacă sistemul poate să efectueze procesul de prelink
în siguranţă.
Cod 2.1: Instalarea prelink |
# emerge prelink
|
Multe persoane primesc erori la instalarea prelink deoarece testele eşuează.
Testele există din motive de securitate -- comportamentul lui prelink este
nedefinit dacă le dezactivaţi. Erorile aparute la instalare sunt, de obicei,
dependente doar de pachetele de bază; binutils, gcc, şi glibc. Încercaţi să le
reinstalaţi pe fiecare în ordine.
Notă:
Sugestie: Dacă primiţi o eroare, încearcaţi să compilaţi şi să testaţi prelink
manual (./configure ; make ; make check ). În cazul unei
erori, analizaţi fişierele *.log din directorul de test. Acestea vă pot oferi
indicii utile.
|
Dacă deţineţi un set de paşi care reproduc eroarea cauzată de emerge pe un alt
sistem, vă rugăm trimiteţi-le lui Stefan
Jones.
Pregătirea Sistemului Dvs.
De asemenea, asiguraţi-vă că nu aveţi setată -fPIC între opţiunile dvs.
CFLAGS/CXXFLAGS. Dacă o aveţi setată, va trebui să vă recompilaţi întregul
sistem fără aceasta.
Configurarea
Rularea env-update va genera fişierul /etc/prelink.conf
care îi specifică aplicaţiei prelink pentru ce fişiere să
realizeze prelink.
Cod 2.2: Rularea env-update |
# env-update
|
Din păcate nu puteţi să utilizaţi prelink pentru fişiere care au fost
compilate de versiuni vechi de binutils. Multe dintre aceste aplicaţii vin cu
pachete precompilate care sunt instalate în /opt. Fişierul următor
va specifica aplicaţiei prelink să nu încerce să le modifice.
Cod 2.3: /etc/env.d/60prelink |
PRELINK_PATH_MASK="/opt"
|
Notă:
Puteţi adăuga mai multe directoare la listă, separate prin doua puncte ( : ).
|
3.
Procesul de prelink
Utilizarea prelink
Se foloseşte următoarea comandă pentru a rula prelink pe toate fişierele binare
din directoarele precizate în /etc/prelink.conf.
Cod 3.1: Prelinking pentru fişierele din listă |
# prelink -amR
|
Atenţie:
S-a observat că procesul de prelink al întregului sistem atunci când există
puţin spaţiu liber pe disc poate să truncheze fişierele binare. Rezultatul este
un sistem stricat. Folosiţi comanda file sau readelf pentru a
verifica starea unui fişier binar. O altă variantă este să verificaţi înainte
cât spaţiu liber este disponibil pe disc cu comanda df -h.
|
| Explicaţia opţiunilor: |
| -a |
"All": prelink pentru toate fişierele binare |
| -m |
Conservă spaţiul de memorie virtuală. Necesar dacă aveţi multe biblioteci
care trebuie prelink-ate.
|
| -R |
Random (aleator) -- distribuie aleator ordinea adreselor. Aceasta măreşte
securitatea împotriva depăşirilor de buffer.
|
Notă:
Pentru mai multe optiuni şi detalii puteţi consulta man prelink.
|
Acţiunea de Cron Prelink
Versiunea sys-devel/prelink-20060213 şi cele ulterioare, instalează
o acţiune de cron în /etc/cron.daily/prelink. Pentru a o activa,
editaţi fişierul de configurare /etc/conf.d/prelink. Aceasta va
rula prelink zilnic în fundal, ajutându-vă să nu mai introduceţi comanda
manual.
Mărirea Vitezei KDE După Prelink
Timpul de încărcare al KDE poate fi redus mult după operaţia de prelink. Dacă
informaţi KDE de faptul că i-a fost aplicat prelink, va dezactiva încărcarea
aplicaţiei kdeinit (doarece nu mai este necesară), fapt care măreşte
viteza de încărcare şi mai mult.
Setaţi KDE_IS_PRELINKED="true" în /etc/env.d/99kde-env
pentru a informa KDE despre prelink.
4.
Probleme cunoscute şi rezolvări
"Cannot prelink against non-PIC shared library"
Cauza acestei probleme sunt bibliotecile partajate prost compilate, fără
opţiunea gcc -fPIC pentru toate fişierele lor obiect.
Acestea sunt bibliotecile care nu au fost sau nu pot fi reparate:
-
Bibliotecile din pachetul wine, inclusiv winex. Prelinking-ul nu ar
accelera executabilele MS Windows în nici un fel.
-
Biblioteca din media-video/mjpegtools,
/usr/lib/liblavfile-1.6.so.0.
-
Bibliotecile OpenGl de la Nvidia,
/usr/lib/opengl/nvidia/lib/libGL.so.*. Din motive de
performanţă, acestea a fost compilate fără suport PIC.
Dacă biblioteca cu care aveţi probleme nu a fost menţionată, vă rugăm să
trimiteţi un raport, preferabil cu un patch, care să adauge -fPIC la
indicatorii CFLAGS relevanţi.
Când folosesc prelink pe sistemul meu, unele fişiere binare statice nu mai funcţionează
Unde este implicat glibc, nu exista fişiere binare 100% statice. Dacă compilaţi
un fişier binar cu glibc, acesta poate în continuare să depindă de alte fişiere
sistem. Mai jos este o explicaţie de Dick Howell,
"Presupun că ideea este că totul va fi în fişierul descărcat, aşa că nimic
nu depinde de bibliotecile locale de pe sistemul destinaţie. Din păcate, în
Linux şi cred că în orice altceva care foloseşte GLIBC, acest lucru nu este
adevărat. Exista acest "libnss" (name service switch, unii oameni îl numesc
network security system - sistem de securitate al reţelei) care oferă funcţii
pentru accesarea diferitelor baze de date pentru autentificare, informaţie
despre reţea şi alte lucruri. Acesta se presupune că face aplicaţiile să fie
independente de setările reale de reţea ale maşinii, care sunt configurate
separat. Ideea este buna, dar schimbarile in GLIBC pot conduce la probleme la
încărcarea libnss. Şi nu se poate să faci linking static pentru libnss deoarece
este configurat individual pentru fiecare maşină. Problema apare, cred, în
principal de la linking-ul static al altor biblioteci GLIBC, în principal
"libpthread", "libm" şi "libc", din care provin apeluri incompatibile către
funcţii "libnss"."
Prelink se opreşte cu "prelink: dso.c:306: fdopen_dso: Assertion
`j == k' failed."
Aceasta este o problemă cunoscută, diagnosticată aici. Prelink nu
poate să lucreze cu executabile comprimate cu UPX. Începând cu prelink-20021213
nu există nici o soluţie în afară de a ascunde executabilele când foloseşti
prelink. Vezi secţiunea despre configurare
de mai sus pentru un mod simplu de a face asta.
Folosesc grsecurity şi se pare că prelinking-ul nu funcţionează.
Pentru a folosi prelink pe un sistem cu grsecurity care foloseşte o bază
aleatoare mmap(), este necesar să opriţi "randomized mmap() base" pentru
/lib/ld-2.3.*.so. Puteţi să efectuaţi această operaţie cu
utilitarul chpax, dar doar atunci când fişierul nu este folosit (de
exemplu, bootând de pe un CD).
5.
Concluzie
Prelinking-ul poate să scadă drastic timpii de pornire pentru un număr de
aplicaţii mari. Suport pentru prelinking exista în Portage. Prelinking-ul este
sigur pentru că este întotdeauna posibil să anulaţi schimbările pentru orice
fişier binar dacă întâmpinaţi probleme. Ţine în minte că, de fiecare dată când
actualizaţi glibc sau alte biblioteci pe care le-aţi folosit pentru prelinking,
trebuie să rulaţi prelink!
Pe scurt, succes!
Conţinutul acestui document este publicat sub licenţa Creative Commons -
Attribution / Share Alike.
|