ChromebookでWineを使ってWindowsプログラムを動かす（参考にゲームDiablo2を動作）

手元にChromebookが検証用途で届いたので普段LinuxでよくやっているWineを入れて `Diablo2` を動かすという設定ができるのかをやってみます。

ChromeOSと、Linux環境の関係性がわかっていなかったのですがググったところ以下の様です。

* Linuxはコンテナ上で動作する仮想VM環境でChromeosからは隔離された空間で動作する
* コンテナの中でLinux VMである `Crostini` を動かしているという理解かと思い調べたらQiitaには先人が知識を共通してくれていので参照されたし。→　[ChromeBook Crostiniの概要](https://qiita.com/mksh/items/7d244230597a34a10c98)
* 仮想OS環境の中のLinuxという位置づけですが、使いやすくするためにChromeos側からのフォルダの共有などはサポートされていて容易に使えそうです。原理はともかく使い勝手は、Windows10のWSL2と同じような感じで使えそうです。
* 今回は入れるのはWine（GUI）になるので、実際にはこの `Crostini`からChomeos上のディスプレイサーバにXプロトコル経由で渡すことを内部でやっているのかと思います。Chromeosは、Documentsをみると `Wayland`を採用してるようです。
* コンテナ側からこのChromeos側のXサーバに通信をしているのだと思いますがどのように実現しているのかはちょっとわかりませんでした。仕組み的には、 `Crostini` を経由しないでもLXCにプログラム入れることが出来てしまいそうですが。WaylandとXのやり取りは、ソムリエというやつが上手いことやっているようです。。。何れにしてもTerminalアプリから起動する場合にはゴニョゴニョと自動で行われた結果、Chromeos上のディスプレイサーバであるWaylandでXアプリは動きます。https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier/
* 


# Winehqの導入

ChromeosのLinuxでWineのバージョンを確認すると少し古いようですので、Winehqから新しいバージョンを入れて利用をしてみます。今回は最低限が動けばいので設定等は行いません。

ほぼ教科書どおりです

```
sudo dpkg --add-architecture i386
wget -nc https://dl.winehq.org/wine-builds/winehq.key
sudo apt-key add winehq.key
sudo apt install nano
```

リポジトリの設定なので以下を追加します

```/etc/apt/sources.list
deb https://dl.winehq.org/wine-builds/debian/ buster main
deb https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/Debian_10 ./
```

導入を行います。

```
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DFA175A75104960E
sudo apt update
sudo apt install --install-recommends winehq-stable
```

導入されたバージョンは　wine-5.0.2 となりました。


# 環境構築

Wineは環境変数で環境を分けることができるので基本的はPREFIXをつけて動かすほうが良いです。単一環境で複数のアプリを入れることのメリットは少ないので常にクリーンな状態で動かす事が望ましいです。

```
WINEARCH=win32 WINEPREFIX=~/.wine_w32  wineboot
```

# アプリの導入

基本は、Wine同様にTerminal経由でインストーすることになります。最近のLinuxのディストリビューションだとGUIから簡単にWineアプリが入れられたりするので便利ですよね。ChromeもAptで導入したアプリがアイコンで他のアプリ同様に表示されるそうです（Wineのアプリは出ませんでした）

## 導入イメージの転送

Windowsアプリなので、Aptコマンドで取るわけにもいかないため素直にGoogle Drive経由でダウンロードします。その際に次の画面用に右ボタンで　`Linuxとの共有を管理`  を選択します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11540/1b8c0c96-9c7d-e311-a4be-e16603924af1.png)


今回はマイファイルに data  フォルダを作ってそこに配置しました。

ターミナル側での操作ですが単純にMountができないようなのでFuse使います。

```
# To mount:

sudo apt install fuseiso
cd cd /mnt/chromeos/MyFiles/data
fuseiso ./D2-1.12A-enUS.iso ~/work/a/ 
 
# To unmount:
fusermount -u ~/work/a
```

次にアプリはInstaller.exeを実行して入れます。

```
WINEARCH=win32 WINEPREFIX=~/.wine_w32 wine ./Installer.exe 
```

今回のアプリは特にエラーなどは発生せずに導入が完了しています。

# アプリケーションの実行

Wineのアプリもアイコンが表示されます。これは一般的なLinuxの仕組みと似た感じで .desktopファイルで実現してみるみたいです。実際の場所は `~/.local/share/applications/wine/Programs/Diablo II\ -\ Lord\ of\ Destruction.desktop ` にあります。アイコンが正しく出ないのはなぜでしょう？　VideoTestの方は出ていますね。また「端末」というのは Gnome-temirnal なのでこれは日本語のリソースも発見されて表示されているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11540/7d295cdb-3640-9f8f-b10a-708d9bd3c106.png)

## Diablo2の設定の余談

特にゲームについて言及をするために書いているのではないのですが、古いおっさんには興味があるところかもしれないので普段遊んでいるModの設定がまとまっているものをリンクしておきます。これに従って設定すれば動きます。

* https://github.com/whipowill/d2-plugy-qol

注意としては、Chromebookでの実行はネイティブでの実行ではないのでローカルのディスプレイを直接動かすものは動作しません。そのため `3dfx` オプションは動かないので注意しましょう。そのため上記のリンクで紹介されているddrawを使います。古いアプリは使えそうなのでWine経由で使っている人は見ておく良いかもしれません。

```
XXX@penguin:~/.wine_w32/drive_c/diablo/ModPlugY$ WINEARCH=win32 WINEPREFIX=~/.wine_w32 wine ./PlugY.exe -w -direct -txt 
```

そして起動した画面がこちら、あえて画面全体をキャプチャしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11540/58556669-d23d-6f11-afe2-08fb7c5418d7.png)

