MacBookからWSL2のUbuntuを使って開発する環境を作る
今年1月にGeForce RTX 4070 Ti SUPERを載せたWindows PCを買ったが、どうしても Windows の操作に馴れることができず、放置されがちだった。4年前までは業務でWindows PCを使っていたはずなのだが・・・。
Karabiner-Elements や Raycast などのツールのお陰で生産性は上がっているが、がっつりロックインされてしまっている。
ただ Windows PC は安い買い物ではなく、グラボを利用した開発をやりたい欲が強くなってきたため、macOS にロックインされているならWSL2にSSHしちゃえば良いじゃないということで環境を整えている。
(参考) WSL2のネットワークについて概観する
まず重要な前提知識として、WSL2のネットワークについて大枠理解しておくとよい。でなければ、ネットに転がっている設定が何をしているのか分からなくなり、ファイヤウォール設定を緩くしすぎたり、設定したことを忘れてしまうかも知れない。
Hyper-V・Windows・WSL2のネットワークの関係性や、3種類の仮想スイッチ (仮想ネットワーク) について理解しておくとよさそうだ
上画像が掲載されている記事はとても分かりやすかった。私はこの記事を読んでいたことでつまずいたときに助った
その上でこの記事を読んでみると、なお理解が進む
公式ドキュメントであればここが該当する
SSH環境を整える
WSL2がセットアップされている前提で、LAN内のクライアントからSSHするための工程は以下
WSL2 側 (私は Ubuntu) で SSH プロセスを立てる
Windows Defender ファイヤウォールの詳細設定でポートを開ける
WSL2 設定の Mirrored mode networking を有効にする
手順 1, 2 はネット記事が多く存在するため割愛する。「Windows Defender ファイヤウォールの詳細設定でポートを開ける」のポートは、一旦SSHだけで良かったため 22 だけだ。今はLANだけで SSH するため標準ポートのままにしたが、今後外部ネットワークから接続するようになったら変更する必要があろう。
手順 3 の「Mirrored mode networking」については日本語の記事が少なく、また他のネット記事では異なる方法をとっている場合が多かったので詳述していく
WSL2 設定の Mirrored mode networking を有効にする
設定手順
やることは簡単で、Windows 側ホームディレクトリの WSL2 設定ファイル .wslconfig (e.g. C:\Users\yoshi\.wslconfig) に以下を記載するだけだ。
[wsl2]
networkingMode=mirrored
WSL2を再起動 wsl --shutdown すると反映される (厳密には8秒後ルールが適用されてから?)。
公式ドキュメント
ネット記事でよく見かける netsh を使った設定は、公式ドキュメント上部に記載されている「Default networking mode: NAT」の場合になる。これにより LAN (外部ネットワーク) から Windows へのリクエストをWSL2 (内部ネットワーク) へフォワードできる。
netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)
今回は昨年リリースされた Mirrored mode networking を利用する。これによって、LAN から WSL に直接接続できるようになる
Mirrored mode networking が有効になると、手順 2「Windows Defender ファイヤウォールの詳細設定でポートを開ける」の設定がWSL2にも適用されるようだ。
なお、公式ドキュメント Note に記載されている Hyper-V ファイアウォールの設定が必要な場合もあるかもしれない。レイヤー的に Hyper-V ファイアウォールは Windows Defender ファイアウォールよりも前に適用される。私の場合は設定不要だった。
以上の設定により、MacBook からは ssh username@192.168.1.234 (Windows のIPアドレス。IPは固定した) などでSSHできるようになり、また Windows 側からも ssh username@localhost で Ubuntu へ SSH できるようになった。
もちろん、MacBook の VSCode で Remote-SSH を使って開発できる。
MacBook 上に Ubuntu ホームディレクトリをマウントする
セットアップ
brew install --cask macfuse
brew install gromgit/fuse/sshfs-mac
macOS で sshfs を利用するためには macFUSE をインストールする必要がある。
私は brew で管理することでアップデートも自動化したかったため、上記のコマンド brew install --cask macfuse でインストールした。
macFUSE が必要な経緯などの経緯は以下の記事がまとまっている
マウントコマンド
sshfs ubuntu:/home/yoshikouki/ ~/ubuntu/
マウントするコマンド。注意点として、各パスの最後ははスラッシュ / を忘れずに入れる。アンマウント時には sudo を入れてルート権限で実行する
sudo umount ~/ubuntu/
一つ困った点として、Finder と ls コマンドとで表示名が異なるのは微妙である。Finder の見た目上スクショのように表示されるだけであり、 GitHub Desktop などの利用は問題ない。
❯ la ~/ | grep ubuntu
drwxr-x---@ 1 yoshikouki staff 4096 Mar 31 11:13 ubuntu/
今後やること
以下を考えている
sshfs を使って MacBook 上に Ubuntu ホームディレクトリをマウントする ~/ubuntu項目を追加WSL2 で起動したアプリケーションのポートをファイアウォールに自動適用
LAN外部 (信頼できるネットワーク) からアクセス可能にする
今は Windows のスリープを無効にしているため、スリープしていても外部からスリープ解除できるような何かを考えたい (実現可能性を探る)
この記事が気に入ったらサポートをしてみませんか?