2005-07-10 Autor: Markus Raab TODO: .net, exe, .c, .cpp files (crun) Howto - binfmt unter Debian Der Kernel kann schon seit einiger Zeit nicht nur a.out und ELF ausführen, sondern für jede beliebige Datei den richtigen Interpreter starten. Dadurch wird ermöglicht Java oder Windowsprogramme direkt zu executieren. Mit einem Skript könnte man es so erledigen: #!/bin/sh #Run startup skript #Dieses Skript ermöglicht es #C, C++, .exe, .jar und .java #Dateien direkt auszuführen. #Java executeable erlauben PATH="/bin" cd / case "$1" in start) mount -t binfmt_misc none /proc/sys/fs/binfmt_misc/ cd /proc/sys/fs/binfmt_misc/ echo ':Java:M::\xca\xfe\xba\xbe::/usr/bin/runjava:' > register echo ':Jar:E::jar::/usr/bin/runjar:' > register echo ':C:E::c::/usr/bin/runcc:' > register echo ':C++:E::c++::/usr/bin/runc++:' > register echo ':DEXE:M::\x0eDEX::/usr/bin/runexec:' > register #use dosexec echo ':DOSWin:M::MZ::/usr/bin/runwine:' > register ;; stop) echo -1 > /proc/sys/fs/binfmt_misc/status umount /proc/sys/fs/binfmt_misc ;; *) echo "Usage: $0 start|stop" esac In Debian gibt es aber speziell für binfmt einen support: apt-get install binfmt-support installiert update-binfmts. Dieses Programm ermöglicht es die verschiedenen Dateitypen zu erkennen und dem Kernel mitzuteilen, ohne das man eigene Skripts schreiben muss. Um java hinzuzufügen geht man folgenermaßen vor (aus der man page). update-binfmts --package javawrapper --install javawrapper /usr/bin/javawrapper --magic '\xca\xfe\xba\xbe' Für win32 Programme würde man folgendes schreiben: update-binfmts --package win32wrapper --install win32wrapper /usr/bin/win32wrapper --magic 'MZ' Will man .c Programm direkt executieren, so würde der Aufruf lauten: update-binfmts --package cwrapper --install cwrapper /usr/bin/cwrapper --extension ".c" --magic bedeutet: Es werden die ersten n Byte der Datei betrachtet. Können diese vom Kernel gefunden werden, so wird dieser Interpreter verwendet. --extension hingegen dient der Dateiname als erkennung. In jedem Fall muss die Datei als ausführbar markiert chmod +x sein, sonst wird der Kernel den Code nicht in das Ram laden, da die Berechtigung fehlt. Nun werden noch die Wrapper benötigt. Im Prinzip reicht es, wenn der Wrapper dazu in der Lage ist mit cwrapper file1 den richtigen Interpreter für file1 zu starten. Für .jar Dateien würde der Wrapper so aussehen: ------------------------ #!/bin/bash java -jar $* ------------------------ wobei $* für "alle Parameter" steht. Bei Java an sich ist der Wrapper sogar unnötig, er würde so aussehen: ------------------------ #!/bin/bash java $* ------------------------ In diesem Fall könnte man gleich direkt die java executeable als wrapper angeben! Die ganzen run Skripte sind in einem Package auf ftp://markus-raab.org/eigene vorhanden. Um ein binfmt-Package entfernen zu können, geht man folgendermaßen vor. Man will folgenden Eintrag entfernen: update-binfmts --package cwrapper --install cwrapper /usr/bin/cwrapper --extension ".c" dazu einfach: update-binfmts --package cwrapper --remove cwrapper /usr/bin/cwrapper ... to be continued (missing --import, update- befehle für run...)