いろんな (お好みの) バイナリフォーマットのカーネルサポート 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 ------------------------------------------------------------ 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 翻訳者: 林 1999/5/8 (Ver.0.1) 更新: 川崎 貴彦 2004/03/23