最初に

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 のインストール…は多くの人がノウハウを出してくれているので割愛…

VcXsrv も多くの人がry

必要なパッケージのインストール

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 を入手すべく、

https://www.jetbrains.com/toolbox-app/

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です