試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Debian/Ubuntuにおけるbinfmt_miscに関するメモ(Ubuntu 11.04時点・前半)

Debian/Ubuntuでは、「シェルから直接Windowsアプリケーションを起動できる「binfmt_misc」」で扱ったbinfmt_miscの管理が独自なツールで行われており、幾つかの種類においては自動的に(特に手動での作業をすることなく)扱いやすい設定になっていることが分かった。

管理ツールについて

Debian/Ubuntuではupdate-binfmtsというツール(「binfmt-support」パッケージ内)によってbinfmt_miscの管理が行われ、OS起動時に自動的にカーネルへ設定を適用する。
現在の状態は--displayというオプションで確認できる。出力内容はディストリ内のパッケージのインストール状況によって異なる。

$ /usr/sbin/update-binfmts --display
python2.6 (enabled):
     package = python2.6
        type = magic
      offset = 0
       magic = \xd1\xf2\x0d\x0a
        mask = 
 interpreter = /usr/bin/python2.6
    detector = 
python2.7 (enabled):
     package = python2.7
        type = magic
      offset = 0
       magic = \x03\xf3\x0d\x0a
        mask = 
 interpreter = /usr/bin/python2.7
    detector = 
cli (enabled):
     package = mono-runtime
        type = magic
      offset = 0
       magic = MZ
        mask = 
 interpreter = /usr/bin/cli
    detector = /usr/lib/cli/binfmt-detector-cli
jar (enabled):
     package = openjdk-6
        type = magic
      offset = 0
       magic = PK\x03\x04
        mask = 
 interpreter = /usr/bin/jexec
    detector = 
jarwrapper (enabled):
     package = <local>
        type = magic
      offset = 0
       magic = PK\x03\x04
        mask = 
 interpreter = /usr/bin/jarwrapper
    detector = /usr/bin/jardetector
wine (enabled):
     package = wine
        type = magic
      offset = 0
       magic = MZ
        mask = 
 interpreter = /usr/bin/wine
    detector = 
python3.2 (enabled):
     package = python3.2
        type = magic
      offset = 0
       magic = \x6c\x0c\x0d\x0a
        mask = 
 interpreter = /usr/bin/python3.2
    detector =

この状態では、Python,Java,Mono関係のファイルとWindowsの実行形式をそのまま実行することができる。
新しくファイルの種類を追加するには--install,削除するには--remove,状態を無効化/有効化するには--disable/--enableをそれぞれ付けて管理者権限で実行するが、ここではそれらの作業は扱わない。

内部の動作について

/proc/sys/fs/binfmt_misc/以下を見ると、上の出力と対応する項目が存在する。
下の出力内容もディストリ内のパッケージのインストール状況によって異なる。

(注意:項目「register」と「status」はファイル形式に関連する項目ではない)
$ ls /proc/sys/fs/binfmt_misc/
cli  jar  jarwrapper  python2.6  python2.7  python3.2  register  status  wine

項目によっては

$ cat /proc/sys/fs/binfmt_misc/python3.2
enabled
interpreter /usr/bin/python3.2
flags:
offset 0
magic 6c0c0d0a

直接プログラムに渡すように設定されているが、同一のマジック(ファイルの種類を示す先頭の数バイト)で複数のファイル形式が考えられるものでは

$ cat /proc/sys/fs/binfmt_misc/cli
enabled
interpreter /usr/lib/binfmt-support/run-detectors
flags:
offset 0
magic 4d5a
$ cat /proc/sys/fs/binfmt_misc/wine
enabled
interpreter /usr/lib/binfmt-support/run-detectors
flags:
offset 0
magic 4d5a
$ cat /proc/sys/fs/binfmt_misc/jarwrapper
enabled
interpreter /usr/lib/binfmt-support/run-detectors
flags:
offset 0
magic 504b0304

いずれも/usr/lib/binfmt-support/run-detectorsというプログラムにとりあえず処理を渡しており、この中で形式の判別と適切なプログラムの実行とを行っているものと考えられる。

(「Debian/Ubuntuにおけるbinfmt_miscに関するメモ(Ubuntu 11.04時点・後半)」に続く)

関連記事: