はじめに
普段は当たり前に使っていて改めて意識しないけれど、WSL2は素のLinux環境と比べるとWindowsとの結びつきがかなり深い。他のLinux環境から移ってきた人ほど「え、これ標準でできるの」と驚くポイントが多いので、自分の整理も兼ねてまとめておく。
ドライブが起動時に勝手にマウントされている
Windows側の C: や D: は、WSL2を起動した時点で /mnt/c や /mnt/d としてもう見えている。/etc/wsl.conf の automount 設定によるものだが、意識せずに使っていると「マウントしている」感覚すらない。Windows側で保存したファイルを Linux 側のコマンドでそのまま処理できるのは、地味だけどありがたい。
# Windows側のドキュメントフォルダをそのまま見に行ける
ls /mnt/c/Users/<ユーザー名>/Documents
.exe がLinux側からそのまま呼べる
WSL2のシェルから notepad.exe や code.exe を叩くと、そのままWindows側のアプリが起動する。パスの通し方を意識しなくても $PATH にWindows側の実行ファイルが混ざっているからで、これのおかげで「ちょっとメモ帳で開きたい」程度のことがコマンド一発で済む。GUIのファイル操作が恋しくなったときも同じ発想で、explorer.exe . と打てば今いるディレクトリをそのままWindowsのエクスプローラーで開いてくれる。GUIとCLIを行き来する作業では、これがあるとないとで体感速度がだいぶ違う。
# メモ帳でファイルを開く
notepad.exe memo.txt
# VS Codeでカレントディレクトリを開く
code.exe .
# 今いるディレクトリをエクスプローラーで開く
explorer.exe .
パス変換は wslpath に任せる
Windowsのパス表記(C:\Users\...)とLinuxのパス表記(/mnt/c/Users/...)を手で書き換えるのは地味に面倒だが、wslpath を使えば一発で変換できる。スクリプトの中でWindows側のパスを受け取って処理したいときなど、手動変換のミスを防げるので重宝する。
$ wslpath -w /mnt/c/Users/foo/project
C:\Users\foo\project
$ wslpath -u 'C:\Users\foo\project'
/mnt/c/Users/foo/project
Windows側から \\wsl.localhost でLinuxのファイルにアクセスできる
逆方向、つまりWindowsのエクスプローラーから WSL2 側のファイルを見たいときは、アドレスバーに次のパスを打てば、ディストリごとのファイルシステムがそのまま見える。
\\wsl.localhost\Ubuntu\home\<ユーザー名>
\\wsl$ という古い表記もまだ使えるが、これはネットワーク上に wsl という名前のマシンが存在すると名前解決で衝突する問題があったため、\\wsl.localhost に切り替えられた経緯がある。中身は同じ場所を指しているので動作としては等価だが、現行のドキュメントでは \\wsl.localhost 側が案内されているので、これから覚えるならこちらで統一しておくのが無難。
クリップボードが共有されている
Linux側でコピーした文字列を clip.exe に渡せばWindows側のクリップボードに乗るし、逆にWindows側でコピーしたものをLinux側で貼り付けることもできる。仮想マシンだと当たり前ではないこの挙動が、WSL2だと標準で用意されている。
# コマンドの結果をWindows側のクリップボードにコピー
cat ~/.ssh/id_rsa.pub | clip.exe
# Windows側のクリップボードの中身をLinux側で取得
powershell.exe -command "Get-Clipboard"
localhost がWindowsとWSL2で共有される
WSL2側で立てた開発サーバーに、Windows側から localhost でそのままアクセスできる。仮想マシンのIPアドレスを調べてアクセスする、といった手間が要らない。
# WSL2側でサーバーを起動しっぱなしにしておく
python3 -m http.server 8000
このコマンドを実行したまま、別のWindows側のPowerShellやコマンドプロンプトから叩くとレスポンスが返ってくる。
# Windows側から確認
curl.exe http://localhost:8000
サーバーを起動しているのはWSL2側なのに、Windows側は特別な設定をせずに localhost だけで届く。IPアドレスを毎回調べる手間がないぶん、ローカル開発の作業テンポが崩れない。