前回は、Windows 10 Insider PreviewでUbuntu on Windowsを有効にする方法を採り上げた。それを踏まえ、今回はセットアップしたUbuntu on Windowsの構造について迫っていこう。

1. Ubuntu on Windowsのファイルシステム

まずbashを起動してプロンプトを立ち上げたら、次のようにmount(8)コマンドを引数を指定せずに実行し、どのようなファイルシステム構造になっているのかを調べてみてほしい。

Ubuntu on Windowsのファイルシステムマウント状況

これを見るに「/」、「/dev」、「/dev/pts」、「/proc」、「/sys」が、マウントポイントとして使われているようだ。それぞれ、次のようなファイルシステムになっている。

  • /rootfs
  • /dev tmpfs
  • /dev/pts devpts
  • /proc procfs
  • /sys sysfs

どうも、Ubuntuの成果物がそのまま展開されているように見える。

bashを起動した直後にカレントディレクトリを調べてみると、カレントディレクトリが/root/で、ファイルのパーミッションなどは「root:root」になっている。Ubuntu on Windowsでは、スーパーユーザー「root」として振る舞う設定になっているようだ。

Ubuntu on Windowsでは基本的にrootとして振る舞う

Ubuntu on Windowsでは基本的にrootとして振る舞うが、Windows側に及ぼすことができる内容には限りがあるような仕組みにしてあるのだろう。

2. Windowsファイルシステムは、/mnt/c/へ

調べていくと、Windowsのファイルシステムは/mnt/c/以下に展開されていることがわかる。cdコマンドを使って/mnt/c/以下に移動し、lsコマンドで中身を見てみると、Windowsでよく見かけるファイルやフォルダを確認できるはずだ。

Windowsでよく見かけるファイルやフォルダを確認できる

推測だが、ファイルシステムのパスを扱うシステムコールで、正規化したパスの上位が/mnt/cだったらWindowsのファイルシステムを見に行き、それ以外だった場合はUbuntu on Windowsのファイルシステムのパスを見に行くようにする処理を入れてあるのだと考えられる。そうすることによって、UbuntuとWindowsのファイルシステムの双方にアクセスすることを実現させているのだろう。

3. Ubuntuの中身は、C:\Users\ユーザ\AppData\Local\lxss\rootfs\に展開されている

Ubuntu on Windows(Windows Subsystem for Linux)がFreeBSD Jailと同じ仕組みなら、Ubuntu on Windowsで見えているUbuntuのファイルシステムは、実際にはWindowsのファイルシステムの上に展開されているはずだ。Ubuntu on Windowsは、ユーザーごとにインストールしているので、C:\Users\《ユーザー名》\の下のどこかにまるごと展開されているのだと予測できる。

ということで、find(1)コマンドで検索してみよう。

find(1)コマンドでUbuntu on Windowsがインストールされている場所を探す

どうやら、「C:\Users\《ユーザー名》\AppData\Local\lxss\rootfs\」にUbuntu本体が展開されているようだ。

C:\Users\《ユーザー名》\AppData\Local\lxss\rootfs\にUbuntu on Windowsの中身が展開されている

Windows側のファイルシステム上に展開されているので、ファイルエクスプローラからも中身を確認することができる。

Windowsファイルシステム上に展開されたUbuntu on Windowsの中身

これを見るに、Ubuntuの中身をWindowsファイルシステムに展開し、Ubuntu on WindowsからはC:\Users\《ユーザー名》\AppData\Local\lxss\rootfs\が/として見えるように、システムコールレベルで差し替えてリソースを隔離していると思われる。つまり、システムコールレベルで正規化されたパスの頭が/mnt/cから始まっていればC:\を見に行くし、それ以外の場合にはC:\Users\《ユーザー名》\AppData\Local\lxss\rootfs\以下を見に行くという仕組みだ。

そのほか、プロセスのようなリソースも分離しているように見える。やはり、仕組みとしてはFreeBSD JailとLinuxバイナリ互換機能がやっていることとほとんど同じということで間違いないだろう。

4. Windowsファイルのパーミッションは変更できない

ちなみに、Ubuntu on Windowsの中からどの程度ホスト側に影響を与えられるのか、試しにUbuntu on WindowsからWindows側のファイルシステムのファイルを調べてみよう。

Ubuntu on WindowsからWindows側のファイルシステムのファイルをチェック

同じファイル(hoge.txt)は、ファイルエクスプローラ側からも確認できる。

同じファイル(hoge.txt)は、ファイルエクスプローラ側からも確認できる

ここで、このファイルのパーミッションを変更しようとchmod(1)コマンドを実行しても、まったく反映されない。ファイルのコピーや削除は可能だが、Ubuntu on Windows側からWindows側のファイルシステムのパーミッションは変更できないのだ。もしかしたら将来的には変更できるようになるかもしれないが、今のところパーミッションに関してはWindowsとUbuntu on Windowsで相互利用できるようにはなっていないようである。

5. 今回のおさらい

今回のおさらいは、次のとおりだ。

  • Ubuntu on Windowsの中身はC:\Users\《ユーザー名》\AppData\Local\lxss\rootfs\に展開されている
  • Ubuntu on WindowsからはWindowsファイルシステムは、/mnt/c/以下に見える
  • Ubuntu on WindowsからWindowsファイルシステム上にファイルを作ったり、削除したりできる
  • Ubuntu on WindowsからWindowsファイルシステム上のファイルのパーミッションは変更できない

まだ推測の域を出ない部分も多いが、Windowsファイルシステム側のファイルをUbuntu on Windowsからfind(1)コマンドで検索できるなど、便利な側面もいくつか見えてきている。これは、思いのほかいろいろ便利に利用できそうだ。