WSL2 + Claude + VS Code の開発環境を作る

WEB+DB開発
記事内に広告が含まれています。

「Windows ネイティブ版も出たことだし…」ということで、遅ればせながら 2026年1月から Claude Code を使い始めました。でもパス関連でやっぱり違和感が。それなら WSL2 で動かせばいいじゃない、ということでやってみました。

WSL2 + Ubuntu のインストールと設定

まずは WSL2 + Ubuntu をインストール。超簡単。

WSL2 + Ubuntu をインストール

コマンドプロンプトなどで以下を実行。

wsl --install

WSL2 自体のインストールが始まるのでしばし待つ。インストールが完了したら Windows を再起動。

再起動後、再度以下を実行。

wsl --install

Linux ディストリビューションのインストールが始まるのでしばし待つ。ディストリビューションは自動的に Ubuntu がインストールされるので特に指定などは不要。

インストールが終わると Ubuntu が勝手に起動しユーザー名とパスワードの登録が促されるので、適当にアレしてから一旦 Ubuntu からログアウト。しばらくして Ubuntu がシャットダウンされたのを確認してから次の作業。

しばらく待つのが億劫な場合は、コマンドプロンプトなどで以下を実行

wsl --shutdown
wsl -l -v

WSL2 側から Ubuntu がシャットダウンできないのはなんでなんやろなぁ…。

仮想 HDD ファイルをシステムドライブから移動

仮想 HDD ファイル ext4.vhdx は肥大化するので C: ドライブから移動させておきます(※個人的な趣味)。

レジストリの

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{GUID}

の下の【BasePath】に ext4.vhdx のディレクトリパスが書いてあるのでそこから適当にコピーして、レジストリ値も修正。今回は D:/virtual/wsl2.ubuntu/ にコピー。

参考 Moving WSL2 to a new drive : r/wsl2

再度 Ubuntu を起動して D:/virtual/wsl2.ubuntu/ext4.vhdx が使われていることを確認。

この段階で ext4.vhdx を保存しておくと手軽に最初の状態に戻せるので楽。

apt リポジトリのミラーサーバーを変更

apt リポジトリのミラーサーバーを ICSCoE に変更してからシステムを更新。

sudo sed -i.bak -r 's@http://(jp\.)?archive\.ubuntu\.com/ubuntu/?@https://ftp.udx.icscoe.jp/Linux/ubuntu/@g' /etc/apt/sources.list.d/ubuntu.sources
sudo apt -y update; sudo apt -y upgrade;

ICSCoE は激速だけどたまに落ちてるらしいので注意。

WSL2 へのメモリ割り当てを固定

C:\Users\<username>\.wslconfig に以下を追加。

[wsl2]
memory=8GB
swap=0
networkingMode=mirrored
dnsTunneling=true
autoProxy=true
[experimental] autoMemoryReclaim=dropCache

割り当てるメモリサイズとスワップファイルは様子を見ながら変更する予定。

当初は「GUI も無いし 2GB で十分やろ」って思ってたら VS Code 連携した途端に 1.2GiB ほどメモリを消費されてゲスト OS(Ubuntus)が落ちてしまうことがわかり、8GB に変更。

参考 WSL2がメモリを食い尽くして接続不能になった話と根本解決 #Linux - Qiita

メインで使っている PC は 16GB しかメモリがないので、WSL2(Ubuntu) に 8GB を割り当てると Windows 側のメモリが枯渇するかも…なので WSL2(Ubuntu) 側の未使用メモリは積極的に Windows 側に返却してほしい。そんな都合の良い機能が…ありました。

autoMemoryReclaim は WSL2(Ubuntu) 側から Windows 側に未使用のページキャッシュを自動的に返却させるための設定。公式ドキュメントでは [wsl2] セクションとなっているけどそうすると WSL2(Ubuntu) 起動時にエラーとなるので、[experimental] セクションでよさそう。

このへんは運用しながら今後も定期的に要・見直しという感じ。

wsltty をインストール・ターミナルの設定など

