JF Linux Kernel 2.6 Documentation: /usr/src/linux/Documentation/binfmt_misc.txt

binfmt_misc.txt

いろんな (お好みの) バイナリフォーマットのカーネルサポート v1.1 [プレインテキスト版]


   いろんな (お好みの) バイナリフォーマットのカーネルサポート v1.1
   ===============================================================

このカーネルでは、シェルからその名前をタイプするだけで、ほとんどのプロ
グラムを (制限は下を参照) 起動することができます。この中には、例えば
コンパイル済みの Java(TM)、Python、Emacs プログラムが含まれます。

これをできるようにするには、どのバイナリをどのインタプリタで起動するかを
binfmt_misc に教えてやらなければなりません。binfmt_misc は、指定された
マジックバイトシーケンスとファイルの先頭の何バイトかを (特定のビットは
マスクして) 比較し、バイナリタイプを判定します。binfmt_misc は「.com」や
「.exe」といったファイル名の拡張子も認識することができます。

最初に、binfmt_misc をマウントする必要があります。

        mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc 

実際に新しいバイナリタイプを登録するには、次のような文字列を準備し
(必要に応じて「:」は選ぶことができます)、

        :名前:タイプ:オフセット:マジック:マスク:インタプリタ:

/proc/sys/fs/binfmt_misc/register に echo してやる必要があります。

各フィールドの意味は次のようになります。

 -「名前」は、識別のための文字列です。新しい /proc ファイルが、
   /proc/sys/fs/binfmt_misc の下にこの名前で作成されます。

 -「タイプ」は、認識のタイプです。マジックの場合は M, 拡張子の場合は
   E を指定してください。

 -「オフセット」は、ファイル中での magic/mask のオフセットバイト数です。
   省略すると (つまり「:名前:タイプ::マジック...」と書くと) デフォルトの
   0 になります。

 -「マジック」は、binfmt_misc がマッチングに使うバイトシーケンスです。
   マジック文字列の中には \x0a や \xA4 のような 16 進数の文字を含める
   ことができます。シェルの環境では、シェルが \ を食べてしまわない
   ように \\x0a と書かなければいけません。もしファイル名拡張子による
   マッチングを選んだのなら、ここは認識されるべき拡張子になります
   (ピリオド「.」は不要。\x0a のような表記はできません)。拡張子に
   よるマッチングでは、大文字小文字が区別されます!

 -「マスク」は、マスクです (任意。デフォルトは全て 0xff)。マジックと
   同様の文字列を指定することで、特定のビットをマッチングから外すこと
   ができます。マスクはファイルのバイトシーケンスと AND 演算されます。

 -「インタプリタ」は、バイナリを最初の引数として起動されるべきプログラム
   です (フルパスで指定)。

いくつかの制限があります。

 - 設定文字列の総数は 255 文字を超えてはいけません

 - マジックはファイルの最初の 128 バイト以内に存在しなければいけません。
   すなわち、オフセット+サイズ(マジック) が 128 より小さくなければいけ
   ません。

 - インタプリタ文字列は 127 文字を超えてはいけません。

binfmt_misc を使うには、最初にマウントする必要があります。次のコマンド

    mount -t binfmt_misc none /proc/sys/fs/binfmt_misc

でマウントしたり、ブート時に自動的にマウントされるように次の行

    none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0

を /etc/fstab に追加することができます。

ブート時に /etc/rc スクリプトの中でバイナリフォーマットを追加したい
ことがあるかも知れません。これを正しくおこなう方法を知るには、init
プログラムのマニュアルを読んでください。

エントリを追加する順番に注意して下さい! 後から追加したエントリが先に
マッチングされます。



例を示します (/proc/sys/fs/binfmt_misc ディレクトリにいるものと仮定して
います)。

- em86 をサポートする (binfmt_em86 のようなもの。Alpha AXP 専用)
    echo ':i386:M::\x7fELF\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff:/bin/em86:' > register
    echo ':i486:M::\x7fELF\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff:/bin/em86:' > register

- パックされた DOS アプリケーションをサポートする (事前設定済み dosemu
  hd イメージ)
    echo ':DEXE:M::\x0eDEX::/usr/bin/dosexec:' > register

- wine を使って Windows の実行形式をサポートする
    echo ':DOSWin:M::MZ::/usr/local/bin/wine:' > register

Java のサポートについては Documentation/java.txt を見てください。


binfmt_misc や、あるバイナリタイプだけの有効/無効を切り替えるには、
'/proc/sys/fs/binfmt_misc/status' または '/proc/.../名前' に 0 を
echo するか (無効にする)、1 を echo します (有効にする)。ファイルを
cat すれば、'binfmt_misc/エントリ' の現在の状態がわかります。

あるエントリ、またはすべてのエントリを削除するためには、'/proc/.../名前'
または '/proc/sys/fs/binfmt_misc/status' に -1 を echo します。


ヒント
======

インタプリタに特別な引数を渡したい時は、そのためのラッパースクリプトを
書くことができます。Documentation/java.txt に例があります。

インタプリタのファイル名を PATH で検索しては「いけません」。カーネルは
使用するフルファイル名を渡しています。PATH を使うと、予期せぬ動作をしたり、
セキュリティ上の問題となります。

binfmt_misc に関する Web ページ:

    http://www.tat.physik.uni-tuebingen.de/~rguenth/linux/binfmt_misc.html

Richard Gther <rguenth@tat.physik.uni-tuebingen.de>

------------------------------------------------------------
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳者:   林 <hayashi884(a)geocities.co.jp> 1999/5/8 (Ver.0.1)
更新:     川崎 貴彦 <takahiko(a)hakubi.co.jp> 2004/03/23

Linux カーネル 2.6 付属文書一覧へ戻る