技術の家庭菜園

https://tpcbtw.com/

WSLからCygwin/XにX転送する

導入

WSLの公開からだいたい1年が経ち、私の今いる分野では特に急速な普及が進んでいる。
これまで仮想マシンを使ってた連中がこぞってWSLだと言っている具合だ。
生粋のCygwinユーザーの私も、ついに手を出してみたのが半年前の話である。
しかし、WSLでは通常X11は使用できない。まぁWindowsがXで動いているわけではないので当然である。
WSL上でXを動かすにはXming等を使うのが一般的である。
しかし私はCygwinユーザー、MinGWを使うのは大変屈辱なことだ。*1
いや、実際はXmingMinGWと関係は薄いらしいけど……まぁなんとなくイヤなのだ。
というわけでCygwinプロジェクトの一部であり、普段から自分も使うCygwin/Xに対しWSLからXを送りたいなと思った次第である。

手順

まずXauthorityをCygwinのホームディレクトリからWSLのホームディレクトリにコピーしておく
WSLのターミナルからだと以下のような感じ
cp /mnt/c/cygwin64/home/admin/.Xauthority ~
ユーザー名は任意に変更して欲しい。

次に環境変数DISPLAYを弄っておく。同じくWSLのターミナルから、
export DISPLAY=localhost:0.0
とする。*2
必要であれば.bashrcにでも同じ文言を書いておけば良い。

最後はXWin Serverを動かすだけであるが、ここで-listen tcpオプションを付けて動かす。
本来XWin Serverのショートカットは
C:\cygwin64\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; exec /usr/bin/startxwin"
となっているが、
C:\cygwin64\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; exec /usr/bin/startxwin -- -listen tcp"
とする。*3ショートカットのリンクを書き換えてもよいし、コマンドプロンプトやwin+Rから起動しても良い。

以上、動いた。

f:id:tpcbtw:20180606203426j:plain

 

(2021/12/13 追記)

*1:WSLは良いのだ。

*2:一部サイトでは$DISPLAYに対してexport DISPLAY=:0としているが、これだとsshでX転送したときに動かない。ローカルでは問題ないが、sshd上だと
connect /tmp/.X11-unix/X0: No such file or directory
Error: Can't open display: localhost:12.0
と怒られる。とりあえずlocalhost:12.0を参照しようとして失敗しているのでlocalhost:0.0ときっちり書くべきのようだ。正直よくわからん。

*3:検証していないが、Authorization required...というエラーが出る場合さらに-acオプションを付け、
C:\cygwin64\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; exec /usr/bin/startxwin -- -ac -listen tcp"
とすると良いそうだ。
https://twitter.com/OshiroNaoki/status/1370521872547282951