らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

WSL でマウントしたファイルシステムでもパーミッションを扱えるようにする

WSL は一般的には「VolFs」と「DrvFs」の、ふたつのファイルシステムを併せて運用することになると思います。

  1. VolFs (WSL 内部を管理する。 WSL 上にインストールされたディストリビューションを管理するファイルシステム)
  2. DrvFs (WSL 外部を管理する。 WSL 上からマウントされた外部 (NTFS など) を管理するファイルシステム)

ですが、デフォルトの状態では DrvFs でパーミッションを細やかに管理することが出来ません。 WSL のファイルアクセス許可には下記のように書かれています。

ファイルにメタデータが関連付けられていない場合は、Windows ユーザーの有効なアクセス許可を読み取り/書き込み/実行ビットに変換し、ユーザー、グループ、およびその他の同じ値として設定します。 たとえば、Windows ユーザーアカウントに読み取りと実行のアクセス権があり、ファイルへの書き込みアクセスが許可されていない場合は、ユーザー、グループ、およびその他の r-x として表示されます。 ファイルに Windows で ' 読み取り専用 ' 属性が設定されている場合、Linux では書き込みアクセス権は付与されません。

ですが、DrvFs をマウントする際に metadata オプションを指定することで、パーミッション情報をメタデータに保存することが出来るようになります。

WSL デフォルトの状態だと Windows の C ドライブは /mnt/c 配下にマウントされます。 mount で確認すると drvfs としてマウントされていること、マウントオプションに metadata が無いこと、が分かります。

$ mount | grep -i ^C:
C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,case=off)

マウントオプションを変更するには /etc/wsl.conf に指定したいオプションを定義します。 但し、デフォルト状態だと /etc/wsl.conf は存在しません。

$ ls /etc/wsl.conf
ls: cannot access '/etc/wsl.conf': No such file or directory

その為、以下のように /etc/wsl.conf を新規作成します。

$ sudo tee /etc/wsl.conf <<EOF >/dev/null
[automount]
options = "metadata"
EOF

これで準備完了です。 /mnt/c をアンマウント/マウントし直すか、または Windows ごと再起動して WSL を再起動させれば /mnt/cmetadata オプション付きでマウントされるようになります。

$ mount | grep -i ^C:
C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,metadata,case=off)

これで DrvFs であってもパーミッションを扱うことが出来るようになりました。

参考