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


概要

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

  • X Serverには Cygwin/X を使用。
  • VirtualBox上のLinuxは Fedora 27。

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

インストール

CygwinによるX Window利用 を参考に、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

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

参考ページ

設定関連

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

過去のメモ

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

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を起動するたびに必要。