20年も前のゲームで遊ぶなよと言われそうなのだが、だからこそ今どきのChromebookでも十分すぎるほどの速度で遊べる。Chromebookでフルスクリーンができないが（Diablo2 の当時は 800x600とかの解像度だった）画面をHD化することができるので十分に遊べる。DDrawなのでガンマが変更できず画面が結構暗いのは致命的だが最近は色々補助ツールがあるのでまぁなんとかなる。速度はかなりいい感じというかかなり早い。ちなみに接続先のゲームサーバはAzure上でオレオレサーバとして動作しているのでマルチで遊べるのだ！誰もいないのは寂しいので常にBotがバールランを行っている。

## Chromeの設定

使い込んでないので効果の程はわかりませんが `chrome://flags/` で以下の設定をしています。Linux環境でもGPUの恩恵があるものです。とはいえ時代的にこのゲームのライブラリは一切GPUは使わない気もします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11540/bc73550d-ad5d-0770-8009-d5cf81361946.png)



## 動作上の課題

* 一度止めてしまうとX関連の環境変数なのかソムリエ君の問題なのか起動しなくなる
* この問題は、仮想環境が再起動（ログアウト）すると治るので何かしら原因があることであると考えられる。
* 環境変数設定などしてみたけど解消できず。直し方わかる方いたらコメントください。


```
XXXX@penguin:~/.wine_w32/drive_c/diablo/ModPlugY$ 002c:fixme:ntdll:NtQuerySystemInformation info_class SYSTEM_PERFORMANCE_INFORMATION

002c:fixme:ver:GetCurrentPackageId (0x32ec30 (nil)): stub
002c:fixme:dwmapi:DwmIsCompositionEnabled 039BCED1
002c:fixme:dwmapi:DwmEnableComposition (0) stub
002c:fixme:ver:GetCurrentPackageId (0x32ef70 (nil)): stub
002c:err:xrandr:xrandr12_set_current_mode Resolution change not successful -- perhaps display has changed?
002c:fixme:msvcrt:__clean_type_info_names_internal (0x230671c) stub


XXXX@penguin:~/.wine_w32/drive_c/diablo/ModPlugY$ WINEARCH=win32 WINEPREFIX=~/.wine_w32 wine ./PlugY.exe -w -direct -txt 

004b:err:xrandr:xrandr12_init_modes Failed to get primary CRTC info.
0049:err:xrandr:xrandr12_init_modes Failed to get primary CRTC info.
0049:fixme:ntdll:NtQuerySystemInformation info_class SYSTEM_PERFORMANCE_INFORMATION
0049:fixme:ver:GetCurrentPackageId (0x32ec30 (nil)): stub
0049:fixme:dwmapi:DwmIsCompositionEnabled 039BCED1
0049:fixme:dwmapi:DwmEnableComposition (0) stub
0049:fixme:ver:GetCurrentPackageId (0x32ef70 (nil)): stub
0049:err:x11settings:X11DRV_ChangeDisplaySettingsEx No matching mode found: width=800 height=600 bpp=8 (NoRes)
```

# バックアップ

実際に使っていくとなればデータをどのように管理してくかが大事です。Chromeosとしては、Linux環境のバックアップは手動で行う手段が用意されています。バックアップは直接Gドライブに保管することができるのでそのほうが良いでしょう。
またその際には、同じ名前で上書きすればGドライブ側で自動で履歴を管理してくれることになるので便利です（容量的にも）

Chromebookのバックアップの対象として、バックアップされないものはAndroidアプリの設定した内容は保管されていませんでした。あとこのLinuxの領域ですね。
大きなものでなければ、こうった環境は dotfiles などに整理しておき再作成することのほうが望ましいかなと思ってはいますがセットアップが大変なこういったものははやりバックアップツールに頼むと便利です。

* [ようこそdotfilesの世界へ](https://qiita.com/yutakatay/items/c6c7584d9795799ee164)


# Chromebookを触ってみて

Chromebookらしい使いかたはまだ全くしてないのでこれからですがそこそこのことは普通にできそうです。簡単なプログラミング環境などは十分に動きそうですね。すぐに使えるので子供などにも良さそうです。お財布に優しいですし、とはいえ自分で買うとなると5万もだせばいまはWindows機も手に入るので悩ましいですね。Chromebookとしては普段はブラウザでサクサク使う、動かないアプリもAndroidアプリが十分に保管してくれる。そして今回みたいにちょっといじってみたい場合には簡単にLinuxも使えたりできるよってことかと思います。設定などもWindowsははやり難しい側面もありいじると致命的なことがあることを考えると簡単に初期化して使える（使うことが前提）になるChromebookはストレスなく普段から使えてよいかと思います。


* 結構普通にLinuxのGUIアプリが動いて驚いている。音声も問題なく出ている。入力の少ないアプリであれば十分に実用的。
* 初めてChromebookを使ってこの文章も初めて書いていますが、日本語の起動が　CTRL＋Spaceなのですがキーが遠くて使いづらいです。単発のキーで（具体的にはAltキーの単体おしで有効になってほしいですね）Google日本語入力の設定箇所あるのでしょうか？また Terminalで何かを実施する際に、日本語がONになっていると解除できないみたいで結構ストレスです。
* 温度も上がらず静音でそういった面では良いですね。軽いChromebookでキーも打ちやすいモデルであれば普段から使って見ても良いかも。
* 何よりも環境をPowerWashで簡単に初期化できる点、Linux環境を簡単にバックアップできる点が良いですね（Linux環境のリストアして見てないのだけど）
* 借りているのがでかいし、重いし、その割にキーボードが重くて微妙なのですがChromebookは選択肢が多いのでもっと軽いの使ってみたい