Java の binfmt_misc

提供: ArchWiki
Systemd-binfmtから転送)
ナビゲーションに移動 検索に移動

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.txtjava.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