WSL2から見たWindows側フォルダの所有者がおかしいときは

2020年8月11日WSL 2Linux,Ubuntu,Windows,WSL2

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でもよいと思います。

これらのコマンドは管理者権限は不要ですので、操作が楽ですね。