2015/06/26

Wine環境(WINEPREFIX)を分けてWindowsアプリを上手に管理する

本記事はWine環境(WINEPREFIX)についてとこれを利用したWindowsアプリケーションの管理について書かれたものとなる。

元の記事は2007年11月に書かれたが、内容のほとんどを書き直している。

  1. Wine環境/WINEPREFIXとは何か
    1. Wine環境の中身の詳細
      1. ドライブの割り当てについて
      2. 仮想Cドライブの種類
  2. 新しいWine環境を作成する
    1. 環境作成時の注意点
      1. 存在しないディレクトリの扱い
      2. 作成場所に対する所有権
    2. 64bit版Wineでの32bit専用環境の作成
  3. Wine環境を選択してプログラムを実行する
    1. 端末から実行する場合
    2. シェルスクリプトを記述して実行する場合
    3. デスクトップ環境などのメニュー項目
    4. デスクトップのランチャから実行する場合
  4. 環境の分け方

Wine環境/WINEPREFIXとは何か

Wineの仮想Cドライブやレジストリは、通常[ホームディレクトリ]/.wine/というディレクトリの中に一緒に格納されている。このディレクトリはWineでプログラムを動かす際の “環境” としての役目を果たす[1]が、Wine実行時の環境変数によってこの場所を切り替えることができ、複数の環境を使い分けることで管理上のメリットもある。

その環境変数はWINEPREFIXで、これが未定義のときに標準の場所である[ホームディレクトリ]/.wine/が使われる。

このWine環境(ディレクトリ)は “wineprefix” もしくは単に “prefix” と呼ばれることがある。

既存のWine環境以下を全て削除したり新しい環境を作ったりするとWineの設定やCドライブの中身を初期状態にでき、環境を使い続けている内に何か不具合が起きたときに役立つことがある。

Wine環境の中身の詳細

下はWine環境の最上位ディレクトリ以下のディレクトリツリーを図にしたものとなる(角括弧で囲まれた項目はディレクトリ)。

Wine環境の中身
--+-[dosdevices]-+-[c:]
  |              +-[d:]
  |             ...
  |              +-[z:]
  |  各ドライブへの参照
  | (シンボリックリンク)
  |
  +-[drive_c]
  | 仮想Cドライブの実体
  |
  +-system.reg
  | HKEY_LOCAL_MACHINE(HKLM)
  |
  +-user.reg
  | HKEY_CURRENT_USER(HKCU)
  |
  +-userdef.reg
    HKEY_USERS\.Default

ドライブの割り当てについて

dosdevices内には仮想ドライブ[2]の割り当てに関係したシンボリックリンク群があり、GUI設定ツールwinecfgの “ドライブ” タブで割り当てを変更できる。標準ではZドライブが/を参照し、この割り当て(dosdevices/z:)を削除することでアプリケーション側からは基本的に仮想Cドライブ(と他に手動で設定したドライブ)以外にアクセスできなくなる[3]が、winecfgの “デスクトップ統合” タブの “フォルダ” 内の項目が仮想Cドライブの中でホームディレクトリ内の幾つかのディレクトリを参照するようになっており、(信頼できないソフトウェアを動かすときなど)環境をサンドボックス化したい場合はこれらのチェック(リンク)を外すなどする必要もある。

仮想Cドライブの種類

仮想Cドライブの中のディレクトリツリーには2つの種類がある。

64bit版のWineを用いて新しく作成された環境の仮想Cドライブはx64(64bit)版Windowsと同様に以下の構造となり、64bit版のWineでWin64アプリケーションを、32bit版のWineでWin32アプリケーションを動かすことができる。つまり、64bit/32bit両対応の環境となる。

64bit/32bit両対応の環境内の仮想Cドライブ(drive_c以下)
--+-[Program Files]
  | 64bitアプリケーション
  |
  +-[Program Files (x86)]
  | 32bitアプリケーション
  |
  +-[windows]-+-[system32]
  |           | 64bitのDLLなど
  |           |
  |           +-[syswow64]
  |           | 32bitのDLLなど

32bit版のWineを用いて新しく作成された環境の場合はx86(32bit)版Windowsと同様に以下の構造となり、32bit版のWineでWin32アプリケーションを動かすときにしか使えない。

64bit版のWineがインストールされていてもこの形の環境を作成することは可能(後述)。

32bit専用の環境内の仮想Cドライブ
--+-[Program Files]
  | 32bitアプリケーション
  |
  +-[windows]-+-[system32]
  |           | 32bitのDLLなど

新しいWine環境を作成する

