Registrando extensões no kernel com o binfmt_misc

Você alguma vez já pensou que maravilha seria se quando fizesse uma chamada a um programa feito para a plataforma Windows, ele automaticamente fazendo uso do wine, se instalasse? Ou se arquivos compilados em Java se executassem sem necessariamente termos que escrever aquela enorme expressão antes do arquivo que deve ser executado? Pois essa é a função do binfmt_misc, recurso do kernel que será explicado nesse artigo.

[ Hits: 19.041 ]

Por: Roberson Carlos em 10/12/2004 | Blog: http://carlrobers.wordpress.com


Configurando o binfmt_misc



Para iniciar a configuração, você deve montar o binfmt_misc com o seguinte comando:

$ mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc

Para registrar um novo arquivo binário você terá que passar para o arquivo register algumas strings, o arquivo register fica dentro do diretório /proc/sys/fs/binfmt_misc. Lá você encontrará dois arquivos, o register e o status, este segundo, como o nome já diz, fornece informações a respeito do status do binfmt_misc. Ele sempre retornará o valor 0 (Ativo) e 1 (Desativo).

Já o register recebe as informações por nós fornecidas e com elas permite a compreensão de alguns arquivos a mais para o kernel. Neste momento pode até parecer complicado, mas você não deve se preocupar quanto a isto, logo verá que e muito simples o funcionamento deste.

As strings fornecidas ao arquivo register devem seguir uma ordem semelhante a esta:

:name:type:offset:magic:mask:interpreter:

Você deve fazer as escolhas dos parâmetros e passá-los para o arquivo /proc/sys/fs/binfmt_misc de acordo com as suas necessidades, você entenderá mais disto adiante.

Abaixo segue o significado de cada parâmetro:
  • name - é uma string de identificação. Um novo arquivo /proc será criado com este nome dentro de /proc/sys/fs/binfmt_misc.

  • type - é a forma de reconhecimento, é aqui que você informa a maneira que o binfmt_misc devera reconhecer o arquivo binário. Use 'M' para magic, assim ele vai ler o conteúdo do cabeçalho do arquivo e se o reconhecer irá usar o interpretador deste para interpretá-lo e 'E' para extensão, o binfmt_misc vai reconhecer os arquivos pelas suas extensões.

  • offset - é o offset do magic/mask no arquivo, conteúdo em bytes. O padrão deste é 0 se não for acrescentado nada.

  • magic - é a seqüencia de byte do binfmt_misc. A string magic pode conter caracteres hex-encoded como \x0a ou \xA4. É nesta área que devem ser fornecidos os bytes que correspondem ao cabeçalho do arquivo binário. Caso você esteja passando os dados em um shell será necessário adicionar mais uma barra como em: \\x0a para estar prevenido quando o shell comer uma barra.

    Se você optou por usar um E em Type, então o binfmt_misc deverá reconhecer os arquivos fazendo uso da extensão que existe em cada arquivo. É nesta parte que deve ser posta a extensão, porém não adicione à ela um ponto como em: .exe, caso queira você se referir à extensão exe, deve passar esta assim: exe. Lembre-se que o Linux é case-sensitive, Exe é muito diferente de exe.

  • mask - é uma mascara opcional, caso não seja passado nada para esta macro ela terá o valor 0xff.

  • interpreter - aqui deve ser referenciado o programa que irá interpretar o arquivo binário (especifique o caminho completo - exemplo: /usr/bin/wine) .

Ainda existem algumas restrições, são elas:
  • A string completa que para o register é enviada não pode exceder 255 caracteres.
  • O magic precisa ser encontrado nos primeiros 128 bytes do arquivo binário.
  • A string salva na macro interpreter não pode exceder 127 caracteres.

Como vos afirmei acima, para se usar o binfmt_misc é necessário montá-lo primeiro, você pode adicionar as linhas abaixo no seu arquivo /etc/rc.d/rc.local ou no arquivo que inicializa o sistema de arquivos local do seu computador, talvez as referências descritas neste documento não façam muito sentido para a sua distribuição, mas os comandos aqui descritos funcionaram perfeitamente sob a distribuição Slackware 9:

# Insere o módulo BINFMT_MISC dentro do kernel
# Genova Home Page - www.genova.cjb.net ou www.genova.rg3.net


if [ ! -e /proc/sys/fs/binfmt_misc/register ]; then
   /sbin/modprobe binfmt_misc
    echo "Montando binfmt_misc"
    mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
fi

Ou você pode adicionar as seguintes linhas ao arquivo /etc/fstab:

none   /proc/sys/fs/binfmt_misc   binfmt_misc   defaults   0 0  

com o comando:

$ cat 'none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0' >> /etc/fstab

Estas poucas linhas montam o binfmt_misc para que o kernel possa ler seus registros, desde que exista registros nele.

Dentro do arquivo rc.local ainda cabe mais uma configuração:

# Registra o suporte ao Java
if [ -e /proc/sys/fs/binfmt_misc/register ]; then
   echo ':Java:M::\xca\xfe\xba\xbe::/usr/bin/java:' > /proc/sys/fs/binfmt_misc/register
   echo "Suporte para o Java foi carregado como módulo dentro do Kernel"
else
   echo "Não há suporte para binfmt_misc, talvez não esteja montado"
   exit 1
fi

Estas linhas adicionam o suporte para os arquivos java-class, assim quando se quiser executar um arquivo com extensão class, basta escrever o nome do mesmo, como quando chamamos um arquivo binário como o cat ou o sndconfig.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Configurando o binfmt_misc
   3. Associando tipos de arquivos ao binfmt_misc
   4. Ativando/Desativando o binfmt_misc
Outros artigos deste autor

Gerando arquivos JAR com o Eclipse

VNC - Virtual Network Computing

Corel Draw - Codeweavers - CrossOver Linux

Desmistificando o Linux Loader (LILO)

Rodando jogos a partir de uma imagem ISO

Leitura recomendada

Compilando Kernel do Linux no Debian

Atualizando kernel de 2.4.31 para 2.6.13 no Slackware 10.2

UZIX - O Linux do MSX (Z80)

Recompilando o kernel na distribuição Debian

Atualizando o kernel no Slackware

  
Comentários
[1] Comentário enviado por vodooo em 11/12/2004 - 07:39h

Cara, perfeito!!! Bom artigo!

É o linux sempre simplificando nossas vidas!!!

Abraços

[2] Comentário enviado por luiscarlos em 11/12/2004 - 11:14h

Ótimo artigo, muito bem explicado e de grande utilidade, facilita a vida dos programadores e aumenta o conhecimento dos gamados por fuçar no kernel o que eh muito prazeroso, mas soh uma perguntinha, qual foi sua fonte de pesquisa, falo por que tem um artigo muito parecido escrito pelo Morimoto em http://www.guiadohardware.net/artigos/293/ ,se foi de lah sua fonte eu acharia bastante ético vc citar a fonte, sem críticas negativas, apenas um comentário, estah de parabéns pelo artigo!!

[3] Comentário enviado por robersonfox em 13/12/2004 - 15:22h

luis0101, nao sei se você já leu algum outro artigo meu pela rede afora, mas uma vez publiquei que estava traduzindo os arquivos do linux, incluindo o diretório /etc e tambem o kernel, eu os traduzi completamente usando um português ´xulo´, pois eu estava cansado do dialeto mecanico que os computadores nos retornam, nesta epoca eu traduzindo o kernel encontrei um arquivo explicativo, e a partir dele criei este, entendeu?
Valeu.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts