#TL;DR
WSLの導入に手こずった部分や、出会ったバグのように見える挙動等をまとめます。
#背景
Windows上でXServerを起動し、WSL内のUbuntuで実行されているIDEをWindows上で操作し、開発できるようにしようと考えました。
この構成の場合、IDE上で実行されるプログラムの実態はWSL内のUbuntuにいるため、Windows上のIDEを操作しているにも関わらず、Linux環境で開発するものと近い状況が再現できます。
以下の記事を参考に、WSLOnUbuntuで環境を構築し、かれこれ半年~1年ほど開発をしてきました。その中で軽くハマった話に触れていきます。
Windows Subsystem for Linux + X Windowを1.024倍くらい使いこなすための方法
#XWindowSystemについて
上記の記事でもあまり触れられていないので基礎技術に関して軽く触れておきます。
XWindowSystemはビットマップディスプレイ上でウィンドウシステムを提供する表示プロトコルで、Unix系オペレーティングシステムのGUIを別の環境へ提供することができます。
WSLOnUbuntuの場合、同じマシン内にUbuntuとWindowsがいるため、ネットワークの遅延もなくUbuntu上のGUIをWindows側に提供することができます。
Vagrantのような仮想マシンの提供と比べると、WSL上にいるためリソースの割り当てを考える必要がないのも魅力です。
また、XWindowSystemはクライント・サーバ方式をとっています。
クライアント・サーバ方式では使用者がクライアントを操作し、サーバを利用することが多いとは思いますが、XWindowSystemはこれとは逆に、サーバを操作し、リモートでクライアントを操作することになります。
クライアントで描画先を指定し、サーバ側で操作することになるので、複数のクライアントを操作することも可能です。
#環境準備における注意点
環境構築に関しては上記の記事でほぼほぼ事足りとは思いますが、Ubuntuの場合にのみ起こるであろう問題について触れます。
##IDEが描画されない場合
WSL上にてDISPLAY=localhost:0.0を設定することで、ホストのWindowsに描画を飛ばしてくれます。
上記の記事ではVcXsrvを使用し、ターミナルを使用、描画せずにショートカットでサーバ側にIDEを描画する方法が記載されています。
もし、クライアント側にDISPLAY=localhost:0.0を記述しているにも関わらず、ショートカットで描画されない人は.bashrcの内容を確認しましょう。
Ubuntuの.bashrcには以下の記述が存在します。
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
上記の記述はコメントにある通り、インタラクティブ(対話型)でない場合はそこでシェルの読み込みを終了するというものです。
参考記事の通りに実行する場合
echo export DISPLAY=localhost:0.0 >> ~/.bashrc
最下部にDISPLAY=localhost:0.0を追加することになるため、設定が読まれずにXServerがクライアントの描画飛ばす先が未設定となり、何も表示されないという状態に陥るわけですね。
OpenSuseの.bashrcにこういった記述はないため、Ubuntu環境で構築する場合には気を付けなければならないポイントです。
Ubuntuの.bashrcの場合でも、終了処理が走る前、つまりDISPLAY=localhost:0.0を先頭につければ描画されるようになります。
#sudoで実行しているにも関わらず、許可がありませんと言われた話
###事象
sudo rm: '/hoge/huga.json' を削除できません: 許可がありません
WSL上のファイルを削除しようとしてこのようなメッセージが帰ってきました。
当時の自分はパーミッション回りの設定何かおかしかったかなぁと思いつつも、調査を始めました。
しかし、sudoで実行しており、念のためパーミッションを777に変えてみたにもかかわらず、上記と同様のメッセージが返ってくる状況は変わりませんでした。
###原因
該当のファイルをWindows側のソフトウェアで開きっぱなしにしてたことを忘れていたためでした。
このことにより、ファイルにロックがかかり、消せなかったというわけですね。
しかし、実行しているのはUbuntuの環境のはず。何故消せないのでしょうか。
WSLはWindows Subsystem for linuxの略語の通り、Windowsのサブシステムです。
WSLはネイティブLinuxバイナリをWindows上で実行できるようにするもの。つまりは変換機のようなものと思って差し支えありません。
図にするとこのような形になります。
公式のFAQにもあるように、WSLはLinux環境の完全再現をするものではありません。(可能な限りの再現はしていると思いますが)
WSL は、Bash およびコア Linux コマンド ライン ツールを必要とするユーザーが Windows 上でそれらを実行できるようにすることを目的としたツールです。
WSL は、GUI デスクトップやアプリケーション (例: Gnome、KDE など) をサポートすることを目的としていません。
構造上、ファイルシステムの動作まで互換を取っているわけではないため、NTFSがロックをかけると、ファイルシステムの性質の違いから消すことが出来なくなるわけですね。WSLの互換レイヤーでは吸収ができません。
そのため、WSLはできない旨をこちらに通知してきますが、NTFSがロックしているときの返答パターンが用意されているわけもなく、「許可されていません」と若干食い違った返答が返ってきた。というわけです。
#最後に
似たような部分で詰まっている方の一助になれば幸いです。