10.2. Configurando a compatibilidade binária com o Linux®
Anterior | Capítulo 10. Compatibilidade binária com o Linux® | Próxima

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

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

Anterior | Acima | Próxima
Capítulo 10. Compatibilidade binária com o Linux® | Principal | 10.3. Tópicos Avançados

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