Java の binfmt_misc
Wikipedia より:
- "binfmt_misc は任意の実行ファイル形式を認識して特定のユーザースペースアプリケーション (エミュレータや仮想マシンなど) で実行できる Linux カーネルの機能である。"
分かりやすく説明すると、普通は Java の jar ファイルや Mono の exe ファイルはコマンドラインから以下のように実行するところ:
java -jar /path/to/MyProgram.jar mono /path/to/MyProgram.exe
binfmt_misc を使うことで PATH が通っていれば以下のように実行できるようになります:
MyProgram.jar MyProgram.exe
この記事の情報は Linux のカーネルソースツリーの Documentation サブディレクトリに存在する binfmt_misc.txt
と java.txt
を基にしています。
目次
セットアップ
binfmt_misc のマウント
一時的にマウントするには:
# mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
永続的にマウントするには fstab に以下の行を追加:
none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0
binfmt_misc でファイルタイプを登録
Arch ではファイルタイプの登録は systemd-binfmt によって処理されます。
Binfmt を登録する行を /etc/binfmt.d
のファイルに記述してください。
行の中身は Documentation/binfmt_misc.txt
ファイルで説明されています。
以下の行は明示的に java コマンドを呼び出さなくても java バイナリを実行するための登録ファイルを作成します (Java のインストールが必要です)。最初の2行は Java のクラスと jar ファイルを次のセクションで説明しているラッパースクリプトにリダイレクトしています。最後のエントリは Java アプレットを通常通りに実行します。
# binfmt_misc support for Java applications: echo ':Java:M::\xca\xfe\xba\xbe::/usr/local/bin/javawrapper:' > /etc/binfmt.d/Java.conf # binfmt_misc support for executable Jar files: echo ':ExecutableJAR:E::jar::/usr/local/bin/jarwrapper:' > /etc/binfmt.d/ExecutableJAR.conf # binfmt_misc support for Java Applets: echo ':Applet:E::html::/opt/java/bin/appletviewer:' > /etc/binfmt.d/Applet.conf
systemd-binfmt
を再起動して新しいハンドラを登録してください。登録された binfmt ハンドラはファイルとして /proc/sys/fs/binfmt_misc
から確認できます。このファイルを表示すると登録されたラッパースクリプトの名前とファイルタイプを認識するために使われるマジックバイトあるいはファイル拡張子がわかります。
ラッパースクリプト
jarwrapper および javawrapper スクリプトと関連プログラムについては、ラッパーの例を参照してください。
シンプルなソリューション
大抵な場合はシンプルなソリューションで問題なく機能します。/etc/binfmt.d/java.conf
ファイルを作成:
:Java:E::class::/usr/local/bin/javawrapper:
/usr/local/bin/javawrapper
ファイルを作成:
#!/bin/sh file=${1%%.class} file=${file/.\//} java $file
パーミッションを設定:
# chmod +x /usr/local/bin/javawrapper
設定したら実際にテストしてみてください。
テスト
以下のような簡単な HelloWorld.java
プログラムを作成:
class HelloWorld { public static void main(String args[]) { System.out.println("Hello World!"); } }
通常通りにコンパイルして .class ファイルを作成したら、以下のコマンドで実行可能属性を付与:
chmod +x HelloWorld.class
以下のコマンドでプログラムを実行できるはずです:
./HelloWorld.class
ノート
- 一部資料では binfmt_misc はモジュールとして紹介されていますが Arch は標準カーネルに組み込んでビルドします。
- 上記の設定は Sun JRE と OpenJDK 6 で動作を確認しています。
- binfmt_misc は他のファイルタイプでも使うことができます。例えば Wine プログラムを明示的に指定せずに DOS/Windows のファイルを実行するには次の登録エントリを追加します。
# binfmt_misc support for DOS / Windows applications via Wine echo ':DOSWin:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register