Installer un logiciel depuis ses sources : iperf3

Pour diverses raisons vous pouvez être amené à compiler un logiciel depuis ses sources et ce que l'on peut entendre ou lire le plus souvent ressemble à "c'est simple : configure, make, make install et c'est réglé". C'est probablement vrai dans de nombreux cas mais pour certains logiciels, une bibliothèque particulière peut être requise, une option nécessite d'être activée ou l'on souhaite contrôler la manière dont l'installation se déroule.

Dans tous les cas l'administrateur système se retrouve à sortir des sentiers battus. Cet article est un exemple basée sur l'installation de iperf3, un outil de mesure de performance réseau. Le but est non seulement d'installer iperf et de pouvoir l'utiliser mais également de savoir comment progresser lorsqu'un problème se présente. Comme à l'accoutumée, l'environnement utilisé est une Slackware 64 bits.

Commençons par obtenir les sources. Rien de très spécial, il suffit de télécharger une archive .tar.gz depuis le site officiel. Vérifier la signature GPG est toujours une bonne idée avant de se lancer dans les étapes suivantes. Si tout est correct il n'y a qu'à décompresser le fichier.

# cd /usr/local/src
# mkdir iperf
# cd iperf
# wget https://downloads.es.net/pub/iperf/iperf-3.0.11.tar.gz
# wget https://downloads.es.net/pub/iperf/iperf-3.0.11.txt.asc
# gpg --verify iperf-3.0.11.txt.asc
gpg: Signature made Fri 09 Jan 2015 01:01:36 PM EST using RSA key ID 8CAAEE8A
gpg: Can't check signature: public key not found

Première embûche, "impossible" de vérifier la signature GPG. Et pour cause, il faut avoir une copie de la clé publique en premier lieu. L'identifiant de la clé est indiqué dans le message d'erreur, et GPG dispose d'une fonction pour interroger un serveur de clés, rien de très complexe donc :

# gpg --search 8CAAEE8A

Une fois la clé ajoutée à votre trousseau (sélectionnez la clé proposée avec son numéro et confirmez), la vérification peut avoir lieu :

# gpg --verify iperf-3.0.11.txt.asc
# grep --color $(sha256sum iperf-3.0.11.tar.gz) iperf-3.0.11.txt.asc

La première commande vérifie la validité de la signature du fichier texte et doit renvoyer un message contenant "Good signature".

La deuxième commande recherche l'empreinte SHA-256 du fichier compressé dans le fichier texte et une longue chaîne de caractères doit apparaître en résultat. À noter que cela n'est pas la procédure la plus courante ; en règle générale un fichier de signature permet de vérifier le fichier de sources lui-même sans passer par un fichier texte intermédiaire.

Reste à décompresser le fichier :

# tar xvfz iperf-3.0.11.tar.gz
# cd iperf-3.0.11

Nous y sommes. En théorie, il ne reste qu'à appliquer la formule magique "configure, make, make install". Essayons donc.

# ./configure
# make
# make install

Et ça marche. Où en tout cas, ça y ressemble :

Par défaut, les fichiers binaires sont généralement installés dans /usr/local/bin, ou /usr/local/sbin s'ils sont destinés uniquement à l'utilisateur root. Vérifions rapidement :

# whereis iperf3
iperf3: /usr/local/bin/iperf3

Effectivement, il y a quelque chose ; tentons d'exécuter le programme :

# /usr/local/bin/iperf3
/usr/local/bin/iperf3: error while loading shared libraries: libiperf.so.0: cannot open shared object file: No such file or directory

Nouveau problème, la bibliothèque libiperf.so est introuvable. L'utilitaire ldd le confirme. ldd affiche les liens entre un programme donné et les bibliothèques partagées dont il dépend.

# ldd /usr/local/bin/iperf3
        linux-vdso.so.1 => (0x00007fff6a3ff000)
        libiperf.so.0 => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007fb7c2d6e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb7c3143000)

Pourtant libiperf est fournie avec les sources d'iperf3 et est installée en même temps. Vérifions :

# find /usr/local -type f -name 'libiperf.*'

Les résultats montrent bien des fichiers dans /usr/local/lib/.

# ls /usr/local/lib/libiperf.*

Tout est là mais cela ne fonctionne pas. Ce qui est parfois nécessaire est d'utiliser la commande ldconfig pour recréer les liens pour les bibliothèques partagées.

# ldconfig

Testons à nouveau :

# /usr/local/bin/iperf3

Ça marche ! Et ldd ne ne plaint plus :

# ldd /usr/local/bin/iperf3
        linux-vdso.so.1 => (0x00007fff535de000)
        libiperf.so.0 => /usr/local/lib/libiperf.so.0 (0x00007f9f12511000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f9f12168000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9f12758000)

Sauf qu'à y regarder de plus près, les choses ne sont pas parfaites. Nous avons une bibliothèque 64 bits installée dans un répertoire pour bibliothèques 32 bits. Rien de bloquant mais cela pourrait poser problème à moyen ou long terme. Le mieux serait d'avoir libiperf installé dans /usr/local/lib64.

# file /usr/local/lib/libiperf.so.0.0.0
/usr/local/lib/libiperf.so.0.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

Il serait possible de déplacer les fichiers manuellement, mettre à jour les liens symboliques et tout ce genre de choses, mais soyons clair, ce n'est pas la bonne méthode. Autant reprendre les choses depuis le début.

Désinstallons iperf :

# make uninstall

Nous allons reprendre à l'étape de configuration, qui est là où tout se décide. Demandons de l'aide.

# ./configure --help | less

Parmi la liste d'options se trouve celle qui permet de contrôler le répertoire dédié aux bibliothèques :

--libdir=DIR        object code libraries [EPREFIX/lib]

Utilisons donc cette option.

# ./configure --libdir=/usr/local/lib64/
# make
# make install

Vérifions où se trouve libiperf.so :

# ls /usr/local/lib64/libiperf.*

Et tout est correct pour exécuter iperf :

# ldd /usr/local/bin/iperf3
        linux-vdso.so.1 => (0x00007fffc1d50000)
        libiperf.so.0 => /usr/local/lib64/libiperf.so.0 (0x00007fdc5baef000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fdc5b71b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fdc5bd0c000)

Le cas de iperf est un peu particulier, du fait que la bibliothèque est fournie avec le logiciel lui-même. Le cas le plus courant est d'avoir une bibliothèque fournie à part (ldns et unbound par exemple). Dans tous les cas configure vous permettra de spécifier l'emplacement des fichiers de configuration, d'activer certaines fonctions, ...

Lors d'une mise à jour il sera nécessaire de réutiliser ces même options (sauf indication contraire des développeurs, dans le cas d'un changement de version majeure par exemple). Vous n'avez pas besoin de noter celles que vous avez utilisé, elles se trouvent au début du fichier config.log qui conserve les résultats de la commande configure.

# head config.log
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by iperf configure 3.0.11, which was
generated by GNU Autoconf 2.69. Invocation command line was

  $ ./configure --libdir=/usr/local/lib64/

## --------- ##
## Platform. ##

Cet article devrait vous fournir les bases pour compiler d'autres logiciels de manière similaire. Lorsqu'une installation "classique" ne fonctionne pas le "kit de premier secours" est souvent basé sur ldd, ldconfig et find. En ayant bien évidemment pris le temps de lire la documentation fournie en premier lieu.

publié le 27 novembre 2015