最初に
Windows 10 May 2020 で、WSL2 が正式リリースされました。WSL1が Linuxカーネルのエミュレーションをしていたことに対して、WSL2は仮想マシン方式(not Hyper-V)となっています。そのおかげで、WSL1で難点だった IOが遅い、Dockerが動かない…といった問題が解決しています!
ただし、その方式の違いにより、今までのノウハウがそのまま使えません…。
今回はWSL2を軸に、開発環境(ここでは PyCharm )を便利に使うことを目指しました。随所に、ハマりポイントがあるので、ここまで来るのは少し大変でした…。
備忘録がてら、流れを書いてみます。詳しい操作方法は、詳しい説明が随所にあるので、ここは流れだけにしておきます。
今回、Windows側で PyCharm 立ち上げて…とか色々考えましたが、結局Windows側には、VcXsrv(W Window Server)を入れて、WSL2側で立ち上げたPyCharm を使うのが一番安定でした。どんなに頑張っても、パス表記の違いが辛かったので、ギリギリまでWSL2の世界に押し込めることにしました。
WSL2 のインストール…は多くの人がノウハウを出してくれているので割愛…。
必要なパッケージのインストール
Ubuntu を導入したら、まずは日本語環境と、ブラウザを入れておきます。日本語入力は、fcitx/mozc を使っていきます。ブラウザは pycharm の JavaScript Debugger と繋げたいので、Chromium を使います。dbus-x11 は fcit を利用する際に必要なパッケージです。
sudo apt install fcitx-mozc chromium-browser dbus-x11
設定
WSL2は、仮想マシンで起動することから、論理的には別マシンです。つまり、X Window Server(Windows 10で起動) と、PyCharm を起動するWSL2環境は別マシンという事です。というわけで、ディスプレイの転送先を変えてあげないといけません。
.bashrc
辺りで次のように、WSL2で使われてるNICのIPを指定してあげます。(WSL2側から、ホストのWindows側に接続する形になるので、ここのIPはWindows10側です)
同時に、日本語変換に fcitx を使うよう、環境変数を設定しておきます。
export GTK_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
export QT_IM_MODULE=fcitx
export DISPLAY=`ip route | grep 'default via' | grep -Po '\d+\.\d+\.\d+\.\d+'`:0
DISPLAYの設定がポイントです。なんとWSL2は、起動する度にIPが変わります…。なので、デフォルトゲートウェイがホストのWindows10であることを利用して、ip route
の結果からIPを抜いてきます。
併せて、Firewallで阻害されないように、Firewall で WSL2 側のIPを信頼設定をしておきます。ここでも、IPが変わることを考慮して、172.16.0.0~172.31.255.255の範囲で許可を与えておきます。
上記の環境変数を読み込むために、source ...
で読み込み直すか、ターミナルを起動し直します。
起動スクリプト
必要なソフトウェアはそろいましたが…実際に使うためには、 VcXsrv の起動や、fcitx の起動が必要です…。
自動起動をさせるのもちょっと面倒ということで、WSL2側に、準備スクリプトを用意してみました。
(前提として、VcXsrv インストール後、Pathを通して、vcxsrv.exe を呼べるようにしてあります。)
#!/bin/sh
vcxsrv.exe -ac -nowgl -multiwindow -xkblayout jp & fcitx-autostart
-ac は認証を不要とする設定。-nowgl はネイティブのOpenGLを無効にする設定です。これをしないと、ブラウザがフリーズします。-multiwindow はウインドウ毎に分離して表示する設定、 -xkblayout jp は日本語キーボードであることを指定する設定です。fcitx-autostart は fcitx を起動して、日本語入力を出来るようにするコマンドです。
起動して最初に WSL2経由でGUIを使いたいときに呼び出せば、一括で準備が出来るという寸法です(うちでは、このコマンドに wslx という名前をつけました)。
本来、WSL2のUbuntu と Windows 10 は別マシンの筈ですが、こうやってシームレスにプログラムを呼び出せるのは、本当に便利ですね。
これを実行した後、必要に応じて、日本語入力の設定をします。
fcitx-configtool
これで、ウインドウが出なかった場合は、どこかに問題があるようです。
ブラウザを起動してみる
さっそくお試しという事で、上記の準備を実施した後に…
chromium-browser
と実行すると…エラーが起きます。dbus やらなんやら必要…とのこと…。今回はセキュリティ的に甘いことを重々承知で、セキュリティを緩めてみます。
chromium-browser --no-sandbox
これで、Windows10で起動したかのようなブラウザが表示されるはずです。されなかったら…何か足りないです。
PyCharm にブラウザを登録する際、プログラム名しか与えられず引数を指定することが出来ないので、ラッパースクリプトを用意しておきます。
#!/bin/sh
chromium-browser --no-sandbox "$@"
PyCharmから呼ばれる時、デバッグ用の引数などが渡されるので、ちゃんとそこも受け渡すように書いておきます。"$*"
ではちゃんと動かなくて、"$@"
である必要がある点がポイントです。
PyCharm のインストール
あとは、PyCharm を入手すべく、

JetBrainsからダウンロードして、起動します。ブラウザも追加設定で、Chromeファミリーとして、ラッパースクリプトの名前( うちでは chromium) を指定してあげると、ちゃんとデバッグモードで起動できるはず…です。

Windows 10 上で、二つのウインドウ(PyCharm と Chromium)を立ち上げてます。Flaskのサンプルをブラウザで開いてます。
そして、PyCharm の JavaScript Debugger 経由で、alert(Hoge')
を実行させて、ブラウザで実際にポップアップが出てる様子です。
コメント