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.