1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL2 で Linux から Windows 側ファイルを操作すると権限関連のエラーが出る場合の対策

Last updated at Posted at 2025-05-03

症状

  • WSL2 において、Linux にマウントされている Windows ファイルシステム上で、ファイル作成を伴うコマンドを実行すると、しばしば権限エラーが出る
    • npm install, yarn add, git clone など、何でも起きうる
  • 以下は yarn add のエラー
senk@ponko2:/mnt/c/Users/senk/srcs/jest-tutorial$ yarn add -D typescript
yarn add v1.22.22
warning ../package.json: No license field
info No lockfile found.
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
error Error: EPERM: operation not permitted, copyfile '/home/senk/.cache/yarn/v6/npm-typescript-5.8.3-92f8a3e5e3cf497356f4178c34cd65a7f5e8440e-integrity/node_modules/typescript/LICENSE.txt' -> '/mnt/c/Users/senk/srcs/jest-tutorial/node_modules/typescript/LICENSE.txt'
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

原因

  • WSL にマウントされている Windows 上のフォルダーは、全て所有者が root、パーミッションは 777 (書き込み権限がない場合 555) になってしまう
    • パーミッション情報はファイルのメタデータに保存されるが、Windows のファイルシステム (NTFS) はメタデータを無視する
      • DrvFs の仕様らしい
    • したがって WSL にマウントされている Windows 上のファイルシステムでは、パーミッションが全く反映されない1
  • 上の例では、ソースコードがあるのは Windows のホームディレクトリ (c:/Users/<ユーザー名>/) 内のフォルダーのため、WSL 上では所有者が root になってしまう
    • chownchmod で変えようとしても変えられない
  • このため、WSL 上の一般ユーザーが yarn add を実行しても、権限エラーで弾かれてしまう

付随する問題

  • このソースを git にコミットすると権限がガバガバになる
    • 不必要な実行権限が付く

対策

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

[automount]
options = "metadata,umask=22,fmask=11"

WSL を再起動 (Powershell で以下を実行):

wsl --shutdown
wsl -l  # ディストリ名を確認
wsl -t Ubuntu

WSL 上にマウントされている Windows ホームディレクトリで、所有者が WSL のユーザーに変わっていれば OK

senk@ponko2:/mnt/c/Users/senk/srcs$ ls -l
total 24
-rwxr--r-- 1 senk senk    79 May  3 04:59 foo.js
-rwxr--r-- 1 senk senk    89 May  3 05:16 foo.ts
drwxr-xr-x 1 senk senk  4096 May  3 16:41 jest-tutorial
...
(所有者と権限が一般ユーザー向けになっている)

解説

  • NTFS はファイルのメタ情報(パーミッション含む)を無視するが、WSL 側から $LXMOD などの NTFS 拡張属性をファイルに追加することで、Linux のパーミッション情報が記録できるようになる
  • /etc/wsl.conf に追加した options = "metadata" によって、拡張属性が記録できるようになる
    • デフォルトはなぜか disabled2
      • 誰が得するんだ
  • umask=22,fmask=11 は、標準的な Linux のファイル作成時の権限に近づけるオプション
    • 不要な実行権限の付与を避ける

余談: Unix 系コマンドを使いたいだけなら BusyBox がベター

  • WSL は何年経ってもこういう地雷があるし、パフォーマンスも相変わらず悪い
  • PowerShell なら上の問題はないが、コマンドラインツールが貧弱すぎる
  • コマンド周りを改善したいだけなら BusyBox がオススメ

参考

  1. WSL2でファイルのパーミッションを適切に設定する | 人と情報

  2. https://learn.microsoft.com/en-us/windows/wsl/wsl-config#automount-options

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?