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

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

シェルから直接Windowsアプリケーションを起動できる「binfmt_misc」

Linuxカーネルに古くからある機能に「binfmt_misc」というものがあり、Linuxネイティブの「ELF」以外の形式であっても、処理をアプリケーションに渡すことで、実行ファイルをシェルから普通に実行するのと同じ感覚で起動(処理)でき、この機能を利用することで、WineWindowsアプリケーションを実行するのが楽になる。
現在、Winesetup.exeなどのインストーラを実行してインストールされたものに関しては、デスクトップ環境のメニューの中に、「スタート」メニュー項目が出てくるようになっているため、それに関してはメニューからの起動でよいのだが、

  • setup.exeなどのインストーラ自体の起動
  • CLI(コマンドライン・インターフェース)アプリケーションの実行
  • zipファイルなどを展開して配置する形でインストールされたアプリケーションの起動*1

といったものに対しては役に立つ。
更に、Xfce 4.4のファイルマネージャThunarでも直接起動できるようになる。*2GNOMENautilusの場合は別で、関連付けとして設定する(後述)。

binfmt_miscのカーネルビルド時の設定

有効もしくはモジュールになっていればよい。ディストリ付属カーネルなら、ほとんどの場合、モジュールになっているものと思われる。

Executable file formats / Emulations  --->
 <M> Kernel support for MISC binaries

binfmt_miscを有効にする

手動で行う場合

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

起動時に自動で行う場合
ファイル名: /etc/fstab

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

ファイルの種類ごとの設定

管理者権限で/proc/sys/fs/binfmt_misc/registerに対して値を書き込む形で設定をする。自動で行いたい場合、起動時の自動起動スクリプトに登録するとよい。Gentoo Linuxでは/etc/conf.d/local.start
ファイルの種類は、

  • ファイル先頭にある、種類ごとに特有の「マジック」によるもの(2番目のフィールドは「M」にする)
  • 拡張子によるマッチング(2番目のフィールドを「E」にする)

のいずれかで指定する。
注意点としては、.NETアプリケーション(Monoを使用)とWin32アプリケーション(Wineを使用)は、マジックや拡張子では区別できないため、ここでWineに設定すると、Monoでは指定できない。*3

# echo ':Windows:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register
# echo ':WindowsPE:M::PE::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register

(2009/3/31)この処理については改善策がある。「.exeファイル(Windows用とMono/.NET用)の識別と関連付けについて」を参照。
書式としては

# echo :name:type:offset:magic:mask:interpreter: > /proc/sys/fs/binfmt_misc/register

で、詳しくはbinfmt_misc.txtの日本語訳を参照。Wineを使用するのは一例に過ぎず、この機能では、

  • 音楽や動画のファイルに実行権限を付けてプレーヤーから再生する
  • 画像ファイルに実行権限を付けてビューアから表示する
  • スクリプトファイルに「#!」(shebang)を付けなくても、実行属性を付ければ起動できる

といったこともできる。

3番目の例として、スクリプトとは多少異なるが、VMware Playerの.vmxファイルについて、shebang行の中身(vmplayerの場所)が環境に合っていなくても、コマンドラインシェルから起動できるようにする。vmplayerの場所は環境に応じて書き換える。

# echo ':VMX:E::vmx::/opt/vmware/player/bin/vmplayer:' > /proc/sys/fs/binfmt_misc/register

binfmt_miscの項目操作

一時的に無効にする

# echo 0 > /proc/sys/fs/binfmt_misc/[有効にしたときの1番目のフィールドの名前]

無効されたものを再び有効にする

# echo 1 > /proc/sys/fs/binfmt_misc/[有効にしたときの1番目のフィールドの名前]

項目を個別に削除

# echo -1 > /proc/sys/fs/binfmt_misc/[有効にしたときの1番目のフィールドの名前]

項目を全て削除

# echo -1 > /proc/sys/fs/binfmt_misc/status

NautilusWindowsアプリケーションを直接実行する

Nautilusファイルマネージャでは、binfmt_miscを設定しても、

xxx.exeを表示できませんでした。

というエラーダイアログが出るが、これは、ファイルの関連付けを変更することで開けるようになる。*4
まず、exeファイルを右クリックし、プロパティダイアログを開く。「開き方」のタブから「追加」ボタンをクリックし、「wine」と入力。

これで、NautilusからWineを使用してWindowsアプリケーションが開けるようになったが、ダブルクリックでは警告が出てキャンセルしかできない。その場合、右クリックメニューから「'wine'で開く」をする。

関連記事:

使用したバージョン:

*1:これは手動で「スタート」メニュー項目を作成することや、起動させるためのシェルスクリプトを書いてカスタムメニューやランチャにする、ということも考えられる

*2:実行属性がないexeファイルの場合は、関連付けとしてWineで開く形となる

*3:正確には、後から指定したほうが優先される

*4:つまり、Nautilusはbinfmt_miscと関係ない