WSL1 (Windows Subsystem for Linux) 配下のディレクトリ属性は、Windows の標準とは異なる様です。ホームディレクトリが深い場所に有って不便だと思い、エクスプローラーで C: ドライブの直下に移動したら、新たに作成したファイルの属性が全て 777 (rwxrwxrwx) という大変な事になりした。本記事は、原因解明と復旧、および対策の備忘録です。
目次:
本来の WSL1 での場所:
Ubuntu-20.04 では、ホームディレクトリは次の場所に有ります。
%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home\%USERNAME%
これを C: ドライブの直下に移動して、元の位置から Windows のリンク (ジャンクション) を張れば便利になると思ったのが大間違いでした。
発生した現象:
- 新たに作成する全てのファイルの属性が 777 (rwxrwxrwx) になった
- chmod コマンドが全く効かない、umask も機能していない
判明した特殊なアカウント「AppContainer SID」:
rootfs を Windows のエクスプローラーから右クリックしてプロパティを表示し、セキュリティ タブを開いたところ、不明なアカウントが有ります。
調べたところ、次の記事に行き当たりました。
ユーザー名が「S-1-15-2-」から始まるのは「AppContainer SID」という物らしいです。記事によると「削除すると、アプリの実行に影響が出る可能性があります」との事。C: ドライブ直下に移動した時に、親フォルダ C: からのアクセス許可の継承が行われ、削除されてしまった様です。更に厄介なのは、不明なアカウントなので権限を一度削除してしまうと元には戻せないのです。
復旧方法:
- Windows 側に移動してしまったホームディレクトリは、WSL を使って tar で元の場所に書き戻す。元の場所では、親フォルダからのアクセス許可の継承が行われ、元に戻ります。
- 次のスクリプトは、C:\WSL_home というディレクトリ からホームを戻す例。
cd /home
以上の設定では、元のファイルは消去しませんので、適宜削除します。
sudo mv username username.tmp
sudo mkdir username
sudo chown username username
sudo chgrp username username
chmod 1755 username
cd
(cd /mnt/c; tar cvf - WSL_home)|tar xvf -
mv WSL_home/[A-z]* .
mv WSL_home/.[A-z]* .
rmdir WSL_home
新たな対応策:
- フォルダの共有は、WSL 側でホームディレクトリ上に「Sandbox_Ubuntu」等のディレクトリを作り、Windows 側からジャンクションを作成するのが良さそう。
こちらの別記事に手順を記載しました。
但、この方法だと私の環境では、Windows 側からエクスプローラーでこのフォルダ移動したファイルは属性が 000 (---------) になってしまいます。毎回 WSL 側で chmod する必要が有ります。