Guide pour le Prelink sous Gentoo
1.
Introduction
Qu'est-ce que le prelink et en quoi peut-il m'être utile ?
La plupart des applications utilisent des bibliothèques partagées (« shared
libraries »). Ces bibliothèques partagées ont besoin d'être chargées en
mémoire lors de l'exécution de l'application et les références aux différents
symboles doivent être résolues. Pour la plupart des petits programmes, cette
liaison dynamique est très rapide. Mais pour les programmes écrits en C++ qui
ont beaucoup de dépendances, la liaison dynamique peut prendre un temps
considérable.
Sur la plupart des systèmes, les bibliothèques ne changent pas souvent et quand
un programme est en cours d'exécution l'opération de liaison est toujours la
même. Le prelink utilise ceci à son avantage en évitant la liaison et en
l'enregistrant dans l'exécutable.
Le prelink peut raccourcir le temps de démarrage des applications. Par
exemple, le temps de chargement d'un programme KDE normal peut être réduit
de plus de 50%. La seule opération de maintenance nécessaire est de
ré-exécuter prelink chaque fois qu'une bibliothèque est mise à jour pour un
exécutable prelinké.
Attention :
Prelink ne fonctionne pas avec la version sécurisée Hardened de Gentoo parce
que les deux systèmes essaient de modifier les adresses des bibliothèques
partagées. L'option -R de prelink offre un certain niveau de sécurité en
utilisant des adresses aléatoires.
|
Résumé
-
Le prelink s'effectue via un programme appelé, de manière originale,
prelink. Il modifie le binaire afin de lui permettre de démarrer
plus rapidement.
-
Si une application prelinkée voit une de ses bibliothèques modifiée (mise à
jour), alors il faut relancer prelink sur l'application, dans le cas
contraire vous n'obtiendrez aucune amélioration de vitesse. En fait, à
chaque fois que vous mettez à jour via Portage un paquet qui met à jour des
bibliothèques, vous devez relancer prelink sur ces bibliothèques.
-
Les modifications effectuées sur le binaire sont complètement réversibles.
Prelink a une fonction d'annulation.
-
Les versions récentes de Portage peuvent gérer, via prelink,
les changements de MD5sum et mtime des binaires.
-
Il n'est pas nécessaire de définir FEATURES="prelink" dans le
fichier make.conf, car Portage utilise prelink automatiquement
quand le programme prelink est installé sur votre système.
2.
Mettre en place prelink
Installation des programmes
Vous devez d'abord installer le programme prelink. Le processus d'emerge
vérifie automatiquement que votre système peut utiliser prelink en
toute sécurité.
Exemple de code 2.1 : Installer prelink |
# emerge prelink
|
Un certain nombre de personnes ont obtenu des erreurs lors de l'installation
parce que des tests ont échoué. Ces tests ont été mis en place pour des raisons
de sécurité ; le comportement de prelink est incertain si vous les
désactivez. Les erreurs d'emerge proviennent habituellement des paquets de
base : binutils, gcc et glibc. Essayez de réinstaller ces paquets dans cet
ordre.
Note :
Astuce : Si vous obtenez une erreur essayez de compiler et de tester
prelink vous-même (./configure ; make ; make
test). En cas d'échec, vous pouvez consulter les fichiers *.log dans le
répertoire testsuite. Ils peuvent vous procurer quelques indices
utiles.
|
Si vous avez repéré un ensemble d'étapes qui reproduisent une erreur d'emerge
même sur un autre système, veuillez vérifier si le problème n'a pas déjà été
signalé sur Bugzilla, et créez un
nouveau bug si besoin.
Préparer votre système
Veuillez aussi vérifier que l'option de compilation -fPIC n'est
pas définie dans les variables CFLAGS et CXXFLAGS. Si vous avez utilisé
cette option, vous devrez recompiler tout votre système sans elle.
Configuration
La commande env-update génère le fichier /etc/prelink.conf
qui indique à prelink quels répertoires doivent être parcourus.
Exemple de code 2.2 : Exécuter env-update |
# env-update
|
Malheureusement vous ne pourrez pas passer à prelink les fichiers
qui ont été compilés par d'anciennes versions de binutils. La plupart de ces
applications proviennent de paquets binaires précompilés qui sont installés
dans /opt. Créer le fichier suivant indiquera à
prelink de ne pas essayer de les traiter.
Exemple de code 2.3 : /etc/env.d/60prelink |
PRELINK_PATH_MASK="/opt"
|
Note :
Vous pouvez ajouter des répertoires dans la liste ; séparez-les par
deux points « : ».
|
3.
Le prelink
Utilisation de prelink
J'utilise la commande suivante pour prelinker tous les binaires dans les
répertoires indiqués dans /etc/prelink.conf.
Exemple de code 3.1 : Lancement de prelink |
# prelink -amR
|
Attention :
Si l'espace disque disponible est limité prelink risque de tronquer
vos binaires si vous traitez l'intégralité de votre système, ce qui rendra votre
système inutilisable. Utilisez les commandes « file » ou
« readelf » afin de vérifier l'état d'un fichier binaire. Vous pouvez
également vérifier l'espace libre de vos disques avant de lancer
prelink avec df -h.
|
| Options |
Explications |
| -a |
Tous (« all ») les binaires sont passés à
prelink
|
| -m |
Conserve l'espace de mémoire virtuelle, nécessaire si vous avez
beaucoup de bibliothèques qui ont besoin d'être traitées.
|
| -R |
Rend aléatoire (« random ») l'ordre d'adressage, ceci afin
d'améliorer la sécurité contre les dépassements de capacité (« buffer
overflows »).
|
Note :
Pour plus d'informations et d'options, consultez man prelink.
|
Prelink et cron
À partir de la version sys-devel/prelink-20060213, un « cron
job » est installé dans /etc/cron.daily/prelink. Pour
l'activer, éditez le fichier /etc/conf.d/prelink. Ceci permet
d'exécuter prelink automatiquement une fois par jour.
Accélérer le chargement de KDE après le prelink
Le temps de chargement de KDE peut être considérablement réduit après le
prelink. Si vous informez KDE qu'il a été prelinké, il désactivera le chargement
de kdeinit (car il n'est plus requis à présent) et cela accélérera KDE
encore plus.
Mettez KDE_IS_PRELINKED="true" dans /etc/env.d/*kdepaths*
pour informer KDE qu'il a été prélinké.
Désinstaller prelink
S'il vous venait l'envie de supprimer prelink de votre système, vous devrez
d'abord supprimer la tâche planifiée dans /etc/cron.daily puis le
fichier /etc/conf.d/prelink. Ensuite, vous devrez retirer le
prelink de tous les binaires :
Exemple de code 3.2 : Enlever prelink de tous les binaires |
# prelink -au
|
Enfin, désinstallez le paquet prelink :
Exemple de code 3.3 : Désinstaller prelink |
# emerge -aC prelink
|
4.
Problèmes connus et leurs corrections
« Cannot prelink against non-PIC shared library »
La cause de ce problème provient de bibliothèques partagées qui ont été mal
compilées, sans l'option -fPIC de gcc pour tous leurs fichiers objets.
Voici les bibliothèques qui n'ont pas encore été corrigées ou qui ne peuvent
l'être :
-
Les bibliothèques du paquet wine, ainsi que winex. Le prelink
n'accélèrerait pas les exécutables MS Windows de toute manière.
-
La bibliothèque dans media-video/mjpegtools,
/usr/lib/liblavfile-1.6.so.0.
-
Les bibliothèques OpenGL de Nvidia
(/usr/lib/opengl/nvidia/lib/libGL.so.*) ont été compilées sans
le support PIC pourndes raisons de performance.
Si votre bibliothèque problématique n'est pas présente dans la liste, nous
vous prions de nous le rapporter avec, de préférence, un correctif pour ajouter
-fPIC au CFLAGS approprié.
Quand je traite mon système, quelques binaires statiques ne
fonctionnent plus.
Dans le cas de la glibc, il n'y a pas de tels binaires 100% statiques. Si vous
compilez statiquement un binaire avec la glibc, il peut toujours rester
dépendant d'autres fichiers du système. Ci-dessous vous trouverez une
explication de Dick Howell :
« Je suppose que tout se trouve dans le fichier téléchargé, et donc que
rien ne dépendra des bibliothèques locales sur le système cible. Malheureusement
avec Linux, et, je pense, avec quoi que ce soit d'autre utilisant la GLIBC, ce
n'est plus tout à fait vrai. Prenons « libnss » (« Sélecteur de
Service de Nom », certains semblent appeler ça « Système de Sécurité
Réseau ») qui procure des fonctions permettant l'utilisation de diverses
bases de données pour l'authentification, les informations sur le réseau et
autres. C'est supposé rendre les programmes indépendants de l'environnement
réseau actuel de la machine, configuré séparément. Bonne idée, mais les
changements de la GLIBC peuvent entraîner des problèmes lors de son chargement.
Et vous ne pouvez pas lier statiquement « libnss », car elle est
configurée indépendamment pour chaque machine. Le problème provient, je pense,
principalement de la liaison statique des autres bibliothèques de la GLIBC,
notamment « libpthread », « libm » et « libc »
desquelles proviennent des appels aux fonctions de « libnss »
incompatibles. »
Prelink échoue avec l'erreur « prelink: dso.c:306: fdopen_dso:
Assertion 'j == k' failed. »
C'est un problème connu, diagnostiqué ici. Prelink ne gère
pas les exécutables compressés avec UPX. Jusqu'à prelink-20021213, il n'existe
pas d'autre méthode que de cacher les exécutables concernés au moment
du prelink. Lisez la section
Configuration ci-dessus pour savoir comment faire cela facilement.
J'utilise grsecurity et il semble que le prelink ne fonctionne
pas
Pour faire marcher prelink sur un système sous grsecurity qui
utilise une base mmap() aléatoire, il est nécessaire de désactiver
« randomized mmap() base » pour les fichiers
/lib/ld-2.3.*.so. Pour ce faire, vous devez utiliser l'utilitaire
chpax, mais vous devez le faire sans que le fichier ne soit utilisé (par
exemple démarrez sur un LiveCD).
Prelink échoue avec l'erreur "prelink: Can't walk directory tree XXXX: Too many
levels of symbolic links"
Vos liens symboliques sont entremélés trop profondément. Cela arrive quand un
lien symbolique pointe vers lui-même. Par exemple,
/usr/lib/lib -> lib est le plus fréquent. Pour y
remédier, vous pouvez trouver le lien symbolique à la main, ou bien utiliser
l'utilitaire fourni dans le paquet symlinks :
Exemple de code 4.1 : Réparation des liens symboliques |
# emerge symlinks
# symlinks -drv /
|
Plus de détails peuvent être trouvés sur Bugzilla ainsi que
ce
fil de discussion.
5.
Conclusion
Le prelink peut considérablement réduire le temps de démarrage d'un bon
nombre de grosses applications. Portage le gère très bien. C'est aussi
sans danger puisque vous pouvez annuler le prelink d'un
quelconque binaire si vous rencontrez un problème. Rappelez-vous juste qu'il
faut relancer prelink à chaque fois que vous mettez à jour la glib
ou une autre bibliothèque prelinkée. Pour faire court : Bonne chance !
Ce document est protégé par la licence Creative
Commons : Paternité - Partage des Conditions Initiales à
l'Identique 2.5.
|