Linux Kernel 2.6 Documentation:
/usr/src/linux/Documentation/binfmt_misc.txt
binfmt_misc.txt
いろんな (お好みの) バイナリフォーマットのカーネルサポート v1.1
[プレインテキスト版]
- 原著作者: Richard Gther <rguenth@tat.physik.uni-tuebingen.de>
- 翻訳者: 林 <hayashi884(a)geocities.co.jp> 川崎 貴彦 <takahiko(a)hakubi.co.jp>
- バージョン: 2.6.5
- 翻訳日時: 2004/04/22
いろんな (お好みの) バイナリフォーマットのカーネルサポート 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 付属文書一覧へ戻る