Cygwin/XでリモートのLinuxのアプリケーションをWindowsから利用する

# 概要

WindowsにX Serverをインストールして、VirtualBox上のLinuxでGUIアプリケーションを起動した時、Windows側にウィンドウが表示されるようにする。

* X Serverには [Cygwin/X](https://x.cygwin.com/) を使用。
* VirtualBox上のLinuxは Fedora 27。

以下、「ローカル側」はWindows、「リモート側」はVirtualBox上のLinuxを表すものとする。

# インストール

[CygwinによるX Window利用](https://itcweb.cc.affrc.go.jp/affrit/documents/guide/x-window/x-win-cygwin) を参考に、X11とopensshをインストールする。

# X Server起動

ローカル側で、Cygwinのターミナルを起動し、以下を実行。

```
startxwin -- -listen tcp
```

タスクトレイにCygwin/X Serverのアイコンが表示される。

なお、Cygwin/Xをインストールすると、Windowsのスタートメニューに「Cygwin-X」というグループが作成され、そこに「XWin Server」というメニューが現れる。このメニューでもCygwin/X Serverを起動できるが、デフォルトではTCPでの接続を受け付けないようになっており、リモート側から接続することができない。

# 準備

## Windows ファイアウォール

ローカル側で、ポート6000～6063くらいまでの受信を許可する。
Windows 10の場合は以下の手順で「Windows Defender ファイアウォール」の画面を表示する。

設定
→ネットワークとインターネット
→Windowsファイアウォール
→詳細設定

「Windows Defender ファイアウォール」の画面で、「受信の規則」に新しい規則を追加する。

プロトコルおよびポート：

|項目|設定値|
|---|---|
|プロトコルの種類|TCP|
|ローカルポート|6000-6063|

## xauth

ローカル側で、新しいCygwinのターミナルを起動し、以下を実行。

```
export DISPLAY=localhost:0.0
xauth generate $DISPLAY
```
作成された `.Xauthority` の内容を確認。

```
xauth list
```

出力結果の例：

```
MY-COMPUTER/unix:0  MIT-MAGIC-COOKIE-1  1234567890abcdef1234567890abcdef
```

# 利用時

## ssh接続

ローカル側のCygwinのターミナルで、以下のように実行し、リモート側に接続する。ローカル側でCygwin/X Serverが実行中であるとする。

```
export DISPLAY=localhost:0.0
/bin/ssh -i /private/key/path -Y user@hostname
```

## DISPLAY環境変数確認

リモート側で以下のように実行する。値が出力されることを確認する。

```
echo $DISPLAY
```

出力結果の例：

```
localhost:10.0
```

ssh接続時に、sshコマンドに `-Y` オプションを指定しないと、値が空になる。

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

リモート側で以下のように実行する。以下は `xclock` を実行する例。

```
xclock
```

ローカル側に `xclock` のウィンドウが表示されたら成功。

## 日本語入力設定

### キーボード配列の設定

ローカル側で、Cygwin/XのXサーバが起動している状態とする。

以下のコマンドを実行する。

```
export DISPLAY=localhost:0.0
setxkbmap -model jp106 -layout jp
```

### リモート側のibus設定

ssh接続中のリモート側で以下のように実行する。

```
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
export NO_AT_BRIDGE=1
xset -r 49
ibus-daemon -d -x
```

このコマンドを実行したターミナルから起動したアプリケーションでは、日本語入力ができる。

# 参考ページ

## 設定関連

* [Cygwin/X](https://x.cygwin.com/)
* [CygwinによるX Window利用](https://itcweb.cc.affrc.go.jp/affrit/documents/guide/x-window/x-win-cygwin)
* [[メモ]リモートXの接続方法](http://luozengbin.github.io/blog/2014-06-21-%5B%E3%83%A1%E3%83%A2%5D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88x%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%96%B9%E6%B3%95.html)
* [Cygwinでxauthを使う方法](http://d.hatena.ne.jp/tueda_wolf/20080416/p1)
* [Windows用Xサーバ での日本語入力設定](https://vogel.at.webry.info/201607/article_4.html)
* [How to determine what ports X is listening on?](https://stackoverflow.com/questions/17817968/how-to-determine-what-ports-x-is-listening-on)
* [Cygwin64 X設定メモ](https://blog.himor.in/?p=536)

## トラブルシューティング関連

* [X11Forwardingがうまくいかない場合の対処](https://qiita.com/yabeenico/items/61ff3e64ee95e8d9156d)
* [Warning: No xauth data; using fake authentication data for X11 forwarding](https://stackoverflow.com/questions/40056227/warning-no-xauth-data-using-fake-authentication-data-for-x11-forwarding)

# 過去のメモ

以下は、必要かと思ったが、必要なさそうな手順。

## xhost

ローカル側のCygwinターミナルで、以下のように実行する。リモート側のIPアドレスが192.168.10.2であるとする。

```
export DISPLAY=localhost:0.0
xhost 192.168.10.2
```

出力結果の例：

```
192.168.10.2 being added to access control list
```

xhostへのリモート側の追加は、X Serverを起動するたびに必要。