Gérer les bibliothèques partagées sous Linux

CompTIABeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous allez acquérir les bases de la gestion des bibliothèques partagées sous Linux. Les bibliothèques partagées sont des composants essentiels qui permettent à plusieurs programmes d'utiliser le même code, ce qui permet d'économiser de l'espace disque et de la mémoire vive. Vous commencerez par utiliser la commande ldd pour inspecter un programme exécutable, tel que ping, afin d'identifier les bibliothèques partagées spécifiques dont il a besoin pour fonctionner correctement.

Ensuite, vous apprendrez à localiser le fichier physique d'une bibliothèque spécifique sur le système de fichiers à l'aide de la commande find. Enfin, vous découvrirez comment gérer le cache des bibliothèques partagées, un composant système crucial pour les performances. Vous utiliserez l'utilitaire ldconfig pour visualiser le cache actuel et pour le reconstruire, garantissant ainsi que le système puisse trouver et charger efficacement les bibliothèques nécessaires.

Ceci est un atelier guidé, qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour terminer chaque étape et acquérir une expérience pratique. Les données historiques montrent qu'il s'agit d'un atelier de niveau débutant avec un taux de réussite de 98%. Il a reçu un taux d'avis positifs de 99% de la part des apprenants.

Identifier les dépendances des bibliothèques partagées avec ldd

Dans cette étape, vous apprendrez à identifier les bibliothèques partagées dont dépend un programme exécutable. Sous Linux, la plupart des programmes ne contiennent pas tout le code nécessaire à leur exécution. Au lieu de cela, ils s'appuient sur des bibliothèques partagées, qui sont des collections de code utilisables par plusieurs programmes simultanément. Cette approche permet d'économiser de l'espace disque et de la mémoire. La commande ldd (List Dynamic Dependencies) est un utilitaire qui affiche les bibliothèques partagées requises par chaque programme ou bibliothèque.

Utilisons ldd pour inspecter la commande ping, un utilitaire réseau courant. Cela nous montrera de quelles bibliothèques partagées ping a besoin pour fonctionner. Exécutez la commande suivante dans votre terminal :

ldd /bin/ping

Vous verrez une sortie similaire à celle-ci. Les adresses mémoire exactes (les nombres entre parenthèses) et les chemins d'accès peuvent varier légèrement sur votre système, mais les noms des bibliothèques devraient être identiques.

        linux-vdso.so.1 (0x00007ffcfa17e000)
        libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007f29235c4000)
        libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f29235a3000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f292337a000)
        libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f29231d0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f29235f5000)

Cette sortie liste les bibliothèques partagées nécessaires à /bin/ping. Chaque ligne représente une dépendance.

  • libc.so.6 est la bibliothèque C standard, qui fournit des fonctions fondamentales comme l'ouverture de fichiers, l'affichage à l'écran et la gestion de la mémoire. Le symbole => indique le chemin où l'éditeur de liens dynamiques du système a trouvé le fichier de la bibliothèque.
  • libcap.so.2 fournit des fonctions de gestion des capacités pour manipuler les privilèges Linux.
  • libidn2.so.0 assure la prise en charge des noms de domaine internationalisés.
  • libunistring.so.2 fournit des fonctions de manipulation de chaînes Unicode.
  • linux-vdso.so.1 est une bibliothèque virtuelle fournie par le noyau pour accélérer certains appels système.
  • /lib64/ld-linux-x86-64.so.2 est l'interpréteur de programme lui-même, responsable du chargement des autres bibliothèques partagées.

Maintenant que vous savez comment visualiser les dépendances d'un programme, nous allons apprendre, dans l'étape suivante, comment localiser le fichier physique de l'une de ces bibliothèques sur le système de fichiers.

Localiser une bibliothèque partagée spécifique avec find

Dans l'étape précédente, vous avez utilisé la commande ldd pour voir que /bin/ping dépend de la bibliothèque partagée libc.so.6. À présent, vous allez apprendre à trouver l'emplacement exact de ce fichier de bibliothèque sur le système de fichiers de votre machine. Pour cette tâche, nous utiliserons la commande find, un utilitaire puissant pour rechercher des fichiers et des répertoires.

