最近はメインのテキストエディターとしてVisual Studio Codeを使っています。しかし、いまいち使いこなせている気がしません。
作業内容としては、最近はGHCのSIMDプリミティブの実装をやっていて、x86-64 WindowsマシンのWSL2で作業することが多いです。しかし、私のメインマシンはMacで、MacでFirefoxを開きつつ、リモートデスクトップでWindowsにつなぎ、その上でターミナルとVS Codeを立ち上げて作業していました。「直接Windowsで作業しろよ」とか言われそうですね。
このやり方では困ったことがあって、Mac miniのネットワークの問題なのか、時々リモートデスクトップが固まります。固まっている間はエディターへの入力もできなくなります。
リモートデスクトップ越しではなく、手元のVS Codeを使えばこの問題を回避できそうです。ネットワーク接続はファイルを開くタイミングと保存するタイミングで繋がっていればいいわけですからね。つまり、MacのVS CodeからWindows機のWSL2へSSH接続するのです。
(昔使っていたEmacsにもSSH越しに作業するモードがありました。)
というわけで、重い腰を上げてVS CodeでSSH越しに作業する方法を調べました。
WSL2でSSHを使えるようにする
まず、WSL2でSSHサーバーを動かします。
最近のWSL2ではsystemdが動くので、wsl.conf
でsystemdを有効にして、
$ sudo apt install openssh-server
$ sudo emacs /etc/ssh/sshd_config
# ^ PasswordAuthentication no にする
$ echo 'ssh-ed25519 ...' >> ~/.ssh/authorized_keys
$ sudo systemctl enable ssh
すれば良いです。
ただ、これだけだと外部のマシンからアクセスできないので(localhost
からはなぜかうまくいきますが)、Windows側で追加の設定をします。具体的には、
> netsh interface portproxy add v4tov4 listenport=2222 connectaddress=172.24.*** connectport=22
> netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2222
を管理者権限で実行します。1行目はWindowsの2222番ポートをWSL2の22番ポートに転送する設定で、 connectaddress=
にはWSL2の ip addr
で確認できるアドレスを指定します。2番目はfirewallの設定です。
この辺の設定は
- How to SSH into WSL2 on Windows 10 from an external machine – Scott Hanselman’s Blog
- wsl2でsshサーバを起動し、外部からそこに接続 #Linux – Qiita
- WSL 2 Setup for SSH Remote Access | by Tristan Wu | Medium
を参考にしました。
本当はWindowsの起動時にこれを実行するようにしたり、WSL2のIPアドレスの取得をロバストにするべきかもしれませんが、今の時点ではやっていません。
【2025年2月23日 追記】WSL2のIPアドレスを直書きしないで済む方法の例です:
wsl -d Ubuntu --exec bash -c "netsh.exe interface portproxy add v4tov4 listenport=2222 connectaddress=$(ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1) connectport=22"
wsl -d Ubuntu --exec bash -c "netsh.exe interface portproxy add v6tov4 listenport=2222 connectaddress=$(ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1) connectport=22"
netsh.exe advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=2222
WSL2のデフォルト設定ではIPv6は使えないみたいなので、WSL2のIPv6アドレスは使えないことに注意してください(設定すれば使えるのかもしれませんが)。
このコマンドを記述したバッチファイル等を起動時に管理者権限で実行するには、タスクスケジューラ(taskschd.msc)で設定すれば良いようです。【追記終わり】
動作確認としては、Macから
$ ssh mywindowsuser@mywindowsmachie.local -p 2222
という風にアクセスできることを確認します。毎回ユーザー名とポート番号を指定するのは面倒なので ~/.ssh/config
に書いておきましょう。
VS CodeのRemote SSHを使う
Remote Development using SSH に従います。
私が試したときは、ラズパイ等にはSSH接続できてもなぜかWSL2環境へ接続しようとするとタイムアウトになりました。mDNSの名前(.local
)じゃなくてIPv4アドレスを直接入力するとうまくいったので、VS CodeがIPv6で接続を試みているために失敗したのだと考えられます。そこで、明示的にIPv4を使うようにしました。具体的には、~/.ssh/config
に
Host mywindowsmachine-wsl
HostName mywindowsmachine.local
User mywindowsuser
Port 2222
AddressFamily inet
と記述します(最後の AddressFamily inet
がIPv4の指定)。これでVS CodeからWindowsマシンのWSL2に接続できるようになりました。
もちろん、Windows側の設定を変えてIPv6でSSH接続できるようにする手もあると思います。
【2025年2月23日 追記】上の方に追記したコマンドではv6tov4で設定しているので、他のマシンからWindowsマシンにIPv6でアクセスしても大丈夫だと思います(AddressFamily inet
が不要)。【追記終わり】
三種の神器
私にとって、開発に欠かせない三種の神器は、ターミナル、テキストエディター、Gitクライアントです。
ターミナルは言わずもがなで、普段はMacのTerminal.appやWindows Terminalを使っています。
テキストエディターは最近VS Codeを使っているというのは書いたとおりです。
GUIのGitクライアントがあると、変更を確認したり、ファイルに加えた変更の一部をコミットしたりするのに便利です。Macでは(有償の)Fork.appというのを使っています。
Macだとこれでいいのですが、リモートのマシンに接続して作業することを考えると、VS Codeで色々できるように慣れておくのが良いのではないかと思うようになりました。VS Codeに内蔵のターミナルを使い、VS CodeからGitの変更の確認等を行うということです。
そういうわけで「VS Codeを使いこなしたい」と思う今日この頃です。