ターミナルは Cygwin でも使ってるしシンプルなのが好きなので wsltty をインストール。

Releases · mintty/wsltty

ポータブル版を任意のディレクトリに解凍すると wsltty ディレクトリが作成されるので、bin にある mintty.exe のショートカットを作成して以下のように設定。

C:\<example_path>\wsltty\bin\mintty.exe --WSL= --position=894,33 --size=80,37 --icon=D:/virtual/wsl2.ubuntu/shortcut.ico --configdir=D:/home/<username>/.config/wsltty/ -~ -

ウィンドウ位置やサイズを固定したり、設定ファイルの場所を指定したり。アイコンは WSL2 の Ubuntu のものを使用。

設定ファイルは %APPDATA%/wsltty/config を --configdir で指定したディレクトリに複製して編集。emacs で使っているテーマ Zenburn に似せたのがあったのでそれで(標準のターミナルの色はどぎつくて辛い)。

参考 agkozak/zenburn.minttyrc: Zenburn Themes for mintty
参考 bbatsov/zenburn-emacs: The Zenburn colour theme ported to Emacs

# Low-Contrast Zenburn Theme for mintty
# https://github.com/agkozak/zenburn.minttyrc
BoldAsFont=yes

ForegroundColour=220,220,204
BackgroundColour=58,58,58
CursorColour=115,99,90

Black=30,35,32
Red=215,135,135
Green=96,180,138
Yellow=223,175,143
Blue=80,96,112
Magenta=220,140,195
Cyan=140,208,211
White=220,220,204
BoldBlack=112,144,128
BoldRed=220,163,163
BoldGreen=195,191,159
BoldYellow=240,223,175
BoldBlue=148,191,243
BoldMagenta=236,147,211
BoldCyan=147,224,227
BoldWhite=255,255,255

BoldAsFont=no Font=MeiryoKe_Console FontHeight=11 CursorType=block CursorColour=64,0,0 Locale= Charset= Scrollbar=none Transparency=off OpaqueWhenFocused=no BellType=1 BellFlash=no BellTaskbar=no BellPopup=no

PowerShell での使用が前提の ~/.bashrc を修正。色関係をコメントアウトして、プロンプトをシンプルに。

# 色関係(*color*)を全部コメントアウト

# ディレクトリ末尾に / が付いていればカラー表示なんか要らない alias ls='ls -F'
# プロンプトをシンプルに PS1="$ "

このへんはお好みで。

Windows 側から WSL2 のフォルダにアクセスできない場合

WSL2(Ubuntu) は起動しているのに \\wsl.localhost\Ubuntu\ にアクセスできない場合がありました。調べてみたら以下の記事が(多謝)。

参考 WSLのフォルダにエクスプローラーからアクセスできない #WSL2 - Qiita
参考 [Q&A] WLS及びLinuxのフォルダーが開けない。 - Qiita

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order

の【ProviderOrder を修正。

cbfsconnect2017,WinFsp.Np,RDPNP,LanmanWorkstation,webclient,P9NP

となっていたのを

P9NP,cbfsconnect2017,WinFsp.Np,RDPNP,LanmanWorkstation,webclient

に変更したらアクセスできるようになりました。WSL2 で使用されている Plan 9 プロトコルの優先順位を上げる感じ(多分)。

WSL2 に Windows の PATH が追加されているのを削除

WSL2(Ubuntu) で PATH を確認すると Windows 側のディレクトリパスが含まれています。「なんでやねん…」って感じですが。

参考 WSL2でWindowsのPATH設定が引き継がれるのを解除する

/etc/wsl.conf に以下を追加。

[interop]
appendWindowsPath=false

WSL2(Ubuntu) の自動起動設定

WSL2(Ubuntu) が自動起動しないことよりも、WSL2(Ubuntu) のターミナルウィンドウを閉じると WSL2(Ubuntu) が勝手にシャットダウンされてしまうのが困るので。

参考 WSL2を自動起動する設定 #Windows11 - Qiita

