La compatibilité binaire avec Linux n'est pas
activée par défaut. La manière la plus simple
pour activer cette fonctionnalité est de charger le KLD
linux
(« Kernel LoaDable
object »—objet chargeable par le noyau, ce que l'on
nomme couramment un module). Vous pouvez charger ce module
en tapant ce qui suit sous l'utilisateur
root
:
#
kldload linux
Si vous désirez que la compatibilité Linux soit
toujours activée, alors vous devrez ajouter la ligne
suivante au fichier /etc/rc.conf
:
La commande kldstat(8) peut être utilisée pour vérifier que le KLD est chargé:
%
kldstat
Id Refs Address Size Name
1 2 0xc0100000 16bdb8 kernel
7 1 0xc24db000 d000 linux.koSi pour quelques raisons vous ne voulez ou pouvez charger le
KLD, alors vous pouvez lier statiquement la compatibilité
binaire Linux dans votre noyau en ajoutant options
COMPAT_LINUX
à votre fichier de configuration du noyau.
Puis installez votre noyau comme décrit dans la
Chapitre 8, Configurer le noyau de FreeBSD.
Cela peut être fait de deux manières, soit en utilisant le logiciel porté linux_base, soit en les installant à la main.
C'est de loin la méthode la plus simple pour installer les bibliothèques. La procédure est juste identique à l'installation d'un autre logiciel porté à partir du catalogue des logiciels portés. Faites ce qui suit:
#
cd /usr/ports/emulators/linux_base-fc4
#
make install distclean
La compatibilité binaire Linux devrait maintenant fonctionner. Certains programmes pourront se plaindre de versions mineures incorrectes de certaines bibliothèques systèmes. Cela semble, en général, ne pas vraiment être un problème.
Il peut y avoir de multiples versions disponibles
du logiciel porté emulators/linux_base
, correspondant
à différentes distributions et versions de Linux.
Vous devez installez la version la plus proche de ce que
nécessite les applications Linux que vous désirez
installer.
Si vous n'avez pas le catalogue des logiciels
portés installé, vous pouvez à la
place installer les bibliothèques à la main.
Il vous faudra les bibliothèques partagées
Linux dont à besoin le programme et l'éditeur
de lien dynamiques. Vous devrez également
créer un répertoire racine
“masquant” (“shadow root”),
/compat/linux
, pour les
bibliothèques Linux sur votre système FreeBSD.
Toute bibliothèque partagée ouverte par les
programmes Linux exécutés sous FreeBSD iront d'abord voir
dans cette arborescence. Ainsi, si un programme Linux
charge, par exemple, /lib/libc.so
,
FreeBSD essayera d'abord d'ouvrir
/compat/linux/lib/libc.so
, puis si
cette bibliothèque n'existe pas,
/lib/libc.so
. Les bibliothèques
partagées doivent donc être installées
sous l'arborescence /compat/linux/lib
plutôt que sous les chemins d'accès
mentionnés par la commande Linux
ld.so
.
Généralement, vous ne devrez cherchez à savoir de quelles bibliothèques partagées dépendent les binaires Linux que les premières fois que vous installerez des programmes Linux sur votre système FreeBSD. Au bout d'un moment, vous disposerez d'un jeu suffisant de bibliothèques partagées Linux sur votre système pour être en mesure d'exécuter les binaires Linux nouvellement importés sans effort supplémentaire.
Que faire si vous avez installé le logiciel
porté linux_base
et que votre
application se plaint toujours qu'il lui manque des
bibliothèques partagées?
Comment savoir quelles bibliothèques partagées
ont besoin les binaires Linux, et où se les
procurer? Il a habituellement deux possibilités
(pour suivre les instructions ci-dessous, vous devrez
être en session sous le compte super-utilisateur
root
).
Si vous avez accès à un système Linux, déterminez de quelles bibliothèques partagées l'application a besoin, et copiez-les sur votre système FreeBSD. Soit l'exemple suivant:
Supposons que vous veniez de télécharger
le binaire Linux de Doom,
et que vous l'avez installé sur un système
Linux. Vous pouvez alors vérifier de quelles
bibliothèques partagées il a besoin pour
fonctionner avec la commande
ldd linuxdoom
:
%
ldd linuxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29Vous devrez récupérer tous les
fichiers mentionnés dans la dernière colonne,
et les installer sous /compat/linux
,
en utilisant les noms de la première colonne comme
liens symboliques qui pointent dessus. Cela signifie
que vous aurez éventuellement les fichiers suivants
sur votre système FreeBSD:
Note:
Remarquez que si vous avez déjà une bibliothèque partagée de même numéro de version majeure que celle indiquée par la première colonne du résultat de la commande
ldd
, il est inutile de copier le fichier donné par la dernière colonne sur votre système, celui que vous avez déjà devrait suffire. Il est cependant recommandé de recopier malgré tout la bibliothèque partagée si c'est une version récente. Vous pouvez supprimer l'ancienne version, du moment que le lien symbolique pointe sur la nouvelle. Par exemple, si vous avez les bibliothèques suivantes sur votre système:/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27et que vous avez un nouveau binaire qui d'après le résultat de la commande
ldd
semble avoir besoin d'une version plus récente:libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29Si vous n'avez qu'une ou deux versions de retard sur le dernier indice, alors ne vous souciez pas d'installer la version
/lib/libc.so.4.6.29
plus récente, parce que le programme devrait fonctionner sans problème avec une version légèrement antérieure. Vous pouvez néanmoins décider de remplacerlibc.so
, ce qui devrait vous donner quelque chose comme:/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Note:
Le mécanisme de lien symbolique n'est nécessaire que pour les binaires Linux. L'éditeur de liens dynamiques de FreeBSD se charge lui-même de trouver les numéros de versions majeures adéquats et vous n'avez pas à vous en préoccuper.
Une étape supplémentaire est parfois nécessaire pour les binaires ELF: le “marquage”. Si vous tentez d'exécuter un binaire ELF non marqué, vous obtiendrez un message d'erreur ressemblant à ce qui suit:
%
./mon-binaire-elf-linux
ELF binary type not known
AbortPour que le noyau FreeBSD puisse distinguer un binaire ELF FreeBSD d'un binaire Linux, vous devez employer l'utilitaire brandelf(1):
%
brandelf -t Linux mon-binaire-elf-linux
Les outils GNU incorporent désormais automatiquement les marques nécessaires dans les binaires ELF, vous aurez donc de moins en moins besoin de passer par cette étape à l'avenir.
Si le DNS ne fonctionne pas, ou si vous avez les messages:
Vous devrez configurer un fichier
/compat/linux/etc/host.conf
contenant:
Où l'ordre ci-dessus spécifie qu'il faut tout
d'abord regarder dans le fichier /etc/hosts
puis interroger le DNS. Quand le fichier
/compat/linux/etc/host.conf
n'existe pas,
les applications Linux trouvent le fichier
/etc/host.conf
de FreeBSD et se plaignent de
sa syntaxe FreeBSD incompatible. Supprimez
bind
si vous n'avez pas configuré de
serveur de noms avec le fichier
/etc/resolv.conf
.
Ce document, ainsi que d'autres peut être téléchargé sur ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Pour toutes questions à propos de FreeBSD, lisez la
documentation avant de contacter
<questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez
<doc@FreeBSD.org>.