みねっちょのマイコン関係ブログ

組込開発系フリーソフトやハードの情報発信ブログ

WSL のホームを C: 直下に移動したらファイル属性を変更出来なくなった

サイト内 Google 検索:


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エクスプローラーから右クリックしてプロパティを表示し、セキュリティ タブを開いたところ、不明なアカウントが有ります。

f:id:minettyo:20210204124401p:plain

WSL ファイルシステムのセキュリティ属性

調べたところ、次の記事に行き当たりました。

www.atmarkit.co.jp

ユーザー名が「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 する必要が有ります。

【WSL 関係の目次へ戻る】