Par défaut, les bibliothèques Linux® ne sont pas installées et la compatibilité binaire avec Linux n'est pas activée. Les bibliothèques Linux® peuvent être installées soit manuellement soit à partir du catalogue des logiciels portés.
Avant de tenter de compiler un logiciel, charger le module du noyau Linux®, sinon la compilation risque d'échouer:
#
kldload linux
Pour une compatibilité en 64bits:
#
kldload linux64
Pour vérifier que le module est bien chargé:
%
kldstat
Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko
Le logiciel précompilé emulators/linux_base-c7 ou la version compilée à partir du catalogue des logiciels portés est la méthode la plus simple pour installer l'ensemble des bibliothèques et binaires de base Linux® sur un système FreeBSD. Pour installer le logiciel porté:
#
pkg install emulators/linux_base-c7
Pour activer au démarrage la compatibilité Linux®, ajouter
ligne suivante au fichier
/etc/rc.conf
:
linux_enable="YES"
Sur les machines 64bits, /etc/rc.d/abi
chargera automatiquement le module pour l'émulation
64bits.
Depuis qu'à été ajouté le support pour l'exécution des binaires Linux® 32 et 64 bits à la couche de compatibilité Linux® (sur les hôtes 64 bits de type x86), il n'est plus possible d'ajouter l'émulation en statique dans un noyau personnalisé.
Si une application Linux® se plaint de l'absence d'une bibliothèque partagée après avoir configuré la compatibilité binaire Linux®, déterminez quelle est la bibliothèque partagée nécessaire au binaire Linux® et installez-la à la main.
A partir d'un système Linux®, la commande
ldd
peut être utilisée pour déterminer
quelles sont les bibliothèques partagées dont l'application a
besoin. Par exemple, pour contrôler quelles bibliothèques
partagées sont nécessaires à linuxdoom
,
exécuter cette commande à partir d'un système Linux® où est
installé Doom:
%
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.29
Ensuite, copier tous les fichiers mentionnés dans la
dernière colonne, du système sous Linux® vers
/compat/linux
sur le système FreeBSD. Une
fois copiés, créer les liens symboliques vers les noms de
fichiers donnés dans la première colonne. Cet exemple donnera
lieu aux fichiers suivants sur le système FreeBSD:
/compat/linux/usr/X11/lib/libXt.so.3.1.0 /compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0 /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Si une bibliothèque Linux® partagée existe avec le 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 la copier vers le nom de fichier donné par la
dernière colonne, la bibliothèque déjà existante devrait
fonctionner. Il est cependant recommandé de copier malgré
tout la bibliothèque partagée si c'est une version récente.
L'ancienne version peut être supprimée, du moment que le lien
symbolique pointe sur la nouvelle.
Par exemple, les bibliothèques suivantes existent déjà sur le système FreeBSD:
/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27
et ldd
indique qu'un binaire a besoin
d'une version plus récente:
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
Etant donné que la bibliothèque existante n'a qu'une ou
deux versions de retard sur le dernier digit, le programme
devrait fonctionner avec la version légèrement plus ancienne.
Il est, néanmoins, plus sûr de remplacer la
libc.so
existante avec la version plus
récente:
/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
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 le système FreeBSD. Au bout d'un moment, il y aura un ensemble suffisant de bibliothèques partagées Linux® sur le système pour être en mesure d'exécuter les binaires Linux® nouvellement importés sans effort supplémentaire.
Une étape supplémentaire est parfois nécessaire pour les binaires ELF. Quand un binaire ELF non marqué est exécuté, une erreur sera générée:
%
./mon-binaire-elf-linux
ELF binary type not known Abort
Pour 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, cette étape n'est généralement pas nécessaire.
Pour installer une application Linux® basée sur
RPM, installer en premier le logiciel
précompilé ou porté archivers/rpm4. Une
fois installé, root
peut utiliser la commande suivante pour installer un
.rpm
:
#
cd /compat/linux
#
rpm2cpio < /path/to/linux.archive.rpm | cpio -id
Si nécessaire, utiliser brandelf
sur
les binaires ELF installés. Il faut noter
que cela empêchera une desinstallation propre.
Si le DNS ne fonctionne pas, ou si cette erreur apparaît::
resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword
Vous devrez configurer un fichier
/compat/linux/etc/host.conf
contenant:
order hosts, bind multi on
Cela indique 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
et se plaignent de
sa syntaxe FreeBSD incompatible. Supprimez
bind
si un serveur de noms n'est pas configuré
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>.