ThinkPad で使うので【コンピューターをAC電源で使用している場合のみタスクを開始する】のチェックは外しておく。

とりあえず以上で WSL2 + Ubuntu のインストールと設定は完了。

Claude Code と VS Code 連携

ここからが本題。WSL2(Ubuntu) に Claude Code をインストールして VS Code と連携させます。

Claude Code を WSL2 にインストール

Claude Code を VS Code からしか使わないのであればこの作業は不要です。

ネイティブ版をインストールするので Node.js のインストールは不要。

curl -fsSL https://claude.ai/install.sh | bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc
claude --version

バージョンが表示されればおk。

Claude をグローバル npm パッケージとしてインストールする方法もあるみたいだけど、今回はシンプルにネイティブ版にしました。

Anthropic アカウント認証

Claude Code を VS Code からしか使わないのであればこの作業は不要です。

サブスクリプション契約している Anthropic アカウントと連携させます。以下を実行。

claude

初回実行時にブラウザ認証のURLが表示されるので、URLをコピーして Windows 側のブラウザで開く → Anthropic アカウントでログイン → 認証コードが表示されたら、ターミナルに貼り付けて Enter でおk。

VS Code の WSL 機能拡張をインストール

Windows 側の VS Code を WSL2(Ubuntu) と連携させるための機能拡張をインストールします。

WSL - Visual Studio Marketplace

連携のキモは上記の機能拡張をインストールした上で VS Code を WSL2(Ubuntu) 側から起動することです。WSL2 から起動しやすいように VS Code の本体 code.exe のシンボリックリンクを作成。

sudo ln -s '/mnt/c/Users/<username>/AppData/Local/Programs/Microsoft VS Code/bin/code' /usr/local/bin/code

作成したシンボリックリンクからプロジェクトディレクトリを指定して VS Code を起動。初回起動時に VS Code Server for Linux x64 なるものが自動でインストールされます。

$ code ~/httpdocs/<projectname>/
Installing VS Code Server for Linux x64 (10c8e557c8b9f9ed0a87f61f1c9a44bde731c409)
Downloading: 100%
Unpacking: 100%
Unpacked 4168 files and folders to /home/<username>/.vscode-server/bin/10c8e557c8b9f9ed0a87f61f1c9a44bde731c409.
Looking for compatibility check script at /home/<username>/.vscode-server/bin/10c8e557c8b9f9ed0a87f61f1c9a44bde731c409/bin/helpers/check-requirements.sh
Running compatibility check script
Compatibility check successful (0)
$
この機能拡張をインストールして使用すると WSL2(Ubuntu) 側のメモリを相当圧迫する(VS Code を起動するだけで 1GB ほど)ので注意。
後日わかったことですが、VS Code Server for Linux x64 インストールが終わってしまえばWSL2(Ubuntu) 側から起動しなくても VS Code を起動して WSL: Connect to WSL を実行したらいけるっぽい。

VS Code が起動すると以下のようなダイアログが表示されるので「親フォルダー ~」にチェックを入れて【はい、作成者を信頼します】をクリック。

VS Code が無事起動したは良いものの、今まで VS Code で使っていた機能拡張のほとんどが使えなくなっています。

機能拡張のサイドバーを確認すると【WSL: Ubuntu にインストールする】というボタンが表示されているので、必要なものについてはクリックしてインストールすると無事使えるようになりました。

どういう仕組みかよくわからないけど、WSL2(Ubuntu) 側の ~/vscode-server/ ディレクトリ内に機能拡張がインストールされる模様。
このリモート用の機能拡張が WSL2(Ubuntu) 側のメモリをそこそこ圧迫するっぽい。ので、使わないリモート側の機能拡張はワークスペース単位でもいいので無効にしたほうが良さげ。

PHP 8.3

僕の仕事は WordPress のテーマ開発が主なので使用言語は PHP ばかり。VS Code の WSL 機能拡張を使う際に WSL2(Ubuntu) 側の PHP をバリデーションに使うようにするためにインストール。

sudo apt -y install php8.3 php8.3-mbstring

