WSL トラブルシューティング

WindowsとUNIX陣営の長きにわたる確執も今は昔。MicrosoftはLinux Foundationのプラチナ会員になり、超優秀なオープンソースエディタ「Visual Studio Code」を開発して、数多のOSSプロジェクトに巨額の投資と人的資源を割くまでになった。そして最近のWindows 10にはもれなくほぼ完全なLinuxが組み込まれている。

「Windows Subsystem for Linux」(以下、WSL)は諸々の事情でLinuxやMacを利用したくない人たちにとってまさに福音だ。Windowsの生産性ツールやゲームなどを実行する環境と、優れた開発環境を完全に同居させうる可能性を秘めている。

これまでにもWindows上でUNIXライクな環境の実装を試みる動きはあった。それらはCygwinやMSYSと呼ばれた。用途は同じでも、前者がUNIX環境の完全な再現を目指しているのに対し、後者はプログラム開発に最低限必要なツールやコマンドの提供に留まっている。それゆえか片や鈍重すぎてもう一方は機能不足感が否めなかった。

かくいう僕もMSYSから独立したMSYS2なるパッケージを使っていたが、もっぱらUNIXコマンドでWindows上のファイルを操作したりVPSにSSH接続するためのクライアントとしてしか利用していない。とてもこの環境で開発する気にはならなかった。

そんななか、にわかにWSLの実用性が向上している事に気づく。まだ名称が「Bash on Windows」だった頃はとってつけたような代物にしか思えなかったが、此度じっくりと環境を整備してみて本当の意味で実用水準に達していると判った。

今回の記事では既に巷にあふれかえっている導入手順や、その他基礎的な部分については面倒くさいので触れない。僕が環境構築の過程で引っかかった問題とその対策のみを記述する。

ターミナルエミュレータ

昔からWindowsのcmd.exeは評判が悪かった。実はこれでもちょっとずつ改善してきてはいるのだが、それでもこの現状を見るとMicrosoftも半ば開発を諦めているとしか思えない。せっかくほぼ完全なLinuxを扱えるというのに、こんな低機能なターミナルエミュレータを使っていてはいけない。

幸いにも優秀な開発者が他のターミナルエミュレータを提供してくれているので、そちらをダウンロードして使用しよう。僕は「wsl-terminal」を使っている。cygwinやMSYSにも同梱されているminttyをベースにしているので、設定項目や使い勝手におかしいところは特にないように思う。

screenfetchでロゴを表示させた例。WSL環境を想定していないのか、GPUデバイスが正しく読み取れていない。
カレントディレクトリ

WSLには独立したホームディレクトリが存在していて、WSL上では/home/userといったPathで表示されるが、Windowsユーザとしてのホームディレクトリは/mnt/c/users/userとして映る。WSLの立場から見ると各ドライブ以下はマウントされたデバイスとして認識されているようだ。

尚、wsl-terminalを初期状態で起動した場合は当該プログラムの設置場所をカレントディレクトリとして認識する。つまり、もしCドライブ直下にwsl-terminalを設置したのであれば/mnt/c/wsl-terminalがカレントディレクトリになる。ホームディレクトリをカレントディレクトリにしたい人はショートカットに-lオプションを付け足そう。

これで$HOMEの位置でターミナルが開かれるようになった。

ホームディレクトリとパーミッション

デフォルトでホームディレクトリは/home/user/に設定されているが、WSL上で/etc/passwdを編集すれば任意の場所を$HOMEにする事ができる。Windowsファイルの操作や編集もしたい人は/mnt/c/users/userに変更しようと考えるだろう。

ちなみにシェルの変更もここから行える。chshコマンドは機能しない。

ところがそうすると他の作業に問題が出てくる。WSLの仕様でWindows側のファイルやフォルダは全てパーミッション777として認識されてしまうのだ。たとえWSL上からchmodコマンドで修正を試みてもなんら変化はない。それゆえにここを$HOMEにすると特に指定しない限り、rubygemやnpm、ssh関連のフォルダやファイルも自動的に配置されるので様々なセキュリティリスクが生じかねない。

特にSSH接続の際はパーミッションの修正が仕様上不可能にも関わらず、ファイル権限が緩すぎるから接続を拒否する旨のエラーが表示される。これを避けるには.sshフォルダを/home/user/に移動させた上で、以下のようにやや強引な指定を行うしかない。尚、予めconfigファイルを編集しておく必要がある。

$ ssh -F /home/user/.ssh/config user@user.jp

結論から言うとこんな不細工な真似をするぐらいならホームディレクトリはデフォルトのままにしておいた方が賢いように思う。頻繁にWindows側のファイルやフォルダを操作するのであれば、$HOME直下にでも適宜シンボリックリンクを張っておけば何とかなるのではないだろうか。

僕自身もMSYS2を使っていた頃の手癖で/mnt/c/users/userをホームディレクトリにしていたが、結局はこの仕様に対処しきれなくなってデフォルトの設定に戻した。.zshrcやinit.vimをWSL上から編集しなければいけなくなったところが少々面倒なものの、今となってはそれほど頻度も多くないので諦めもつく。

総括

まだ移行して数日しか経っていないので、今のところはあまり問題に遭遇せずに済んでいる。仕様を理解した上で操作する限りはほとんど完全なLinuxと使い勝手が変わらない。バッググラウンドプロセスを動かす事は想定していないので流石にサーバ用途は難しいが、開発用途としては既に十分な実用性を備えている。もう何年かすればOSS開発にMacばかり選ばれる風潮も見直されるかもしれない。