「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 が使われていることを確認。
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 をインストール。
ポータブル版を任意のディレクトリに解凍すると 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 にインストール
ネイティブ版をインストールするので Node.js のインストールは不要。
curl -fsSL https://claude.ai/install.sh | bash echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc claude --version
バージョンが表示されればおk。
Anthropic アカウント認証
サブスクリプション契約している 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) $
VS Code が起動すると以下のようなダイアログが表示されるので「親フォルダー ~」にチェックを入れて【はい、作成者を信頼します】をクリック。

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

機能拡張のサイドバーを確認すると【WSL: Ubuntu にインストールする】というボタンが表示されているので、必要なものについてはクリックしてインストールすると無事使えるようになりました。
このリモート用の機能拡張が 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 からもアクセスしやすくなるし、ファイルエクスプローラーからアクセスしたときもツリーがいちいちあっち行ったりこっち行ったりしなくなるので便利。
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 のファイルエクスプローラーで警告表示に使われるアレ)。いちいち削除するのもうっとおしいので生成を抑止します。
- レジストリエディタを開く
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\ に移動して Attachments キーを作成
- Attachments の下に DWORD(32ビット)値で SaveZoneInformation を作成して 1にする