インストール後に Ctrl + Shift + P で【Preferences: Open User Settings (JSON)】を開いて php.validate.executablePath を修正しようとすると「この設定は、このウィンドウでは適用できません。ローカル ウィンドウを開いたときに適用できます。」と表示されます。なんやろ?って思ったら WSL2 側の設定で指定せなあかん模様。

参考 VSCode Remote DevelopmentにおけるRemote側のエディタ設定について #RemoteDevelopment - Qiita

Ctrl + Shift + P で【Preferences: Open Remote Settings (JSON)】を開いて以下を追記 or 修正。

"php.validate.executablePath": "/usr/bin/php"

Claude Code に制限をかける

データを学習に使わないようにしたり、破壊的な操作をしないようにしたり。この辺の設定に関する情報はめまぐるしく変わるので、定期的に要・見直し

まずは https://claude.ai/settings/data-privacy-controls の【Claudeの改善にご協力ください】をオフにします。これをやっておけば、データの保持期間が 30 日間に短縮されて学習にも使われなくなります。

あとは ~/.claude/settings.json にいろいろ書くとローカルでの動作を全般的に制限できます。以下を参考に deny をいろいろ追加しました。

参考 ひとつやるだけでも大違い - Claude Code 設定チートシート、書いたよー|オカダリョウタロウ

プロジェクト個別の設定は <project_dir>/.claude/settings.json に書いて Git で共有、個人的な設定は <project_dir>/.claude/settings.local.json に書いて Git で共有しないようにすると良さそう。

  "theme": "dark",
  "permissions": {
    "deny": [
      "Bash(git push -f *)",
      "Bash(git push --force *)",
      "Bash(git reset --hard *)",
      "Bash(git checkout .)",
      "Bash(git clean -f *)",
      "Bash(git add .)",
      "Bash(git add -A)",

      "Bash(rm -rf *)",
      "Bash(rm -r *)",

      "Bash(chmod 777 *)",
      "Bash(chmod -R *)",
      "Bash(chown -R *)",
      "Bash(killall *)",
      "Bash(pkill *)",
      "Bash(kill -9 *)",

      "Bash(sudo *)",
      "Bash(su *)",

      "Bash(curl *|*sh)",
      "Bash(wget *|*sh)",

      "Bash(ssh *)",
      "Bash(scp *)",
      "Bash(rsync *)",

      "Bash(npm publish *)",
      "Bash(yarn publish *)",
      "Bash(pnpm publish *)",
      "Bash(*deploy*)",

      "Bash(terraform apply *)",
      "Bash(terraform destroy *)",
      "Bash(kubectl apply *)",
      "Bash(kubectl delete *)",
      "Bash(helm install *)",
      "Bash(helm upgrade *)",
      "Bash(docker push *)",
      "Bash(aws * --no-cli-pager)",
      "Bash(gcloud * --quiet)",

      "Read(**/.env)",
      "Read(**/.env.*)",
      "Read(**/secrets/**)",
      "Read(**/.ssh/**)",
      "Read(**/.aws/**)",
      "Read(**/credentials.json)",
      "Read(**/*.pem)",
      "Read(**/*.key)",
      "Read(**/wp-config*.php)",

      "mcp__claude_ai_Slack__slack_send_message",
      "mcp__claude_ai_Slack__slack_schedule_message"
    ]
  }
}

テレメトリーの送信も禁止しておきます。~/.profile に以下を追加。

export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1

VS Code にも設定を追加。 Ctrl + Shift + P で【Preferences: Open User Settings (JSON)】を開いて以下を追加。

    "claudeCode.environmentVariables": [
        {
            "name": "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC",
            "value": "1"
        }
    ],

以上でとりあえず準備完了。あとは Claude Code と楽しい会話をするだけ。

その他

蛇足であれこれと。

Git の設定(リモート)

WSL(Ubuntu) 側の Git が使用されるようになるので設定が必要。

git config --global user.email "mail@example.com"
git config --global user.name "YOUR NAME"

