10.2. Configurando a compatibilidade binária com o Linux®

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-c7 é 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-c7

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.

10.2.1. Instalando Bibliotecas Adicionais Manualmente

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.

10.2.2. Instalando os binários Linux® ELF

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.

10.2.3. Instalando um aplicativo baseado em Linux® RPM

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.

10.2.4. Configurando o Resolver do Hostname

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>.