Compatibilité Linux

Un article de Diablotins.org.


Image:brush.png

Sommaire

Synopsis

Cet article va vous permettre d'utiliser des logiciels écrits pour Linux, de «déguiser votre diablotin en clown avec un chapeau rouge».

Installer

Ajoutez l'entrée suivante dans /etc/rc.conf:

  linux_enable="YES"

Le noyau GENERIC de FreeBSD possède le module Linux.ko précompilé. Vérifiez qu'il est chargé:

david:~$ kldstat -n linux
Id Refs Address    Size     Name
8    1 0xc4973000 22000    linux.ko

Sinon:

kldload linux.ko

Il est possible de compiler la compatibilité Linux dans le noyau directement, consultez le LINT.
Ensuite installez un port qui va installer une distribution Linux.
Ces ports se situe dans «/usr/ports/emulators/linux_base-*».
Consultez FreshPorts pour déterminer celui qui est le mieux adapté à votre usage et surtout celui qui est actuellement conseillé, voire supporté par l'équipe FreeBSD.
Aujourd'hui, en septembre 2008, ces ports sont :

  • emulators/linux_base-fc4........Fedora core, actuellement conseillĂ©e pour les branches 5 et 6
  • emulators/linux_base.............Red Hat 7.3/i386, non soutenue, non maintenue
  • emulators/linux_base-8..........Red Hat 8/i386, prĂ©cĂ©dente version conseillĂ©e
  • emulators/linux_base-fc6........Fedora core, Ă  partir de la branche 7
  • emulators/linux_base-fc7........en test pour FreeBSD 7, abandonnĂ©e.
  • emulators/linux_base-f7........retenue pour FreeBSD 7, adoptĂ©e.
  • emulators/linux_base-f8........retenue pour FreeBSD 7, en test.
  • Toutes les autres : Debian (ne compile pas), suze, Gentoo; vĂ©rifiez qu'elle soient toujours maintenues.

Vous aurez ainsi installé une distribution Linux sur votre système, ou plutôt un environnement de chroot compatible.

La version du noyau que vous utilisez se trouve dans une variable système:

sysctl compat.linux.osrelease=2.6.16

Vous pouvez, selon la distribution que vous avez choisi, être amené à la changer.

Utiliser

Copiez via SSH, FTP, disquette, NFS etc. votre 'super_prog_de_la_mort' compatible Linux qui tourne en binaire ELF Linux.
Cette astuce ne fonctionne que pour ces derniers, pas pour les formats a.out.
Vous le lancez et lĂ , crack boum uh:

  $ ./super_prog_de_la_mort
  ELF binary type not known
  Abort<

D'oĂą astuce dans l'astuce, genre poupĂ©e russe :

  # brandelf -t Linux super_prog_de_la_mort

Bon, soit vous avez de la chance, ou vous saviez exactement ce que vous faisiez, soit votre boite FreeBSD vous insulte parce que vous ne disposez pas des bibliothèques nécessaires. Donc sur le Linux d'origine, entrez:

  $ ldd super_prog_de_la_mort
   lib_ki_tue_grave.so.41 -> /usr/lib/lib_ki_tue_grave.so.41

donc il vous suffit maintenant de poser dans :

  /compat/linux/

la ou les bibliothèques au même niveau que sur la boite Linux.

Attention, il ne faut pas assigner un ABI aux bibliothèques Linux mais seulement les programmes Linux. En effet, les bibliothèques Linux sont chargées par le linkeur dynamique Linux et celui-ci attend un type SVR4.

Voila, mais c'est mal.

Exemple

Vous avez sous la main un logiciel en version bĂŞta, construit pour Linux, qui a vocation d'ĂŞtre multi-plateforme.
Pour cette raison, aucun mainteneur n'a encore travaillé sur un portage pour FreeBSD. Ce mainteneur, d'ailleurs, ce pourrait être vous.

Étant destiné à être disponible sur plusieurs système, ce logiciel est construit sur des bibliothèques multi-OS; par exemple, celles de la SDL.
Voyons notre logiciel:

chmod +x ~/BetaTest/MadSoft.v01 
brandelf -t linux ~/BetaTest/MadSoftBeta.v01

Que demande-t-il:

ldd ~/BetaTest/MadSoftBeta.v01
MadSoftBeta.v01:
       libSDL-1.2.so.0 => not found 
       libSDL_image-1.2.so.0 =>not found
       libSDL_ttf-2.0.so.0 => not found
       libc.so.6 => /lib/libc.so.6 (0x28119000)
       libm.so.6 => /lib/libm.so.6 (0x28271000)
       libpthread.so.0 => /lib/libpthread.so.0 (0x2829a000)
       libdl.so.2 => /lib/libdl.so.2 (0x282b2000)
       libncurses.so.5 => /lib/libncurses.so.5 (0x282b8000)
       libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x282d8000)
       libz.so.1 => /lib/libz.so.1 (0x28362000)
       /lib/ld-linux.so.2 (0x28051000)
       libtinfo.so.5 => /lib/libtinfo.so.5 (0x28375000)

Ici, nous avons un système Linux déjà installé, - voyez libc et cie - mais les bibliothèques SDL sont manquantes.
Ne vous jetez pas sur le Web pour les tĂ©lĂ©charger ! Elles sont dans l'arbre des ports:

devel/linux-sdl12
graphics/linux-sdl_image
graphics/linux-sdl_ttf

Si votre système est vraiment épuré, vous devrez sans doute apporter d'autres bibliothèques, comme celle-ci:

x11/linux-xorg-libs.

Voyez maintenant:

ldd MadSoftBeta.v01
MadSoftBeta.v01:
       libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0x28070000)
       libSDL_image-1.2.so.0 => /usr/lib/libSDL_image-1.2.so.0 (0x280f7000)
       libSDL_ttf-2.0.so.0 => /usr/lib/libSDL_ttf-2.0.so.0 (0x28113000)
       libc.so.6 => /lib/libc.so.6 (0x28119000)
       libm.so.6 => /lib/libm.so.6 (0x28271000)
       libpthread.so.0 => /lib/libpthread.so.0 (0x2829a000)
       libdl.so.2 => /lib/libdl.so.2 (0x282b2000)
       libncurses.so.5 => /lib/libncurses.so.5 (0x282b8000)
       libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x282d8000)
       libz.so.1 => /lib/libz.so.1 (0x28362000)
       /lib/ld-linux.so.2 (0x28051000)
       libtinfo.so.5 => /lib/libtinfo.so.5 (0x28375000)

Il ne vous reste plus qu'à l'exécuter:

~/BetaTest/MadSoftBeta.v01

Suivez cette conversation, qui illustre les méthodes employées dans cet article.

pour vous faire une idée de la solution trouvée et de la méthode de recherche.

Projets :
Boîte à outils