Windows Subsystem for LinuxでWineを動かしてみる。

#WSLでWineを動かしてみる。
だれかやってるはずだと思ったし、実際挑戦してる人もいるみたいなのにまとめている人が誰もいない。
まあこの記事も結論を言ってしまえば、**全く役に立ちそうにない**というものだが。

WSL(Windows Subsystem for Linux)を使えば、**Windows10(64bit)上で仮想マシンを用意することなくLinuxのアプリケーションを動作**させることができる。
現在初期状態ではUbuntuの14.04又は16.04がインストールされるが、別にubuntu専用の環境というわけではなく、既にArchlinuxを始めとしていくつかのディストリビューションの動作が確認されている。
wineとはLinuxやOS X、BSDその他unix等、**Windowsでない環境で仮想マシンを用意することなくWindowsのアプリケーションを動作**させることができるアプリケーションである。

…もうおわかりいただけたであろう。WSL上でwineを動かすことができれば**Windows10(64bit)上で仮想マシンを用意することなくWindowsアプリを動かす**ことができるのである！

…ん？なにかおかしなことを言ってるかい？

##注意点(問題点)
…とまあつらつら書いたがこんな変態行為をやってみようと思った時点で…というのもあるので本題に入る。
**致命的な問題点だらけ**なのでよく読んでから実験に移るように。

###重い
筆者の環境はi5-3337U、RAM4GBなのだが、はっきり言って重い。
かなりもっさりしてるので覚悟の上で。

###日本語入力は今のところ未確認
uimを入れていたが私の環境では使えなかった。要検証。

