binfmt_misc

binfmt_misc ist eine Fähigkeit des Linux-Kernels, beliebige ausführbare Dateien zu erkennen und einem bestimmten Programm im User-Mode zu übergeben, wie beispielsweise einem Interpreter oder einem Programmstarter, der das Programm in den Arbeitsspeicher lädt.

Es handelt sich um ein optionales Kernel-Modul, durch welches im Prinzip jede Datei als Programm ausgeführt werden kann. Dadurch grenzt es sich gegenüber anderen Techniken, zum Beispiel dem Shebang-Mechanismus, ab.

Die ausführbaren Formate werden in einer zentralen datenbankartigen Form in einem virtuellen Dateisystem, der sogenannten Registrierung, gespeichert, welches ähnlich wie devfs, procfs oder sysfs arbeitet. Standardmäßig wird dieses Dateisystem unter /proc/sys/fs/binfmt_misc eingebunden.

Abgrenzung gegenüber anderen Techniken

Eine alternative Möglichkeit, die ein ähnliches Ziel wie binfmt_misc verfolgt, ist der Shebang-Mechanismus. Bei ihm wird in der ersten Zeile der auszuführenden Datei der Interpreter mit der Zeichenkombination #! festgelegt. Diese Technik ist auf Unix-Derivaten vor allem für Skripte sehr weit verbreitet, eignet sich allerdings auch nur für Textdateien.

Die binfmt_misc-Technik hingegen benötigt keine spezielle Kennzeichnung in der Datei, es muss sich daher auch nicht (zwingend) um eine reine Textdatei handeln. Dadurch, dass die Assoziation zwischen Dateien und Interpretern in einer systemweit zentralen Datenbank festgehalten wird, könnte beispielsweise das Problem des Speicherortes beim Shebang-Mechanismus gelöst werden.

Registrierung

Der Speicherort der Assoziation zwischen Dateitypen und Interpretern ist die Datei register, die sich direkt im Stammverzeichnis des virtuellen binfmt_misc-Dateisystems befinden muss. Da das binfmt_misc-Dateisystem meist unter /proc/sys/fs/binfmt_misc gemountet wird, ist der Name der Datei auf den meisten Linux-Systemen /proc/sys/fs/binfmt_misc/register. Es handelt sich dabei um eine Textdatei, in der jede Zeile einen Eintrag darstellt, der festlegt, wie ausführbare Dateien behandelt werden sollen. Jede Zeile hat dabei die folgende Form:

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

Dabei stehen die Felder

  • name für den dateiweit einzigartigen Namen des Formates, welches in dieser Zeile festgelegt wird
  • type für die Art, wie die Datei erkannt werden soll. Dieses Feld hat entweder den Wert E oder M. Wenn E gesetzt wurde, wird die ausführbare Datei an der Dateierweiterung erkannt, offset und mask werden dann ignoriert. In dem Feld magic muss dann die Dateierweiterung des Dateiformats angegeben werden. Wenn hingegen M eingestellt wird, wird die ausführbare Datei durch Bytes am Anfang der Datei erkannt. magic ist dann die magic number, die die Datei identifiziert und offset ist die Stelle, an der die magic number in der Datei gefunden werden kann. Auf mask wird das bitweise UND mit der charakteristischen Zeichenfolge (in Hex), dem magic string, aus der Datei angewandt: Ungesetzte Bits werden ignoriert im Vergleich zum magic.
  • interpreter für den Pfad zu einem Programm. Der Pfad zu der auszuführenden Datei wird dabei als Argument übergeben.

Zu jedem registrierten Dateityp erstellt binfmt_misc eine Datei in dem virtuellen Dateisystem. Diese Datei kann später gelesen werden, um Informationen über das Dateiformat zu erhalten.

Nutzung

CLI- und Java-Anwendungen können dank binfmt_misc direkt dem richtigen Interpreter übergeben werden und so direkt über die Shell oder durch andere Programme gestartet werden.

Es ist auch üblich, Portable-Executable-Dateien (Dateien mit den Dateiendungen .exe und .dll, die für MS-DOS oder Microsoft Windows kompiliert wurden) auf diese Art und Weise mit Wine auszuführen. In der Registrierungsdatei würde man dann folgende Zeile notieren:

:DOSWin:M::MZ::/usr/bin/wine:

Durch den magic string MZ im type_code wird der Dateityp einer Portable Executable dabei erkannt und die Datei mit der Windows-Laufzeitumgebung ausgeführt.

Weblinks