WSLでchmodしても権限が変わらない?metadataと保存先の確認

WSLでchmodを実行したのに、ファイルの権限が思ったように変わらないことがあります。同じLinux端末で操作していても、Linux側に保存したファイルと、/mnt/cなどから開くWindows上のファイルでは、権限の扱いが異なります。

まず保存先とマウントの状態を見てから、自分で作った小さなファイルで変化を確かめると、chmodを繰り返す前に原因を絞れます。以下はWSL 2のLinux端末で、GNU coreutilsのdf・stat・mktemp・chmodとutil-linuxのfindmntが使える環境を想定した手順です。

操作しているファイルの保存先を確かめる

権限が気になるファイルのあるフォルダーへLinux端末で移動し、現在地とファイルシステムを表示します。

pwd
df -T .

ホーム配下などのLinux側ではext4、Windowsドライブを開いている場所ではWindows側のパスが手掛かりになります。ただし、WSL 2のWindowsドライブはType欄が9pと表示される場合もあります。ファイルシステムの名前だけで判断せず、次のマウント情報も合わせて見ると分かりやすくなります。

権限を直すために、いきなり既存プロジェクトを移動する必要はありません。設定や配置を変える前に環境を残しておきたいときは、WSLのバックアップと別名復元も参考になります。

Windowsドライブのmetadataを確認する

findmnt -T . -o FSTYPE,OPTIONS

このコマンドは、現在のフォルダーが属するファイルシステムとマウントオプションを表示します。Windowsドライブの情報には、aname=drvfsやWindows側のパスが含まれることがあります。metadataが設定されているかも、権限の読み方に関わります。

Microsoftの説明では、Windows上のファイルはWindowsユーザーのアクセス権からLinux向けの権限が計算されるか、WSLが付けたmetadataから読み取られます。metadataは既定で有効ではありません。metadataを使う構成では、Linuxの所有者やモードをNTFSの拡張属性として保持できます。

そのため、metadataを使わないWindowsファイルへchmod 600を実行しても、Linux側の通常ファイルと同じ表示になるとは限りません。chmodが成功して終わったことと、表示や実際のアクセスが希望どおりになったことは、別々に見ておくと安心です。

新しく作ったファイルで変化を見る

次は、書き込み可能な作業フォルダーで試す例です。既存ファイルを使わず、現在の場所に名前の重ならない一時フォルダーを作り、その中のsample.txtだけを変更します。Linux側とWindowsドライブ側を比較したいときは、それぞれの場所で同じ操作を行います。

test_dir=$(mktemp -d ./wsl-permission-demo.XXXXXX) &&
printf 'permission demo\n' > "$test_dir/sample.txt" &&
stat -c '%a %n' "$test_dir/sample.txt" &&
chmod 600 "$test_dir/sample.txt" &&
stat -c '%a %n' "$test_dir/sample.txt"

最初と最後のstatの出力を見比べます。%aは8進数の権限、%nはファイル名です。600は所有者の読み書きを許可し、グループとその他の利用者には許可を付けないモードです。&&でつないでいるため、一時フォルダー作成などが失敗した後に、後続の変更だけを続けません。

保存先・条件 結果を見るポイント
Linux側の通常ファイル chmod後に600へ変わるかを見る
Windowsドライブ・metadataなし Windows権限から計算された表示が残る場合がある
Windowsドライブ・metadataあり Linuxのモードをmetadataへ反映できるが、Windows側のアクセス権も必要

たとえばmetadataなしの場所で777のままでも、それだけでchmodの入力ミスとは決まりません。反対に、600と表示されることだけでWindowsアプリからのアクセスまで同じ規則になったとは考えないでください。Permission deniedなどが出た場合は、コマンドの終了だけでなく、対象の保存先や所有者、Windows側で許可された操作を調べる手掛かりになります。

使い終わったら、同じ端末のtest_dirが示す場所を確かめ、今回作ったsample.txtと一時フォルダーだけを片付けます。秘密鍵など大切なファイルは、確認用の入力に置き換えないでください。

必要な設定を保存先に合わせて選ぶ

Linuxの権限を前提にするツールなら、Linux側の保存場所で扱えるかを考えるのも一つの方法です。Windows側に置く必要がある場合は、現在のmetadataやマスク設定、Windowsのアクセス権を組み合わせて見直します。chmod 777やsudoを一律の解決策にすると、意図した制限とは逆の状態を作ることがあります。

DrvFsの自動マウントオプションは、ディストリビューションごとの/etc/wsl.confにある[automount]で設定できます。既存の設定を残したうえで必要な項目を公式資料と照らし合わせ、設定の適用範囲と再起動の影響も判断する流れが適しています。Windowsのアクセス権で許可されていない操作を、metadataやchmodで追加できるわけではありません。

SSH鍵の配置や権限を扱う場合は、SSH鍵管理の基本も参考になります。一般的なファイルの表示確認と、秘密鍵を安全に保管する要件は、それぞれの保存先で考えることが大切です。

参考資料