🐈

【解決】WSL上の別ユーザーでVSCodeを開こうとしたらchdir failedエラーになった件【WSL2】

に公開

はじめまして。nemunekoです=^_^=

WSL2に新しいユーザーを追加して、そのユーザーでVSCodeを開こうとしたら chdir failed エラーが出てターミナルが死んでしまいました。
今回は、この問題を /etc/wsl.conf の設定で解決した方法をご紹介します。

それではどうぞ。

この記事が役に立つ方

以下のような状況に遭遇した方向けの記事です。

  • WSL2環境で、複数のLinuxユーザーを使い分けたい
  • wsl -u <別ユーザー名> でログインして code . を実行したら、VSCodeのターミナルが動かなくなった
  • chdir(2) failed.: Permission denied というエラーメッセージが表示された

発生状況

ひょんなことから、新しいユーザが欲しくなったので、早速adduser testuser でユーザーを作り、wsl -u testuser でログイン。ここまでは順調です。
そして、意気揚々とカレントディレクトリで code . を実行。

$ cd ~
$ code .

VSCodeのウィンドウは無事に開きました…と思ったのも束の間、ウィンドウ下部のターミナルに、以下のエラーメッセージが表示されていたのです=TェT=

chdir(2) failed.: Permission denied

ターミナルが使えないと何もできないので原因を調査しました。

原因調査

調査1:パーミッションがおかしい?

Permission denied って言われたら、まず疑うのはもちろん権限です。
ls -la ~ でディレクトリの所有者を確認したけど、ちゃんと testuser になってる…。うーん、違うっぽい。

調査2:logを確認

根本原因を突き止めるべく、VSCodeのログを見てみることにしました。
F1キーでコマンドパレットを開き、Remote-WSL: Show Log を選択。

ログを眺めていると、以下のログを発見。

[2025-07-05] ... NodeExecServer run: ... -e /home/nemuneko/.vscode-server/...

testuser で起動したはずなのに、なぜかnemunekoで起動していることになっている…!

調査3:プロファイルを分けてみる

VSCodeのプロファイルを分ければ別セッションになるのでは?と思い、以下のコマンドを試してみました。

$ wsl.exe -u testuser bash -c "code ~ --user-data-dir ~/.vscode-testuser"

結果:VSCodeのウィンドウは開いたものの、ターミナルは相変わらず同じエラー...

chdir(2) failed.: Permission denied

原因判明

調査の結果、VSCodeのRemote-WSL拡張機能は、複数のユーザでVSCodeを起動できなさそう、ということがわかりました…=TェT=

すなわち。

  1. 先に nemuneko ユーザーでVSCodeを開いていた
  2. Remote-WSLサーバーが nemuneko 権限で起動
  3. 後から testusercode . を実行しても、既存のサーバーセッションが再利用される
  4. nemuneko 権限のサーバーが testuser のホームディレクトリにアクセスしようとして権限エラー

解決方法:/etc/wsl.conf でデフォルトユーザーを変更

いろいろ試した結果、上手くいった方法は WSLのデフォルトユーザーを一時的に変更する ことでした。

手順

  1. WSLに接続しているVSCodeをすべて落とす

  2. WSL内で /etc/wsl.conf を編集

$ sudo vim /etc/wsl.conf

以下の内容を追記

[user]
default=testuser
  1. WSLを再起動
# PowerShellまたはコマンドプロンプトで実行
> wsl --shutdown
  1. もう一度WSLを起動して code . を実行
> wsl
$ whoami
testuser
$ cd ~
$ code .

動いた!!!=^ω^=

ターミナルも含めて、完全に testuser として動作するようになりました!

元に戻す

作業が終わったら、同じ手順で /etc/wsl.confdefault=nemuneko に戻すのを忘れずに。

まとめ

VSCodeのRemote-WSL拡張機能が複数ユーザーに対応していないなんて、正直想定外でした。でも /etc/wsl.conf を書き換えるという原始的な方法で解決できましたが、めんどくさいですね。
ちなみにネットで調べてみると同じようなことに喘いでいる人がいましたね。参考文献として張っておきます。
それではまた。nemunekoでした=^_^=

参考文献

Discussion