La commande find recherche des fichiers dans une hiérarchie de répertoires. Sa syntaxe de base est find [répertoire-de-départ] -name [nom-du-fichier]. Nous commencerons notre recherche à partir du répertoire /usr, qui est un emplacement courant pour de nombreuses bibliothèques système.

Pour localiser le fichier libc.so.6, exécutez la commande suivante dans votre terminal. Nous utilisons sudo pour accorder des privilèges administratifs à la commande, ce qui évite les erreurs de type "Permission refusée" lors de la recherche dans les répertoires protégés du système.

sudo find /usr -name libc.so.6

La commande devrait se terminer relativement vite car nous ne cherchons que dans le répertoire /usr. Vous verrez un résultat comme celui-ci :

/usr/lib/x86_64-linux-gnu/libc.so.6

Cela indique l'emplacement du fichier de la bibliothèque standard C dans le répertoire /usr. Notez que ce chemin peut différer de celui affiché par ldd (/lib/x86_64-linux-gnu/libc.so.6). Cela s'explique par le fait qu'il peut exister plusieurs copies des bibliothèques à différents endroits, et le système utilise généralement des liens symboliques pour gérer la version qui est réellement chargée.

Si vous souhaitez fouiller l'intégralité du système de fichiers pour trouver toutes les copies d'une bibliothèque, vous pouvez utiliser la racine / comme point de départ :

sudo find / -name libc.so.6

Bien que find soit un outil polyvalent pour localiser n'importe quel fichier, Linux dispose d'un mécanisme spécialisé et beaucoup plus rapide pour gérer et localiser les bibliothèques partagées, appelé le cache des bibliothèques. Dans l'étape suivante, vous apprendrez comment consulter ce cache.

Consulter le cache des bibliothèques partagées avec ldconfig -p

Dans l'étape précédente, vous avez utilisé la commande find pour parcourir tout le système de fichiers, ce qui peut être lent. Pour accélérer le processus de localisation des bibliothèques partagées, les systèmes Linux maintiennent un fichier cache, généralement situé dans /etc/ld.so.cache. Ce cache contient une liste compilée des bibliothèques partagées disponibles dans les répertoires système standards, permettant aux programmes de charger leurs dépendances beaucoup plus rapidement.

La commande ldconfig est l'outil principal pour gérer ce cache. Pour afficher le contenu du cache actuel des bibliothèques, vous pouvez utiliser l'option -p (print).

Exécutez la commande suivante pour afficher toutes les bibliothèques répertoriées dans le cache :

ldconfig -p

La sortie sera assez longue, car un système classique possède de nombreuses bibliothèques partagées. La commande indique le nombre de bibliothèques trouvées puis les énumère. Voici un court extrait de ce à quoi ressemble le résultat :

