WindowsバイナリをLinux上で直接実行させる方法
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としてマウントすることで、安全性は向上するはずだ。