Compatibilité Linux

De Diablotins.org.


Image:brush.png

Lancer des programmes écrits pour Linux.




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


Sommaire

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 les “NOTES”.
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, obsolète.
  • emulators/linux_base-f8........retenue pour FreeBSD 7, adoptée.
  • emulators/linux_base-f10........retenue pour FreeBSD 8.1, adoptée.
  • 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.

Par exemple, sous FreeBSD 8.1, vous devez revenir à fedora-8:

pkg_delete -fi linux_base-f10\*
echo "OVERRIDE_LINUX_BASE_PORT=f8" >> /etc/make.conf'
echo "OVERRIDE_LINUX_NONBASE_PORTS=f8" >> /etc/make.conf'
pkg_add ­r linux_base-f8'

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.

Plus!

« C'est l'histoire d'un gars qui veut la machine la plus puissante du
monde sous Windows 95 en émulation sous Wine qui tourne sur une station
FreeBSD avec bibliotheque de compatibilité Linux. »
    -+- ST in Guide du linuxien pervers : "A quoi sert Unix ?" -+-
Projets :