1234 libs found in cache `/etc/ld.so.cache'
 libzstd.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libzstd.so.1
 libz.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so.1
 libz.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so
 libyield.so.2 (libc6,x86-64) => /lib/x86_64-linux-gnu/libyield.so.2
...
 libc.so.6 (libc6,x86-64) => /lib/x86_64-linux-gnu/libc.so.6
...

Chaque ligne affiche le nom de la bibliothèque, son architecture et son ABI (par exemple, libc6,x86-64), ainsi que le chemin complet vers le fichier de la bibliothèque.

Pour éviter de faire défiler toute la liste, vous pouvez rediriger la sortie vers grep pour rechercher une bibliothèque spécifique. Cherchons l'entrée pour libc.so.6, sur laquelle nous avons travaillé :

ldconfig -p | grep libc.so.6

Cela filtrera la liste et n'affichera que les entrées liées à libc.so.6 :

        libc.so.6 (libc6,x86-64, OS ABI: Linux 3.2.0) => /lib/x86_64-linux-gnu/libc.so.6

Comme vous pouvez le constater, c'est un moyen beaucoup plus rapide et direct de trouver l'emplacement d'une bibliothèque mise en cache que de chercher dans tout le système de fichiers. La sortie montre non seulement le nom et le chemin, mais aussi des informations sur l'architecture (libc6,x86-64) et la compatibilité ABI du système d'exploitation (OS ABI: Linux 3.2.0). Cependant, ce cache n'est pas mis à jour automatiquement en temps réel. Si vous installez une nouvelle bibliothèque, vous devez mettre à jour le cache pour que le système puisse la trouver. Dans l'étape suivante, vous apprendrez comment faire précisément cela.

Reconstruire le cache des bibliothèques partagées avec ldconfig -v

Dans cette étape, vous apprendrez à mettre à jour ou à reconstruire manuellement le cache des bibliothèques partagées. C'est une tâche courante pour les administrateurs système, en particulier après l'installation de nouvelles bibliothèques à partir des sources ou lorsqu'une installation de paquet ne déclenche pas automatiquement la mise à jour du cache. Un cache à jour est crucial pour que l'éditeur de liens dynamiques du système puisse trouver les bibliothèques nouvellement ajoutées.

Nous allons utiliser à nouveau la commande ldconfig, mais cette fois pour effectuer la mise à jour. Lorsqu'elle est exécutée sans l'option -p, ldconfig scanne les répertoires de confiance (définis dans /etc/ld.so.conf et /etc/ld.so.conf.d/*.conf) à la recherche de bibliothèques partagées et reconstruit le fichier cache /etc/ld.so.cache.

Pour observer ce processus en action, nous utiliserons l'option -v (verbose), qui force ldconfig à afficher le nom des répertoires au fur et à mesure qu'ils sont scannés ainsi que les liens symboliques qu'il crée. Comme cette commande modifie un fichier système, vous devez l'exécuter avec sudo.

Exécutez la commande suivante dans votre terminal :

sudo ldconfig -v

La commande produira beaucoup de texte pendant qu'elle traite tous les répertoires de bibliothèques de votre système. Le résultat ressemblera à cet extrait :

/lib/x86_64-linux-gnu:
 libip6tc.so.2 -> libip6tc.so.2.0.0
 libip4tc.so.2 -> libip4tc.so.2.0.0
 libxtables.so.12 -> libxtables.so.12.1.0
 ...
/usr/lib/x86_64-linux-gnu:
 libfakeroot-0.so -> libfakeroot-0.so
 ...
/lib:
...
(etc.)

La sortie affiche d'abord le chemin du répertoire qu'elle explore (par exemple, /lib/x86_64-linux-gnu:), suivi des liens symboliques qu'elle vérifie ou crée à l'intérieur de ce répertoire. Ce mode verbeux est un excellent moyen de confirmer que le cache a été reconstruit avec succès et qu'il inclut tous les chemins de bibliothèques attendus.

Vous avez maintenant terminé les tâches fondamentales de gestion des bibliothèques partagées sous Linux : identification des dépendances, localisation des fichiers de bibliothèque et gestion du cache de l'éditeur de liens dynamiques.

Résumé

Dans cet atelier, vous avez acquis des compétences essentielles pour la gestion des bibliothèques partagées dans un environnement Linux. Vous avez commencé par utiliser la commande ldd pour identifier les dépendances dynamiques d'un programme exécutable, révélant ainsi les bibliothèques partagées dont il a besoin pour fonctionner. Vous vous êtes ensuite exercé à utiliser la commande find pour localiser le fichier physique d'une bibliothèque spécifique sur le système de fichiers, une compétence utile pour le dépannage et la vérification.

De plus, vous avez exploré le rôle du cache des bibliothèques partagées, que le système utilise pour accélérer la recherche de bibliothèques. Vous avez appris à consulter le contenu de ce cache avec la commande ldconfig -p. Enfin, vous avez utilisé ldconfig -v pour reconstruire le cache, une étape critique nécessaire après l'installation de nouvelles bibliothèques pour s'assurer qu'elles sont reconnues et mises à disposition du système.