はじめに
WSL2環境下で、dockerコマンドが効かなくなったり、テキストエディタでファイルの変更保存が効かないことがあったので、原因と対策手順をまとめました。トラブルシューティングのため、説明省きますが、導入方法は以下を参照してください。
原因
WindowsとLinux(WSL2)という2つの異なるOSが関わっており、ファイルシステムの境界をまたぐため権限の扱いが複雑になるため。それぞれ権限管理の仕組みや権限の表現方法が異なるため発生してしまう。
- Linux(Ubuntu)の場合
- ユーザーには「UID(ユーザーID)」という数字、グループにも「GID(グループID)」が割り当てられる。
例:takahashikanaさんのUID = 1000 - 読み取り(r)、書き込み(w)、実行(x)の3種類
- 所有者、グループ、その他の3つのカテゴリ
- ユーザーには「UID(ユーザーID)」という数字、グループにも「GID(グループID)」が割り当てられる。
- Windowsの場合
- 「SID(セキュリティID)」という全く異なる形式のIDを使用する。
例:S-1-5-21-123456789-123456789-123456789-1001のような長い文字列 - ACL(アクセス制御リスト)という複雑な仕組み
- 「フルコントロール」「変更」「読み取り」など、より細かい権限設定が可能
- 「SID(セキュリティID)」という全く異なる形式のIDを使用する。
手順
1. WSL2ユーザーに権限付与する
コマンドプロンプトでWSL2ユーザーが変更権限を持つように設定する
# 1. rootユーザーでログイン
wsl -u root
# 2. あなたのユーザーをsudoグループに追加
# (ユーザー名は適宜変更してください)
usermod -aG sudo あなたのユーザー名
# 3. rootユーザーからログアウト
exit
2. ファイル変更権限を与えるコマンドを追記する
# 1. WSL2環境に入りbashのリソースファイルを展開
vi ~/.bashrc
# 2. ファイル末尾に移動して、INSERTキーでINSERTモードに入り以下を追記
alias fixperm='sudo chown -R $USER:$USER .'
# 3. ESCキーでINSERTモードから抜けて上書き保存して閉じる
:wq
3. dockerコマンド実行する前に、以下を実行する
fixperm
※2025/12/23時点
毎回入力を回避するため、~/.bashrcにdockerコマンドが呼ばれる度に、以下コマンド実行されないか検討中
まとめ
原因で触れた通り、WSL2でWindowsのSIDをLinuxのUIDに変換しようとしてもこの変換が完璧でないため権限情報が正確に伝わらないことがあります。Windowsのファイルシステム上では、Linuxの権限変更コマンドが正しく反映されないことがある一方で、Linux側から見ると「権限がない」と判断されてしまいます。
この事象を回避するため、 WSL2環境では/home/WSL2ユーザー/配下で作業し、権限エラーが出た場合はホームディレクトリへ移動(cd ~)してからファイル変更権限を与えるコマンドを実行しましょう。