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, Configuración del kernel de FreeBSD.
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.
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 actualizarlibc.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>.