症状
- 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 のホームディレクトリ (
c:/Users/<ユーザー名>/
) 内のフォルダーのため、WSL 上では所有者がroot
になってしまう-
chown
やchmod
で変えようとしても変えられない
-
- このため、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"
によって、拡張属性が記録できるようになる- デフォルトはなぜか
disabled
2- 誰が得するんだ
- デフォルトはなぜか
-
umask=22,fmask=11
は、標準的な Linux のファイル作成時の権限に近づけるオプション- 不要な実行権限の付与を避ける
余談: Unix 系コマンドを使いたいだけなら BusyBox がベター
- WSL は何年経ってもこういう地雷があるし、パフォーマンスも相変わらず悪い
- PowerShell なら上の問題はないが、コマンドラインツールが貧弱すぎる
- コマンド周りを改善したいだけなら BusyBox がオススメ
- 基本的な Unix 系コマンドがゴソッと使えるようになる
- 参考: インストール不要!WindowsでLinuxコマンドを使う #UNIX - Qiita
参考
- WSL でのパーミッション設定・GPU の有効化 #WSL2 - Qiita
- Windows 10のWindows Subsystem for Linux(WSL)を日常的に活用する - 2017-11-08 - ククログ
- WSL のファイルのアクセス許可 | Microsoft Learn