WSL2から見たWindows側フォルダの所有者がおかしいときは
WSL2(Windows Subsystem for Linux)のUbuntu環境を一旦リセットして再セットアップしたところ、同じようにセットアップしたはずなのにうまく動かない、という現象に遭いました。
しかも、Microsoftストアからインストールした「リセットしていないUbuntu」は普通に動いて、「リセットを行ったUbuntu 20.04」では動かない、という変な状況に陥りました。(「Ubuntu」の中身は「Ubuntu 20.04」と同じはず)
一応、今回陥った原因が分かったのでまとめておきます。
結論
Windows側でWSLサービスを再起動したら直った。
陥った状況
一回、Ubuntu 20.04環境をまっさらにしたくて、「アプリと機能」から「Ubuntu 20.04 LTS」アプリのリセットを行いました。これを行うことで、Ubuntu 20.04で行った変更がすべて元に戻り、次回起動時にUnixユーザーの作成から始めることができます。
これで、もう一度UbuntuのアップデートやGUIアプリを動かす設定を行って、Cドライブ(/mnt/c/)に保存しているソフトを起動したところ、「chmodに失敗した」的なエラーが出てうまく動きませんでした。
(このソフトは、bashスクリプトとPythonスクリプトからなるソフトなので、Windows側に保存していても動きます)
しかも、リセットを行っていない「Ubuntu」で同じソフトを起動したところ、何の問題もなく起動しました。今は「Ubuntu」アプリと「Ubuntu 20.04」アプリは同じもののはずなので、一方だけ動く、ということもないはずです。
原因
「Ubuntu」と「Ubuntu 20.04」で権限周りをよく見比べてみたところ、Cドライブ(/mnt/c/)の所有者(ownership)が違う、というのが原因だったようです。
ls -l
で確認すると、前者は/mnt/c/の所有者が初回起動時に作成したUnixユーザーになっているのに対し、後者は所有者がrootになっていました。このあたりが原因で、chmodに失敗していたようです。
PS C:\> wsl -d Ubuntu-20.04 ls -alF /mnt/
total 8
drwxr-xr-x 9 root root 4096 Aug 10 14:20 ./
drwxr-xr-x 19 root root 4096 Aug 10 14:20 ../
drwxrwxrwx 1 root root 4096 Aug 9 03:02 c/
drwxrwxrwx 1 root root 4096 Aug 9 00:50 e/
drwxrwxrwx 1 root root 4096 Aug 9 00:50 h/
drwxrwxrwx 1 root root 4096 Aug 9 00:50 i/
drwxrwxrwx 1 root root 4096 Aug 9 00:50 m/
drwxrwxrwx 1 root root 4096 Aug 9 00:50 n/
drwxrwxrwt 2 root root 40 Aug 10 14:17 wsl/
対応策
いろいろ試してみたところ、どうやら初期設定後にWSLサービスを再起動すれば、次回以降はUnixユーザーでCドライブをマウントしてくれるようです。(多分、パソコンを再起動したり、WSLをすべて閉じてしばらく待つ、などでもよいと思います)
まず、開いているWSL(WSL2版Dockerを含む)を終了します。
続いて、WSLサービスを一旦終了します。管理者権限でPowerShellを開いて、net stop LxssManager
を実行します。
PS C:\WINDOWS\system32> net stop LxssManager
LxssManager サービスを停止中です.
LxssManager サービスは正常に停止されました。
WSL2を起動すると、自動的にWSLサービスも起動しますので、これでOKです。
確認してみると、Ubuntu 20.04環境でもCドライブがUnixユーザーでマウントされていることが分かります。(usernameというUnixユーザー名です)
PS C:\> wsl -d Ubuntu-20.04 ls -alF /mnt/
total 8
drwxr-xr-x 9 root root 4096 Aug 10 14:20 ./
drwxr-xr-x 19 root root 4096 Aug 10 14:30 ../
drwxrwxrwx 1 username username 4096 Aug 9 03:02 c/
drwxrwxrwx 1 username username 4096 Aug 9 00:50 e/
drwxrwxrwx 1 username username 4096 Aug 9 00:50 h/
drwxrwxrwx 1 username username 4096 Aug 9 00:50 i/
drwxrwxrwx 1 username username 4096 Aug 9 00:50 m/
drwxrwxrwx 1 username username 4096 Aug 9 00:50 n/
drwxrwxrwt 2 root root 40 Aug 10 14:30 wsl/
これで、Cドライブに保存していたソフトが正常に動くようになりました。
2020/8/13追記:wsl -t でも良さそう
上記では、管理者権限でPowerShellを開いてWSLサービスをまるごと終了する、という方法を紹介しましたが、よくよく調べてみたらディストリビューション単位で終了する方法が用意されていました。
通常権限のPowerShellやコマンドプロンプトを開いて、wsl -t ディストリビューション名
で、指定したディストリビューションを終了することができます。-t
は--terminate
でもOKです。
PS C:\> wsl -t Ubuntu-20.04
何も表示されずにプロンプトが戻ってきますが、wsl -l -v
などで確認してみると、指定したディストリビューションがStoppedになっていることが確認できます。これでもう一度Ubuntuを起動すれば、Windows側フォルダの所有者がUnixユーザーに変わると思います。
すべてのディストリビューションを終了したいなら、wsl --shutdown
でもよいと思います。
これらのコマンドは管理者権限は不要ですので、操作が楽ですね。
ディスカッション
コメント一覧
まだ、コメントがありません