Por padrão, as bibliotecas do Linux® não estão instaladas e a compatibilidade binária com o Linux® não está ativada. As bibliotecas Linux® podem ser instaladas manualmente ou a partir da coleção de Ports do FreeBSD.
Antes de tentar compilar o port, carregue o módulo de kernel Linux®, caso contrário a compilação irá falhar:
#
kldload linux
Para compatibilidade com 64 bits:
#
kldload linux64
Para verificar se o módulo está carregado:
%
kldstat
Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko
O pacote ou port emulators/linux_base-c6 é a maneira mais fácil de instalar um conjunto básico de bibliotecas e binários do Linux® em um sistema FreeBSD. Para instalar o port:
#
pkg install emulators/linux_base-c6
Para que a compatibilidade com o Linux® seja ativada durante a inicialização, adicione esta linha ao /etc/rc.conf
:
linux_enable="YES"
Em máquinas de 64 bits, o /etc/rc.d/abi
carregará automaticamente o módulo para emulação de 64 bits.
Como a camada de compatibilidade binária do Linux® ganhou suporte para a execução de binários Linux® de 32 e 64 bits (em hosts x86 de 64 bits), não é mais possível vincular estaticamente a funcionalidade de emulação a um kernel personalizado.
Se um aplicativo Linux® reclamar sobre a falta de bibliotecas compartilhadas após configurar a compatibilidade binária do Linux®, determine quais bibliotecas compartilhadas o Linux® precisa e instale-as manualmente.
A partir de um sistema Linux®, o ldd
pode ser usado para determinar quais bibliotecas compartilhadas o aplicativo precisa. Por exemplo, para verificar quais bibliotecas compartilhadas o linuxdoom
precisa, execute este comando a partir de um sistema Linux® que tenha o Doom instalado:
%
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
Então, copie todos os arquivos listados na última coluna da saída do comando no sistema Linux® para o diretório /compat/linux
no sistema FreeBSD. Depois de copiados, crie links simbólicos para os nomes na primeira coluna. Este exemplo irá resultar nos seguintes arquivos no sistema 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
Se uma biblioteca compartilhada Linux® já existir com um número de revisão principal correspondente à primeira coluna da saída do comando ldd
, ela não precisará ser copiada para a arquivo nomeado na última coluna, pois a biblioteca existente deve funcionar. No entanto é aconselhável copiar a biblioteca compartilhada se for uma versão mais nova. O arquivo antigo pode ser removido, desde que o link simbólico aponte para o novo.
Por exemplo, essas bibliotecas já existem no sistema FreeBSD:
/compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27
e o ldd
indica que um binário requer uma versão posterior:
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
Como a biblioteca existente tem apenas uma ou duas versões desatualizadas no último dígito, o programa ainda deve funcionar com a versão um pouco mais antiga. No entanto, é seguro substituir o libc.so
existente pela versão mais nova:
/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Geralmente, será necessário procurar as bibliotecas compartilhadas que os binários do Linux® dependem apenas das primeiras vezes que um programa Linux® é instalado no FreeBSD. Depois de um tempo, haverá um conjunto suficiente de bibliotecas Linux® compartilhadas no sistema para poder executar binários Linux® atualizados sem qualquer trabalho extra.
Os binários ELF requerem por vezes um passo extra. Quando um binário ELF sem marca for executado, ele gerará uma mensagem de erro:
%
./my-linux-elf-binary
ELF binary type not known Abort
Para ajudar o kernel do FreeBSD a distinguir entre um binário do FreeBSD ELF e um binário Linux®, use brandelf(1):
%
brandelf -t Linux my-linux-elf-binary
Como o conjunto de ferramentas GNU coloca as informações de branding apropriadas em binários ELF automaticamente, essa etapa geralmente não é necessária.
Para instalar um aplicativo baseado em Linux® RPM, primeiro instale o pacote ou o port archivers/rpm4. Uma vez instalado, o usuário root
pode usar este comando para instalar um .rpm
:
#
cd /compat/linux
#
rpm2cpio < /path/to/linux.archive.rpm | cpio -id
Se necessário, use o brandelf
nos binários ELF instalados . Observe que isso impedirá uma desinstalação limpa.
Se o DNS não funcionar ou este erro aparecer:
resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword
configure o /compat/linux/etc/host.conf
como segue:
order hosts, bind multi on
Isso especifica que o /etc/hosts
deve ser pesquisado primeiro e o DNS deve ser pesquisado em segundo lugar. Quando o /compat/linux/etc/host.conf
não existe, os aplicativos Linux® usam o /etc/host.conf
e avisam sobre a sintaxe incompatível do FreeBSD. Remova o bind
se um servidor de nomes não estiver configurado usando o /etc/resolv.conf
.
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
documentation may be
sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.