Cuando en GNU/Linux se dan permisos de ejecución a un archivo y se ejecuta, el kernel identifica por medio de la cabecera o bien extensión el tipo de fichero que es. Dependiendo del tipo que tenga el fichero ha ejecutar (binario ELF, un script, un fichero zip, etc), el kernel lo enviara al controlador pertinente encargado de procesarlo. Cuando un controlador no puede procesar un fichero la instrucción se pasa a otro controlador, uno detrás de otro. En este blob del kernel se puede ver como funciona el controlador para ejecución de scripts y binarios con formato ELF.
El cargador de controlador binfmt_misc nos ofrece a nivel de espacio de usuario asociar aplicaciones a tipos concretos de archivos para su ejecución. Esto permite dar permisos de ejecución a una imagen .png con chmod y ejecutarla “./imagen.png” para que se visualice con la aplicación configurada.
Limitaciones de binfmt_misc.
Si el directorio “/proc/sys/fs/binfmt_misc” no existe se debe montar con el siguiente comando.
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc # Si se quiere dejar configurado de manera persistente en el fichero /etc/fstab. # none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0
Sintaxis.
:name:type:offset:magic:mask:interpreter:flags # name: Nombre identificativo (no pebe tener "/"). # type: M (Reconocimiento de tipo por cabecera) / E (Reconocimiento de tipo por extensión). # offset: Al usar M en type el offset define los bytes de la cabecera (por defecto 128) # magic: Secuencia de bytes que debe encontrar en la cabecera. Las "magic strings" suelen empezar con el codigo hexadecimal \x0a o \xA4 # mask: (Opcional) Por defecto acepta todo (0xff), pero se puede definir una máscara para varias "magic strings". # interpreter: Programa que es ejecutado teniendo el fichero como primer parámetro. Debe tener la ruta completa. # flags: Permite controlar algunos aspectos de la ejecución
Ejemplo.
Crear dos registros binfmt_misc, uno para ficheros .png (Visor de imágenes viewior) y otros para cabeceras de ficheros DOS (Wine).
echo ':viewniorpng:E::png::/usr/bin/viewnior:' > /proc/sys/fs/binfmt_misc/register echo ':DOSWin:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register
Los ficheros viewniorpng y DOSWin serán creados en /proc/sys/fs/binfmt_misc/.
cat /proc/sys/fs/binfmt_misc/DOSWin enabled interpreter /usr/bin/wine flags: offset 0 magic 4d5a
NOTA: El orden de creación de registros puede ser importantes, los últimos serán consultados primero.
Activar desactivar entradas registradas binfmt_misc.
echo "-1" > /proc/sys/fs/binfmt_misc/DOSWin # Elimina la entrada DOSWin. echo 0 > /proc/sys/fs/binfmt_misc/status # Desactiva binfmt_misc echo 1 > /proc/sys/fs/binfmt_misc/status # Activa binfmt_misc