WindowsバイナリをLinux上で直接実行させる方法

ここ最近、私がWindowsを使う機会は激減しているのだが、いくつかのソフトウェアについてだけはオープンソース系の同等品ではなく、Windows用アプリケーションを使う癖が抜け切れていない。とは言うものの、そうしたプログラムを実行するプラットフォームとしては純正のWindowsデスクトップではなく、GNU/LinuxシステムにWineを組み合わせた環境を用いている。その際に問題となるのは、これらのプログラムを起動するごとに毎度cd ~/.wine/drive_c/Program\ Files\My\ Windows\ App; wine My\ Windows\ App.exeという長ったらしいコマンドを打ち込む必要があることだ。

個々のプログラムごとにシェルスクリプトを組むというのも、スマートな解決法ではない。要はXTerm上でMy\ Windows\ App.exeという形式のコマンドを入力して目的のプログラムを直接実行できれば願ったり叶ったりなのだが、何かいい方法は無いものだろうか? 実は現行のLinuxカーネルにはそうした処理を可能にする、binfmt_miscという機能が装備されているのだ。

ディストリビューションのストックカーネルを用いているユーザであれば、この機能は既に利用可能な状態になっている可能性が高い。そうでない場合、あるいは独自カーネル構築派ユーザの場合は、CONFIG_BINFMT_MISC(Executable file formats -> Kernel support for MISC binaries)でビルトインあるいはモジュールを選択しておく必要がある。なお後者のケースでは、binfmt_miscモジュールをブート時に自動ロードさせるようにしておかなければならない(Debianおよびその派生ディストリビューションであればecho binfmt_misc >> /etc/modules)。bifmt_miscをマウントさせるには、コマンドmount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_miscを実行するか、下記の行を/etc/fstabにコピーしてブート時に自動マウントさせるようにしておく。

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

次に行うことはbinfmt_miscに/usr/bin/wine(各自のシステムにおけるWineバイナリのフルパス)を登録し、Win16およびWin32のバイナリを実行できるようにさせることである。

echo ':DOSWin:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register

この設定を恒久化させるのであれば、Gentooの場合は下記のコマンドを/etc/rc.d/rc.localあるいは/etc/conf.d/local.startファイルにコピーする。Debian系ディストリビューションの場合は、下記のコマンドをコピーし/etc/init.d/wineとして保存する。

#!/bin/sh
test -e proc/sys/fs/binfmt_misc/register || exit 0
case "$1" in
  start)
    echo ':DOSWin:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register
    ;;
  stop)
    echo 0 > /proc/sys/fs/binfmt_misc/status
    ;;
  *)
    echo "Usage: $0 {start|stop}" >&2
    exit 3
    ;;
esac

このファイルは実行可能に設定した上で(chmod 755 /etc/init.d/wine)、ブート時に自動実行させるようにしておく(update-rc.d wine start 99 2 3 4 5 . stop 10 0 1 6 .)。

最後のステップは、chmod 755 ./My\ Windows\ App.exeという構文のコマンドでWindowsアプリケーションのバイナリファイルを実行可能に設定しておくことであり、これによって当該プログラムをあたかもネイティブのLinuxプログラムであるかのように./My\ Windows\ App.exeという指定で実行できるはずだ。また実行手順をより一段と簡略化したければ、/usr/local/binなどのPATH中のディレクトリに対するシンボリックリンクを作成しておくと、拡張子.exeの指定を省くことができる。

binfmt_miscを用いれば、同様の設定でJavaやPythonのプログラムを起動させることもできる。詳細については、最近のLinuxカーネルであれば書庫の中にDocumentation/binfmt_misc.txtというドキュメントがあるはずなので、そちらを参照して頂きたい。

なおここで解説した手法は、ローカルのユーザ特権を拡大させるなど、セキュリティ的にはある程度の脆弱化が伴う可能性があるので、使用する場合はできるだけ最新版のシステムを用いて、信頼できるユーザに対してのみ設定するようにすべきだろう。また可能であれば、/procファイルシステムをnosuidとしてマウントすることで、安全性は向上するはずだ。

NewsForge.com 原文