22.2. Instalação

A compatibilidade Linux não é ligada por padrão. A maneira mais fácil de habilitar esta funcionalidade é carregando o objeto KLD linux (``Kernel LoDable object''). Você pode carregar este módulo simplesmente digitando linux na linha de comando.

Se você quer que a compatibilidade Linux esteja sempre habilitada, então você deve adicionar a seguinte linha no /etc/rc.conf:

linux_enable="YES"

O comando kldstat(8) pode ser usado para verificar se o KLD está carregado:

% kldstat
Id Refs Address    Size     Name
 1    2 0xc0100000 16bdb8   kernel
 7    1 0xc24db000 d000     linux.ko

Se, por alguma razão, você não quer ou não pode carregar o KLD, então você pode ligar estaticamente a compatibilidade binária Linux no kernel adicionando options LINUX ao seu arquivo de configuração. Depois instale seu novo kernel como como descrito em Capítulo 9.

22.2.1. Instalando Bibliotecas Linux de Tempo de Execução

Isto pode ser feito de duas maneiras, usando o port linux_base, ou instalando as bibliotecas manualmente.

22.2.1.1. Instalando o port linux_base

Este é de longe o método mais fácil para instalar as bibliotecas de tempo de execução. É como instalar qualquer outra aplicação da árvore de alicações ports collection. Simplesmente faça o seguinte:

# cd /usr/ports/emulators/linux_base
# make install distclean

Agora você deve ter a compatibilidade binária Linux funcionando. Alguns programas podem reclamar a respeito de pequenas diferenças de versão das bibliotecas de sistema. Em geral, entretanto, isto não parece ser problema.

Nota: Podem existir multiplas versões do port emulators/linux_base disponíveis, correspondendo a diferentes versões de várias distribuições Linux. Você deve instalar a versão que mais se aproxima dos requisitos das aplicações Linux que você deseja instalar.

22.2.1.2. Instalando Manualmente as Bibliotecas

Se você não possui a coleção ``ports'' instalada, você pode instalar as mesmas manualmente. Você precisará das bibliotecas compartilhadas Linux das quais o programa depende e um ligador em tempo de execução. Além disso, você precisa criar um diretório ``shadow root'', /compat/linux, para as bibliotecas Linux no seu sistema FreeBSD. Qualquer biblioteca compartilhada aberta por aplicações Linux sob o FreeBSD buscarão este diretório primeiro. Sendo assim, se um programa Linux carrega, por exemplo, o arquivo /lib/libc.so, o FreeBSD primeiro vai tentar abrir /compat/linux/lib/libc.so, e se não existir, então tentará /lib/libc.so. Bibliotecas compartilhadas devem ser instaladas na árove /compat/linux/lib ao invés dos caminhos que a biblioteca Linux ld.so reporta.

Geralmente, você precisará procurar pelas bibliotecas compartilhadas das quais as bibliotecas Linux dependem apenas nas primeiras vezes que você instalar um programa Linux no seu sistema FreeBSD. Depois de um tempo, você possuirá um conjunto suficiente de bibliotecas Linux compartilhadas no seu sistema que serão capazes de executar binários Linux recentemente importados sem qualquer trabalho extra.

22.2.1.3. Como Instalar Bibliotecas Compartilhadas Adicionais

E se você instalar o linux_base e sua aplicação ainda reclamar que faltam bibliotecas compartilhadas? Como você sabe quais bibliotecas compartilhadas os binários Linux precisam, e onde obtê-las? Basicamente, existem duas possibilidades (ao seguir estas instruções você precisará estar como root no seu sistema FreeBSD).

Se você tem acesso a um sistema Linux, veja quais bibliotecas compartilhadas a aplicação necessita, e copie-as para o seu sistema FreeBSD. Veja o seguinte exemplo:

Vamos assumir que você usou FTP para obter o binário Linux do Doom, e colocou em um sistema Linux ao qual você tem acesso. Você então pode verificar quais bibliotecas compartilhadas ele precisa executando ldd linuxdoom, como:

% 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

Você precisará pegar todos os arquivos na última coluna e colocá-los em /compat/linux, com os nomes da primeira coluna como ligações simbólicas apontando para eles. Isto significa que eventualmente tem estes arquivos em seu 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

Nota: Note que se você já possui uma biblioteca Linux compartilhada em que as versões principais batem com a da primeira coluna da saída do comando ldd, você não precisará copiar o arquivo com o nome da última coluna para o seu sistema, a versão que você tem deve funcionar. Entretanto, é aconselhável copiar a biblioteca compartilhada se a versão for mais nova. Você pode remover a antiga assim que você fizer o link simbólico apontando para a mais nova. Então, se você possuir estas bibliotecas em seu sistema:

/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27

e você tem um novo binário que requer a última versão, de acordo com a saída do ldd:

libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29

Se for apenas uma ou duas versões atrasadas no digito final então não se preocupe em copiar o /lib/libc.so.4.6.29 também, pois o programa deve funcionar bem com a versão ligeiramente mais antiga. Entretanto, se você quiser, você pode decidir substituir o arquivo libc.so e isto fará com que você fique com:

/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

Nota: O mecanismo de ligação simbólica somente é necessário para binários Linux. O ligador em tempo de execução do FreeBSD se encarrega de procurar pelos números de versão mais recentes e você não precisa se preocupar.

22.2.2. Instalando Binários Linux ELF

Binários ELF algumas vezes requerem um passo extra de ``marcação''. Se você tentar executar um binário ELF não marcado, você obterá uma mensagem de erro como a seguinte:

% ./my-linux-elf-binary
ELF binary type not known
Abort

Para ajudar o kernel do FreeBSD a distinguir entre um binário ELF do FreeBSD e um binário Linux, use o utilitário brandelf(1).

% brandelf -t Linux my-linux-elf-binary

O ``GNU toolchain'' agora coloca a informação de marcação apropriada automaticamente nos binários ELF, de maneira que este passo deve se tornar cada vez mais desnecessário no futuro.

22.2.3. Configurando o Resolvedor de nomes de Host

Se o DNS não funciona ou se você recebe esta mensagem:

resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword

Você precisará configurar o arquivo /compat/linux/etc/host.conf com o conteúdo:

order hosts, bind
multi on

O ``order'' aqui especifica que a procura é feita primeiro no arquivo /etc/hosts e depois no DNS. Quando o arquivo /compat/linux/etc/host.conf não está instalado, as aplicações Linux encontram o /etc/host.conf do FreeBSD e reclamam da sintaxe incompatível. Você deve remover o bind se você não configurou um servidor de nomes usando o arquivo /etc/resolv.conf.

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.