環境の最上位ディレクトリとして使用したいパス名を環境変数WINEPREFIXに指定した状態でWineを用いて任意のWindowsアプリケーションやwinecfgのような付属ツールなどを実行すると、その実行の際に(環境が存在しない場合に)自動的に環境が作成される。作成処理にはしばらく時間がかかる。[4]

作成処理のみを行いたい場合はwinebootコマンドを実行する。ただし、Wine向けのMonoやGeckoといったパッケージのインストールを確認するダイアログは表示されることがあり、選択肢のボタンを押すまで処理は進まないため、作成処理のみの完全な自動化は難しい。[5]

([ホームディレクトリ]/.wine-foo に環境を作成する例)
$ WINEPREFIX=~/.wine-foo wineboot

環境作成時の注意点

存在しないディレクトリの扱い

環境変数WINEPREFIXのパス名の最後の階層だけは環境作成時に存在していなくても問題ない。例えば、[ホームディレクトリ]/wineprefixes/というディレクトリのすぐ下にfoobarといったディレクトリのWine環境群を配置したい場合、(環境の最上位ディレクトリから1つ上となる階層の)[ホームディレクトリ]/wineprefixes/のディレクトリまでは必要だが、環境の最上位ディレクトリとなる階層の[ホームディレクトリ]/wineprefixes/foo[ホームディレクトリ]/wineprefixes/barといったディレクトリを事前に準備(作成)しておく必要はない。

([ホームディレクトリ]/wineprefixes/foo に環境を作成する例)
$ mkdir ~/wineprefixes
$ WINEPREFIX=~/wineprefixes/foo wineboot

作成場所に対する所有権

環境変数WINEPREFIXのディレクトリは自分が所有しているディレクトリである必要がある。

自分に書き込み権限があるディレクトリであっても自分が所有者でないディレクトリは指定できない(環境の作成に失敗する)。

(/tmp/以下に環境を作成しようとして失敗する例)
$ WINEPREFIX=/tmp wineboot
wine: /tmp is not owned by you

(同様の例・最後の階層のディレクトリが存在しない場合)
$ WINEPREFIX=/tmp/newprefix wineboot
wine: '/tmp' is not owned by you, refusing to create a configuration directory there

64bit版Wineでの32bit専用環境の作成

64bit版のWineがインストールされている環境では標準で64bit/32bit両対応の環境が作成されるが、好みや事情により32bit専用の環境を作成したい場合も出てくる。

32bit専用の環境を作成する場合、環境作成の際に環境変数WINEARCHを “win32” にする。ただし、環境変数WINEPREFIXにする階層の(空の)ディレクトリを事前に作成してしまうと処理に失敗するというバグがあるので、事前に同環境変数の場所にディレクトリが存在しないようにする点に注意が必要。

(標準の場所に32bit専用環境を作成・既に[ホームディレクトリ]/.wine/が存在する場合は移動・削除などする)
$ WINEARCH=win32 wineboot

(環境の場所を指定する形)
$ WINEPREFIX=[Wine環境の場所] WINEARCH=win32 wineboot

(処理に失敗する例)
$ mkdir newprefix
$ WINEARCH=win32 WINEPREFIX=/path/to/newprefix wineboot
wine: WINEARCH set to win32 but '/path/to/newprefix' is a 64-bit installation.

Wine環境を選択してプログラムを実行する

Windowsアプリケーションの実行時に環境変数WINEPREFIXを指定することで、実行時のWine環境を選択できる。

以下の例では[ホームディレクトリ]/wineprefixes/fooという環境を用いて仮想Cドライブ内のC:\Program Files\Foo\以下にあるfoo.exeを実行するものとする。環境やアプリケーションのディレクトリや実行ファイルの名前は実際に使うものに読み替える。

端末から実行する場合

(作業ディレクトリを移動して実行する形)
$ cd ~/wineprefixes/foo/dosdevices/c:/Program\ Files/Foo/
$ WINEPREFIX=~/wineprefixes/foo wine foo.exe

(作業ディレクトリを移動せずに実行する形・プログラムによっては正しく動かない)
$ WINEPREFIX=~/wineprefixes/foo wine "C:\Program Files\Foo\foo.exe"

シェルスクリプトを記述して実行する場合

見出し:端末から実行する場合と同様の流れをシェルスクリプトとして記述して実行する形。ランチャを手動で作成する場合(後述)にコマンドとしてこのスクリプトの場所を指定することもできる。

Wine環境を指定してWindowsアプリケーションを起動するシェルスクリプトの例
#! /bin/sh
export WINEPREFIX=~/wineprefixes/foo
cd ${WINEPREFIX}/dosdevices/c:/Program\ Files/Foo/
wine foo.exe

