macOSからWSL2にRemote SSHして開発する備忘録
TL;DR
- macOSからWindows機のGPUを活用して機械学習開発をするためのWSL2環境構築方法
- WSL2の機能アップデートとTailscale、VSCodeのRemote SSHの活用により凝った設定が不要に
動機
ゲーム用途で購入したWindows PCに搭載されている高性能GPUを、機械学習の開発にも活用したいと考えました。
普段macOSを使っている開発者が、Windows上のWSL2環境を活用して効率的に開発を行うための環境構築とTIPSをまとめています。
すること
環境は次の通りです。
- macOSがSSHクライアントとなる
- Windowsホストマシンの上のWSL2 UbuntuがSSHサーバーとなる
- WSL2の
networkingMode=mirrored
を有効化することで、Windowsホストの22番ポート(またはそれ以外)をWSL2に向けられる - Tailscaleを用いることで、LAN内外を問わずホスト名でWindowsホストに接続可能となる
やり方
共通設定のポイント
- Tailscaleを使ってネットワーク接続します
- WSL側にTailscaleをインストールする必要はないです
- Windowsホスト側のみにインストールすることで、WSLからも利用できます
- ただ、WSL2をGUIで利用した場合などはちょっと不明です。SSHしている限りは困っていません。
- VSCode Remote SSHで接続して開発します
- Docker for Windows と Docker for Ubuntu があります。おそらく後者の方が安定します。
- 筆者はGUIが欲しかったので前者で利用していますが、WSLにボリュームをマウントしてDockerから参照する場合に、マウント後にDocker自体を再起動する必要があるなど、やや不便です。
- Bonjourを有効にすると
.local
でアクセスできますが、Tailscaleに任せた方が安定します
Windows側の設定
Windows側では次の設定を行います:
- Remote Desktopの接続を許可します
- WSLを再起動することがあるため、リモートからWindowsに接続できると便利です
- リモート デスクトップの使い方
- Windowsホスト上でもOpenssh Serverを有効化するとより安心です
-
.wslconfig
ファイルを次のように設定します
# https://github.com/xhiroga/homelab/blob/98979a39f3ecdadea1191ce3b469a8401e775efc/playbooks/files/windows/.wslconfig
[wsl2]
networkingMode=mirrored
[experimental]
hostAddressLoopback=true
networkingMode=mirrored
は、WSLで立てたサーバーにWindowsのブラウザからアクセスできるようにし、Tailscaleを共有するための設定です。Windows 11 22H2でexperimentalから昇格した機能と思われます。これによりポート番号が共有され、WSL側にTailscaleをインストールしなくて済みます。
WSL側の設定
繰り返しですが、WSL側にはTailscaleをインストールしません。以下はTailscaleの公式ドキュメントからの引用です
Tailscaleの公式ドキュメントからの引用
If you run Tailscale on both the Windows host and inside WSL 2 at the same time, Tailscale encrypted traffic that flows from WSL 2 over Tailscale on the Windows host will not work due to Tailscale packets not being able to fit in Tailscale packets. For this reason it is recommended that users run Tailscale on the Windows host only, and not inside WSL 2.
https://tailscale.com/kb/1295/install-windows-wsl2
/etc/wsl.conf
を次のように設定します。
# https://github.com/xhiroga/homelab/blob/main/playbooks/roles/wsl/files/etc/wsl.conf
[automount]
options = "metadata"
[boot]
systemd=true
systemdを有効にすることで、OpenSSH Serverを管理するのが簡単になります。
クライアント(macOS)側の設定
macOS側では次の設定を行います:
- Windowsアプリ(旧Remote Desktopアプリ)をインストールしておきます
- WSLの再起動などが発生したときに、遠隔で操作を続けられるようにするためです
- SSH設定を次のように行います
- 筆者はWindowsホスト側でもOpenssh Serverを有効にしているので、ポート被りを避けています。
Host hiroga-rtx4090
HostName hiroga-rtx4090 # Tailscaleで設定した値
User hiroga
IdentityFile ~/.ssh/id_ed25519
Host wsl.hiroga-rtx4090
HostName hiroga-rtx4090 # Windowsホスト側と同一の値
User hiroga
Port 2222
IdentityFile ~/.ssh/id_ed25519
より詳細な設定例は以下のリポジトリにあります:
開発上のTIPS
- WindowsマシンにSSDなどをホストする場合は、フォーマットをNTFSにするのがオススメです。
- exFATだとWSLから参照した際にシンボリックリンクを貼れないので困ったことがありました。
- リポジトリはWSL2側にクローンするのが良いです。
- Windows側にGitHub Desktopを入れて管理することもできますが、WSLからWindowsの管理するファイルシステムを参照した場合ハードリンクが貼れません
- ハードリンクが貼れないことで、uvやpnpmでの開発が滞ります。
トラブルシューティング
SSH接続できない場合
SSH接続ができない場合は、次の手順で確認・対処します:
- まずはWSL内部からlocalhostへのSSH接続を試してみます
- 内部接続ができれば、外部からの接続問題を切り分けられます
- sshdが立っているかを確認します
sshdの状態確認コマンドと出力例
$ systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2025-03-27 08:30:42 JST; 20min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 1234 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 1235 (sshd)
Tasks: 1 (limit: 9447)
Memory: 1.2M
CPU: 42ms
CGroup: /system.slice/ssh.service
└─1235 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
- sshdが立たない場合、WSL関連設定がポートを確保してしまっていることがあります。その場合はWindows側で次のコマンドを実行します:
$ net stop winnat
$ net start winnat
- Windowsのファイアウォール設定も確認します
- SSHポートが適切に開放されているか確認します
まとめ
本記事では、Windows PCのGPUを活用して機械学習開発を行うためのWSL2環境構築方法を紹介しました。macOSからTailscaleとSSHを使ってWSL2環境にリモート接続し、VSCode Remote SSHを用いて快適な開発環境を構築する方法を解説しました。
Windows側の方がSSDの増設もしやすく、慣れると普段の開発環境をこちらに移したくなると思います。お役に立てば幸いです。
Discussion