Windows 10 Fall Creators Updateから正式に利用できるようになったWSL (Windows Subsystem for Linux)だが、Windows 10 Fall Creators Updateの段階ではWSL側からWindows側のファイルのパーミッションを扱うことができなかった。

2018年春のアップデートでこの部分が改良され、WSL側から利用する場合、Windows側のファイルパーミッションの範囲内で、さらにLinux向けのパーミッションを設定できるようになった。WSL側からWindows側のファイルのパーミッションを変更することはできないが、それがWindows側のパーミッションの許可範囲内であれば、WSLにはさらにWSL側でのパーミッションが保持できるようになった。

説明してもわかりにくいので、具体的に操作しながら、どのように動作するのかを見ていこう。

WSLからWindowsファイルのパーミッションを変更

例えば、次のようなテキストファイルがデスクトップにあったとする。メモ帳で作成した空のテキストファイルで、ファイルパーミッションは通常のテキストファイルと同じだ。

PS C:\Users\daich\Desktop> Get-ChildItem .\COPYRIGHT.txt


    ディレクトリ: C:\Users\daich\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018/06/18     19:50              0 COPYRIGHT.txt


PS C:\Users\daich\Desktop>

このファイルをWSL側から見るとファイルパーミッションが「777」となっており、全てが許可されたファイルになっている。

daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ ls -l COPYRIGHT.txt
-rwxrwxrwx 1 daichi daichi 0 Jun 18 19:50 COPYRIGHT.txt
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$

WSL側から読み込みだけ許可された状態(444)に変更を試みる。結果は「555」になってしまうのだが、書込権限は無効化することができた。

daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ chmod 444 COPYRIGHT.txt
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ ls -l COPYRIGHT.txt
-r-xr-xr-x 1 daichi daichi 0 Jun 18 19:50 COPYRIGHT.txt
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$

書込権限がなくなったファイルに書き込みを試みると、次のように書き込みできないことを確認できる。

daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ echo test > COPYRIGHT.txt
-bash: COPYRIGHT.txt: Permission denied
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$

rootユーザーになって同じように書き込みを試みても、書き込みはできない。

daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ sudo su -l
root@DESKTOP-DVVLKV9:~# cd /mnt/c/Users/daich/Desktop/
root@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop# echo test > COPYRIGHT.txt
-su: COPYRIGHT.txt: Permission denied
root@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop#

今度は次のように書き込み権限を与えてから試してみると、テキストが書き込まれていることを確認できる。

daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ chmod 777 COPYRIGHT.txt
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ echo test > COPYRIGHT.txt
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ cat COPYRIGHT.txt
test
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$

テキストデータが書き込まれたファイルをWindowsからメモ帳で開いてみると、テキストが書き込まれていることを確認できる。

Windows側のメモ帳でテキストデータが書き込まれていることを確認

WSL側からある程度Windows側のファイルにパーミッションを設定してやりとりができるようになったことが確認できる。

WindowsでWindowsファイルのパーミッションを変更

今度はWindows側からテキストファイルのパーミッションを変更して、書き込み権限を削除してみる。

テキストファイルから書き込み権限を削除

この状態で試しにテキストファイルに別のテキストを書き込んで保存を試みると、次のように権限がない旨のメッセージが表示され、ファイルを保存できない。

書き込み権限のないテキストファイルを編集

保存しようとしても、書き込み権限がないので保存することができない

次に、Windows側からファイルパーミッションを変更した前後を変化を、WSL側から見てみる。Windows側から書き込み権限を削除する前は、次のように「777」のファイルパーミッションだったテキストファイルだが、この書き込み権限をWindows側で削除してみる。

daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ ls -l COPYRIGHT.txt
-rwxrwxrwx 1 daichi daichi 5 Jun 18 20:27 COPYRIGHT.txt
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$

すると、連動して次のようにWSL側からも書き込み権限が消えることを確認できる。

daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ ls -l COPYRIGHT.txt
-r-xr-xr-x 1 daichi daichi 5 Jun 18 20:27 COPYRIGHT.txt
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$

WSL側からファイルパーミッションの変更を試しても変更できないし、当然ファイルへの書き込みもできない。

daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ chmod 777 COPYRIGHT.txt
chmod: changing permissions of 'COPYRIGHT.txt': Permission denied
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ sudo chmod 777 COPYRIGHT.txt
chmod: changing permissions of 'COPYRIGHT.txt': Permission denied
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$ echo test > COPYRIGHT.txt
-bash: COPYRIGHT.txt: Permission denied
daichi@DESKTOP-DVVLKV9:/mnt/c/Users/daich/Desktop$

このように、WindowsとWSLでは常にWindows側のパーミッションのほうが優先される仕組みになっており、Windows側のパーミッションのなかでLinuxのパーミッションが機能するといった構造になっていることがわかる。

WindowsとLinuxをもっとシームレスに

WSLの仕組みを考えれば、現在の実装はなかなか妥当な落としどころと言えるだろう。WSLのLinuxはWindowsからすればアプリケーションの1つにすぎず、アプリケーションがWindowsを壊すことはできないようになっているわけだ。

しかし、パーミッションが設定できるようになったことで、これまで扱いにくかったことがやりやすくなった。例えば、Linuxのファイルを/mnt/c/Users/以下に展開するといったように、Windowsの領域にLinux側ツールのソースコードやライブラリ、バイナリなどを展開する場合だ。2018年春のアップデート以降はWSL側からパーミッションが設定できるため、Windowsの領域にありながらもLinuxのパーミッションを設定できる。フル機能がサポートされているわけではないが、状況はだいぶ良くなったと言える。

ファイルシステム周りの開発は今後のアップデートでも少しずつ進められていくはずなので、将来的にはさらにシームレスに動作するようになるだろう。