36
Help us understand the problem. What are the problem?

posted at

updated at

WSL2でGUIアプリを起動

WSL2では今後GUIに対応する予定なので、何も考えずともGUIアプリが起動できるようになる筈である(WSLgと言う名称らしい。こことか参考。)。しかし現状ではまだ対応できていない。なのでWindowsにVcXsrvのようなXサーバをインストールして、WSL2側でDISPLAYにローカルマシンのIPアドレスを設定するやり方を紹介している記事がたくさんある。いずれの記事でもDISPLAYに設定するIPアドレスの取得方法として、cat /etc/resolv.confipコマンドでのやり方を紹介している。しかし私の環境ではこの方法ではWSL2側のIPアドレスしか取って来れず、なぜかうまく動かなかった。半ば諦めかけながら何か別の方法はないかと探していた所、簡単にできる方法を見つけたのでここに紹介しておく。
ここではVcXsrvは使わずMobaXtermと言うXサーバが付属したターミナルソフト(みたいないろいろな物が入った凄い何か)を使う。ターミナル立ち上げと同時にXサーバも自動で立ち上がり大変便利なので断然こちらをお勧めする。

1. MobaXtermをインストール

まずここからダウンロードしてインストール

2. MobaXtermを立ち上げてWSLに接続

MobaXtermのSessionに最初からWSLのアイコンがあるのでそこをクリック。
そして以下の設定をする。
Basic WSL setting -> Run method : Localhost connection
MT.png
そしてOK。

3. Xサーバへのリモートアクセスをfullに設定

Settings->X11タブに行ってX11 remote accessの項目でfullを選択

4. GUIアプリを起動

あとは好きなGUIアプリを起動するだけ。

$ xeyes

 

以上を設定すれば次回以降はMobaXtermのWSLターミナルを起動するだけで特に何も気にする必要なくWSL2でGUIが使える。SessionsにWSLのアイコンが出来ているのでお好みで右クリックでデスクトップにショートカットを作ったり、タスクバーにピン止めしておくと良い。
VcXsrvでやるよりずっと簡単で便利なのでこのMobaXtermを使った方法を是非ともお勧めする。私はこのMobaXtermを知らなかったのだが他にもSSHでのリモートホストに接続してXサーバでGUIアプリを起動できたりMSYS2みたいWindowsのBashターミナルがあったりその他いろいろな事ができてなんだかすごい。無料でも十分の機能が使える。


以前できた方法(DISPLAYにWindows側のIPアドレスを設定)

以下以前やっていた方法です。Windows側の設定が変わったのか、MobaXtermの設定が変わったのか、Firewallの設定が変わったのか良く分かりませんが、最新の私の環境ではこの方法ではうまくできなくなりました。MobaXtermの最新版(20.5)であれば2.のRun methodを選択すればよいので今はこの方法は使っていません。又、VcXsrv等他のXserverを使う場合には依然有効なのでメモとして残しておきます。

a. WSL2の.bashrcで設定

~/.bashrcに以下を書く

~/.bashrc
export DISPLAY=`hostname | xargs dig +short | grep 192.168.`:0.0

そしたらsource ~/.bashrcでこれを適用。

b. MobaXtermで設定

或いは.bashrcでは設定せずMobaXtermで設定する。
->SessionsにできたWSLアイコンを右クリック
  ->Edit session
    ->Basic WSL SettingsのAdvanced WSL Settingsにある
     Execute the following commands at startup:
に同じコマンドを書いておく。そうすると.bashrcと異なりMobaXtermで立ち上げた場合にのみDISPLAYの設定がされる。

この例ではhostnameでコンピュータ名を調べてdigでそのIPアドレスを調べている。コンピュータ名が分かっていればhostnameは使わなくて決め打ちでも良い。digではWindows側とWSL2側の両方のIPアドレスが表示されるのでWindows側のものを取ってくる。digの代わりに他にもnslookuphostコマンド或いはipconfig.exesedawkを駆使しても良いだろう。多くの記事で紹介されている/etc/resolv.confipコマンドでは私の環境ではWSL2側のIPアドレスしか調べられずうまく行かなかった。
コメントで教えてもらった情報によるとWSL2側のIPアドレスではWindowsから見てファイアウォールの外とみなされるのでファイアウォールに穴を開ける等の設定をしないといけない。殆どの記事で紹介されているやり方はその方法の様だ。それに対してWindows側のIPアドレスであればファイアウォールの設定は不要となる。


ドメインネームを使ってWindowsのホスト名をDISPLAYに設定

上記のようにWindows側のIPアドレスを調べるのにいろいろ苦労してましたが、IPアドレスを調べなくても<Host Name>.mshome.netでWindows側のホスト名を指定できるそうです。

export DISPLAY=`hostname`.mshome.net:0.0

嘘でした。<Host Name>.mshome.netで参照されるのはWSL2側のIPアドレスでした。
なのでWSL2側のIPアドレスを設定してGUIアプリが動かない場合にはこの方法でも同様です。Windows側のIPアドレスを設定する必要があります。
因みに<Host Name>.localも同様にWSL2側のIPアドレスを参照します。


最近見つけた別のApp

最近このFreeアプリを見つけた。
https://opticos.github.io/gwsl/
その名もGWSL。今後使えるようになるMicrosoftご謹製のgWSLと似ていてパチモンみたいで紛らわしい。
これもVcXsrvを使っているようだがマニュアルで立ち上げ、立ち下げをしなくていいみたい。誰か使ってみて。

少し使ってみたらこれもWSL2側のIPアドレスを自動で設定するみたいで、私の環境ではそのままでは使えませんでした。なのでやはりMobaXtermで以前やっていた様に以下の様にWindowos側のIPアドレスを設定する必要がありました。

~/.bashrc
export DISPLAY=`hostname | xargs dig +short | grep 192.168.`:0.0

参考

Quiita - WSL2のGUI設定でつまずいたところ
Quiita - WSL2でGUIをやりたいメモ
Quiita - WSL2におけるVcXsrvの設定
MobaXterm を ssh/mosh/X11 クライアントとして使う(Windows)
MobaXtermを使いBash On Windowsで簡単にX11を使う
WSL2のX-ServerでGUI表示する際に「export DISPLAY=:0.0」が効かない
Quiita - MobaXtermを使ってWSLのmatplotlibを描画する

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
36
Help us understand the problem. What are the problem?