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...)
Fr Jul 30 13:54:24 CEST 2021
patent_button.gif valid-html401.png elektra.jpg fsfe-logo.png valid-css.png vim.gif anybrowser.gif