La compatibilidad binaria con Linux no viene activada por omisión. La forma más sencilla de habilitarla es cargar el KLD (“objeto cargable en el kernel”) linux. Como usuario root proceda del siguiente modo:
# kldload linux
Si quiere que la compatibilidad con Linux esté siempre activada tendrá que añadir la siguiente línea en /etc/rc.conf:
linux_enable="YES"
Utilice kldstat(8) para verificar que el KLD esté cargado:
% kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko
Si por alguna razón no desea o no puede cargar el KLD, entonces puede enlazar estáticamente la compatibilidad de binarios Linux en el kernel agregando options COMPAT_LINUX a su fichero de configuración del kernel. Luego instale su nuevo kernel como se describe en Capítulo 8.
Puede hacerse de dos maneras, ya sea usando el port linux_base, o instalándolas de forma manual.
Este es con mucho el método mas sencillo para instalar bibliotecas de ejecución. Es como instalar cualquier otro port de la Colección de Ports. Es tan sencillo como esto:
# cd /usr/ports/emulators/linux_base # make install distclean
Hecho esto debería disponer de compatibilidad binaria con Linux. Algunos programas pueden “quejarse” por la presencia de versiones antiguas de algunas bibliotecas del sistema. Generalmente esto no suele ser un problema muy grave.
Nota: Pueden coexistir múltiples versiones del port emulators/linux_base disponibles correspondientes a distintas versiones de diversas distribuciones de Linux. Tendrá que instalar el port que más se ajuste a las necesidades de las aplicaciones de Linux que quiera instalar.
Si, por el motivo que fuese, no tiene instalada la colección de ports puede instalar las bibliotecas que necesite de forma manual. Necesitará las bibliotecas compartidas Linux de las que depende el programa y el enlazador en tiempo de ejecución (“runtime linker”). Necesitará también crear un directorio /compat/linux donde alojar las bibliotecas Linux en su sistema FreeBSD Cualquier biblioteca compartida a la que haya recurrido un programa de Linux ejecutado en FreeBSD buscará en primer lugar en dicho directorio. Por lo tanto, si se carga un programa Linux, por ejemplo /lib/libc.so, FreeBSD intentará en primer lugar abrir /compat/linux/lib/libc.so y, si no existe, lo intentará con /lib/libc.so. Las bibliotecas compartidas deben instalarse en /compat/linux/lib en lugar de las rutas que el ld.so de Linux proporcione.
En general, necesitará buscar las bibliotecas compartidas de las que los binarios Linux dependen sólamente las primeras veces que instale un programa Linux en su FreeBSD. Más adelante tendrá un conjunto suficiente de bibliotecas compartidas Linux en su sistema para poder ejecutar binarios Linux sin que tenga que hacer nada más.
¿Que pasaría si instalara el port linux_base y su aplicación todavía tuviera problemas debido a bibliotecas compartidas que no encuentra en el sistema? ¿Cómo saber qué bibliotecas compartidas necesitan los binarios Linux? Básicamente hay dos posibilidades (para poder ejecutar las siguientes instrucciones necesitará estar como root
Si tiene acceso a un sistema Linux busque en él qué bibliotecas necesita la aplicación, y cópielas a su sistema FreeBSD. Veamos unos ejemplos:
Asumiremos que utilizó FTP para conseguir los binarios Linux de Doom y los puso en un sistema Linux. Para ver qué bibliotecas compartidas necesitará ejecute 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.29
Necesitaría todos los ficheros de la segunda columna, y tendrá que ponerlos en /compat/linux con los nombres de la primera columna como enlaces simbólicos apuntando hacia ellos. De este modo tendría en su sistema FreeBSD los siguientes ficheros:
/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
Nota: Recuerde que si ya tiene una biblioteca compartida Linux con un número de versión mayor que coincida con la primera columna de la salida de ldd no necesitará copiar el fichero que aparece en la última columna; el que tiene debería funcionar, aunque se aconseja copiar la biblioteca compartida de todas maneras si es una nueva versión. Puede eliminar la vieja siempre que haga que el enlace simbólico apunte a la nueva. Si tiene estas bibliotecas en su sistema:
/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27y un binario requiere una versión más reciente (como indica la siguiente salida de ldd):
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29si solo ve una o dos versiones desfasadas en los últimos dígitos no se preocupe de copiar /lib/libc.so.4.6.29, el programa debería funcionar bien con una versión ligeramente antigua. De todas formas, si así lo prefiere, puede actualizar libc.so; el resultado sería este:
/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Nota: El mecanismo de enlazado simbólico sólamente es necesario con binarios Linux. El enlazador en tiempo de ejecución de FreeBSD se encarga de buscar él mismo las versiones correctas, así que no tendrá que preocuparse usted de hacerlo.
Los binarios ELF algunas veces requieren un paso extra de “marcado”. Si trata de ejecutar un binario ELF no marcado recibirá un mensaje de error como el siguiente:
% ./mi-binario-elf ELF binary type not known Abort
Para ayudar al kernel de FreeBSD a distinguir entre un binario ELF de FreeBSD y uno de Linux utilice brandelf(1).
% brandelf -t Linux mi-binario-elf-de-linux
Las herramientas GNU se encargan de ubicar automáticamente la marca apropiada en los binarios ELF, por lo tanto este paso será innecesario en un futuro próximo.
Si el DNS no funciona u obtiene este mensaje:
resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword
Necesitará un fichero /compat/linux/etc/host.conf con el siguiente contenido:
order hosts, bind multi on
Significa que /etc/hosts seráanalizado en primer lugar y después se usará DNS. Si /compat/linux/etc/host.conf no está instalado, las aplicaciones Linux usan el /etc/host.conf de FreeBSD y chocan con la sintaxis (incompatible) de FreeBSD. Borre bind de su /etc/resolv.conf si no tiene configurado un servidor de nombres.
Puede descargar éste y muchos otros documentos desde ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
Si tiene dudas sobre FreeBSD consulte la documentación antes de escribir a la lista
<questions@FreeBSD.org>.
Envíe sus preguntas sobre la documentación a <doc@FreeBSD.org>.