###音は出ない？
WSLはサウンドデバイスが設定されていない(存在しない？)ようなので音は出ない。
しかし[VLCを動作させている報告もある](https://github.com/Microsoft/BashOnWindows/issues/486)。流石にここまでは試していないが設定次第じゃ行けるかも。

###wine単体では16bitアプリケーションは動作不可能
wineから16bitアプリケーションを動作させる場合はDOSboxを呼び出すことになる。
DOSboxならwindows版が用意されているので態々WSLを使う必要性は低い。
16、32、64bitのアプリケーションがパイプラインで繋がる姿はロマンがありそうなのだが残念である。
###[WSLは32bitのバイナリを実行不可能](https://github.com/Microsoft/BashOnWindows/issues/228)
…そう、64bit向けのバイナリしか動作させることができないのである。
したがってwineも64bitのバイナリで動かす必要がある。
[要望も上がっている](https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13377507-please-add-32-bit-elf-support-to-the-kernel)ので今後の対応に期待したいところである。

###WSLはWindows8.1以前のWindowsや32bitのWindows向けには用意されていない
Windows8.1以前のWindowsや、32bitのWindows10にはWSLが用意されていない。
上の問題が絡んでいる可能性があるが、実際のところは不明。

###WSL上のwineは32bitのバイナリを実行不可能？
トドメにこれである。つまり**64bitなバイナリしか動かない**可能性大。
確定ではないが、以下のような簡単なプログラムでも32bitだと動作できなかったあたりかなり怪しい。

```c
#include <stdio.h>

void main(void){
	printf("Hello, world!\n");
	return;
}
```

コンパイラは~~用意するのが面倒だったので~~[Rtools34](https://cran.r-project.org/bin/windows/Rtools/)に付いてきたmingw32、mingw64を使用した。
勿論64bitでは色々出るものの、最終的に動作した。
他に~~たまたまデスクトップに転がっていた~~[mml2mid version 5.30b](http://hpc.jp/~mml2mid/)も試したが、やはり64bitでビルドしたものは動作するが32bit版は元々ビルドされていたものも自分でビルドしたものも動作しなかった。
[Firefoxのインストーラ](https://www.mozilla.org/ja/firefox/all/?qJapanese)は32bit、64bit共に動作しなかった。インストーラが32bitの可能性があるが調べていないのでわからない。
##筆者の実験環境
OS:Windows10 Pro Insider Preview 14986
PC:i5-3337U
RAM:4GB

##wineをインストールしてみる。
WSLのインストール方法はググればいくらでも出てくるので端折る。
更にXWindow Systemを使用するためWindows向けのxサーバをインストール、起動しておく。VcXsrvやXming等がそれだ。
或いはCygwinからインストールできるものやMobaXtermというソフトに付属しているものでも良いはずだが試してはいない。
これもググればいっぱい情報が出てくるはず。

WSLでbashを起動したら、以下のコマンドを実行。といっても特別珍しい処理はない。

```bash
echo "export DISPLAY=localhost:0.0" >> ~/.bashrc
source ~/.bashrc
sudo dpkg --add-architecture i386
sudo add-apt-repository ppa:wine/wine-builds
sudo apt update
sudo apt install --install-recommends winehq-devel
sudo apt install winetricks fonts-takao
```

ディスプレイ情報を.bashrcに追記、i386アーキテクチャのバイナリをインストールできるようにして、WineHQの公式ppaを追加。
その後アプリケーションリストを更新してwine-develをインストール、更にwinetricksとfonts-takaoをインストールさせている。
フォントに関しては後でWindowsのフォントを利用できるようにするのでいらないといえばいらないのだが一応。

普通はLinuxが64bit環境の場合、この後に`export WINEARCH=win32 winecfg`を実行するのだが、
WSLでは**やってはいけない**。32bitが動作しないためだ。

64bitなバイナリしか動かないとか言っときながらi386のアーキテクチャを追加しているが、依存関係上そうしないとインストールできないのでしょうがない。
これはWineHQ公式ppa以外からでも同じで、Ubuntu-wine-TeamやUbuntu初期のppaからインストールするときも必要とされる。

```bash
wine64 --version
```

これでバージョンが表示されれば成功だ。何度も述べている通り32bit版は操作しないので、`wine --version`ではエラーが出る。
このままだとwinetrickが動作しない、winecfg等を実行するために`wine64 winecfg`と入力するか、
`wine64 cmd`とやってから`winecfg`する必要があったりと色々問題がある。
これらはそのままだと32bit版のwineを呼ぶためだ。
…尤もwinetricksの自動インストール機能はエラーが出まくってまともに動かないようだが。
そこで~~大変汚い~~対策を施す。
/usr/bin下にあるシンボリックリンクの交換だと何故かうまく行かないケースがあったので今回はバイナリを直接リネームして交換した。

```bash
sudo mv /opt/wine-devel/bin/wine /opt/wine-devel/bin/wine32
sudo mv /opt/wine-devel/bin/wine-preloader /opt/wine-devel/bin/wine32-preloader
sudo cp /opt/wine-devel/bin/wine64-preloader /opt/wine-devel/bin/wine-preloader
sudo cp /opt/wine-devel/bin/wine64 /opt/wine-devel/bin/wine
```

これでインストール完了。

```bash
winecfg
```

と入力すればwineが動作するはずだ。
##Windowsのフォントにシンボリックリンクを貼る。
起動が確認できたら一旦ウィンドウを閉じる。
この時点でホームディレクトリ下に`.wine`というディレクトリが作成されているはずだ。
しかし当然Windows用のフォントはwineには用意されていない。
Windowsの上で動いているのだからシンボリックリンクを貼ってしまえば良い。

```bash
rm -rf $HOME/.wine/drive_c/windows/Fonts
ln -s /mnt/c/Windows/Fonts $HOME/.wine/drive_c/windows/Fonts
```

これでwineからWindowsフォントを使用することができる。
ちょっとコマンドをいじればWindowsとデュアルブートしている場合にも応用できるが、
Windowsが休止状態(高速スタートアップによるもの含む)だとWindowsのドライブにアクセスできないので注意。

```bash
wine notepad
```

とやって、編集→フォントでWindowsのフォントが選択できることが確認できるはずだ。
ちなみにそのまま`notepad.exe`とか入力するとWindows10のメモ帳が起動してしまうので注意。
この機能は`sudo sh -c "echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop"`で無効化(0を1にすれば有効化)できるが、
無効化したところでコマンド実行自体はできてしまう(エラーがでるようになる)のであまり意味はない印象。

##Enjoy!
とりあえず一通りやることはこれで終わり。
64bitなバイナリしか動かなかったりwinetricksがまともじゃなかったりするけどとりあえず動くのは動きます。
あとは自分の好きなように色々やってみてください。
…筆者の動かしてみたかったプログラムは殆ど32bitだったけどな！