デスクトップ環境などのメニュー項目

“スタート” メニュー項目が作られるインストーラでインストールしたアプリケーションの場合、インストーラ実行時の環境変数WINEPREFIXに関係した指定はデスクトップ環境などのメニューの中にあるWine用のメニュー内に作られる項目の中に含まれており、特にファイルを編集したりする必要はない(そのまま実行すればインストーラ実行時に使用されていた環境で動作する)。アイコン画像についても[ホームディレクトリ]/.local/share/icons/以下に配置されたものの名前が記述されており、Windows上と同じように表示される。

このメニュー項目は~/.local/share/applications/wine/Programs/以下の.desktopファイルとして保存される。下はfoobar2000をインストールした場合の例。

[転載]ファイル名:~/.local/share/applications/wine/Programs/foobar2000.desktop
[Desktop Entry]
Name=foobar2000
Exec=env WINEPREFIX="/home/[ユーザ名]/wineprefixes/foobar2000" wine C:\\\\windows\\\\command\\\\start.exe /Unix /home/[ユーザ名]/wineprefixes/foobar2000/dosdevices/c:/users/Public/Start\\ Menu/Programs/foobar2000.lnk
Type=Application
StartupNotify=true
Comment=Play, organize and tag your music.
Path=/home/[ユーザ名]/wineprefixes/foobar2000/dosdevices/c:/Program Files (x86)/foobar2000
Icon=3C17_foobar2000.0

インストーラが “スタート” メニュー項目を作らないプログラムやインストーラのない(書庫を任意の場所に展開して実行するだけで使用できる)プログラムでは.desktopファイルを手動で記述する必要があるが

  • “Exec” に(“env WINEPREFIX=[Wine環境のディレクトリ(絶対パス)]” を含んだ)実行コマンド
  • “Path” に絶対パスの作業ディレクトリ

をそれぞれ記述するようにする。配置場所は[ホームディレクトリ]/.local/share/applications/wine/Programs/[ホームディレクトリ]/.local/share/applications/

デスクトップのランチャから実行する場合

インストーラがデスクトップ上にランチャを作成した場合は見出し:デスクトップ環境などのメニュー項目と動作、特にファイルを編集したりはせずにそのままそれを実行すればよい。デスクトップランチャが作成されない場合でも、メニュー上にのみ項目が存在すればそれをデスクトップにコピーして実行することもできる。

デスクトップやメニューに項目が自動的に作られずに手動でランチャを作成したい場合、コマンドと作業ディレクトリを以下のような形で指定してランチャを作成する(アイコンなどは好みで決める)。

  • コマンド: “env WINEPREFIX=/home/[ユーザ名]/wineprefixes/foo wine foo.exe”
  • 作業ディレクトリ: “/home/[ユーザ名]/wineprefixes/foo/dosdevices/c:/Program Files/Foo”

環境の分け方

Wine環境は個別のアプリケーションごとに分けてもよいが、ディスク領域もある程度使用するため、細かく分けすぎるのではなく、用途やWineの設定、使用ライブラリなどが共通したアプリケーションをひとまとめにして管理するのに使うのがよい。

下は分け方の幾つかのどのように分けるかは人それぞれなので、下のようにしなければならないというものではない。

  • オーディオプレーヤ群で1つの環境とする
  • Windowsネイティブ版の特定のシステムライブラリ(DLL)がないとうまく動かないソフトウェア群で1つの環境とする
  • RPGツクール系の各種ランタイムライブラリ(RTP)全てで1つの環境とし、これらを用いて作られた作品を動かす際にその環境を指定する
  • Win64アプリケーション群で1つの環境とする
  • .NET Frameworkを使用するアプリケーション群で1つの環境とする
  • 継続して使用したいアプリケーション群は全て1つの環境にまとめる
使用したバージョン:
  • Wine 1.6.2
[1]: WindowsアプリケーションはWindows環境がないと正しく動かないため、Wineでは本記事で扱っているような環境が作られてその中でアプリケーションが動作する仕組みになっている
[2]: 特定のディレクトリを参照するものとして機能する
[3]: 仮想Cドライブの外に配置したインストーラなども実行できなくなるため、注意が必要
[4]: また、前回その環境を使ったのと異なるバージョンのWineでWindowsアプリケーションやツールを実行した場合、環境の “更新” 処理によって同様に時間がかかる
[5]: ディストリのパッケージとしてこれらがインストールされている場合は自動的に新しいWine環境にインストールされるため確認のダイアログは出ない