他にもいろいろあるけどとりあえずはこれだけ。

WSL(Ubuntu) から Windows へのアクセスを制限

/mnt/ 以下に Windows 側のドライブが自動でマウントされるのは怖い気がする。分離できてないし。試しに WSL2(Ubuntu) 側からファイル操作してみたけどガバガバ。

VS Code 連携のためには少なくとも C: ドライブはマウントする必要がありますが、D: ドライブ(データのほとんどを入れている)はマウントしなくても大丈夫かも。

/etc/wsl.conf に以下を追加。

[automount]
enabled = false

/etc/fstab に以下を追加。

C: /mnt/c drvfs ro,uid=1000,gid=1000 0 0

D: ドライブがマウントされていないことを確認。WSL2(Ubuntu) 側から C: ドライブへの書き込みができないことを確認。VS Code が WSL2(Ubuntu) 側から起動できることを確認。

とりあえずこれでしばらく使ってみます。

Emacs

とりあえず Emacs も入れとかんと。

sudo apt -y install emacs

インストール途中で Postfix もインストールされるんだけど【No configuration】を選択して、後から削除。

sudo apt -y remove postfix
sudo apt autoremove

テーマは Zenburn にする。

git clone https://github.com/bbatsov/zenburn-emacs.git tmp
mkdir .emacs.d
mkdir .emacs.d/themes
mv tmp/zenburn-theme.el ~/.emacs.d/themes/
rm -rf tmp

~/.emacs.d/init.el に以下を追記。

;;;; Zenburn を使用
(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/")
(load-theme 'zenburn t)

;;;; ついでにキーバインドも
(global-set-key "\C-h" 'delete-backward-char)
(global-set-key "\M-\C-h" 'backward-kill-word)
(global-set-key "\M-g" 'goto-line)
(global-set-key "\M-?" 'help-for-help)

;;;; UI
(menu-bar-mode -1)

~/.bashrc に以下を追記。ターミナル内でのみ使いたい。

alias emacs="emacs -nw "

とりあえず以上で。その他の設定はおいおい。

VHDX ファイルの最適化

たまにやるとよいかも。

diskpart
select vdisk file=<vhdx_file_path>
attach vdisk readonly
compact vdisk
detach vdisk
exit

WSL2(Ubuntu) 側のディレクトリへのシンボリックリンクを作成

WSL2(Ubuntu) 側のプロジェクトディレクトリを Windows 側から簡単にアクセスできるようにシンボリックリンクを作成しておきます。任意のディレクトリで以下を実行。

mklink /d projects \\wsl.localhost\Ubuntu\home\<username>\projects

Cygwin からもアクセスしやすくなるし、ファイルエクスプローラーからアクセスしたときもツリーがいちいちあっち行ったりこっち行ったりしなくなるので便利。

でもクイックアクセスにピン留めするとツリーで wsl.localhost のほうが表示されるので不便。これ、なんとかならんものか…。

Python 関連

Claude Code はPython を使いがち。例えば空の代替アイキャッチ画像を作成してもらう時などは、まず Python の Pillow を使おうと試行します。

ということでとりあえずインストールしておきます。

apt -y install python3-pil

Ubuntu は Python がシステム密接に関わっているそうで、pip は非推奨っぽい。ので、apt で該当するパッケージをインストールします。

参考 Ubunt24.04でpip install時に"error: externally-managed-environment"エラーが出た時の対処法 #Python - Qiita

ゾーン情報(Zone.Identifier)ファイル生成抑止

WSL2(Ubuntu) に Windows 側からファイルをコピーすると <filename>.Zone.Identifier というファイルが生成されます。NTFS のセキュリティ用ゾーン情報ってやつです(Windows のファイルエクスプローラーで警告表示に使われるアレ)。いちいち削除するのもうっとおしいので生成を抑止します。

  1. レジストリエディタを開く
  2. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\ に移動して Attachments キーを作成
  3. Attachments の下に DWORD(32ビット)値で SaveZoneInformation を作成して 1にする

 

タイトルとURLをコピーしました