WindowsからLinuxのファイルにアクセスする仕組み
今後リリースされる「Windows 10 version 1903」では、「WSL」の改良と相互運用の改善が行われる予定です。その1つは「Windows(Windowsアプリ)」から「Linux」のファイルにアクセスする仕組みの追加です。
ファイルが壊れる
以前紹介したように「Windowsアプリ」から直接「Linux」のファイルにアクセスしてしまうと、そのファイルは「Linux」から正常にアクセスできなくなります。(ファイルが壊れる)
「Linux」のパーミッションや所有者及びタイムスタンプなど「Linux」固有の情報は、各ファイルのメタデータに保存されています。
これらの情報は「Windowsアプリ」から認識されず「Windowsアプリ」から直接アクセスすると、これらのメタデータは削除されてしまいます。
また「Windowsアプリ」がファイルをロックしてしまい、メタデータの更新も行えなくなります。
つまり「Windowsアプリ」から「Linux」のファイルに直接アクセスすることは許されません。
WindowsとLinuxからアクセスされるファイルを利用するには
現在の仕組みでは「Windows」と「Linux」の双方からアクセスするファイルは、「DrvFs」上に配置します。「Linux」から見るとネットワーク上に公開されている共有フォルダーや共有ボリュームにアクセスする感覚です。
なんとかして欲しい
「Windowsアプリ」から「Linux」のファイル群に直接的にアクセスしたいという要望が数多く挙げられました。「Windows 10 version 1903」ではこの状況が改善されます。
「Windowsアプリ」から「Linux」のファイル群にアクセスできるようになります。
(改善であって解決ではありません。)
ファイルエクスプローラーからアクセスしてみよう
「Linux」を起動し、「Linux」から以下のコマンドを実行します。
explorer.exe .
「Linux」のカレントディレクトリーをファイルエクスプローラーで開くコマンドです。
このコマンドを実行すると、ファイルエクスプローラーは「Linux」のカレントディレクトリーを表示します。
つまり「Windowsアプリ」から「Linux」のファイル群にアクセスしている状況です。
この状態では、「Windowsアプリ」から一連のファイル操作が可能になります。
ファイルのドラッグ&ドロップやコピー&ペースト、ファイルに関連付けられたアプリの起動など、「Windowsアプリ」で広く利用されているファイル操作が可能です。
もちろん「Linux」のファイルが壊れることもありません。
9Pプロトコルファイルサーバーによる仕組みの実現
今回新たに提供される仕組みは、9Pプロトコルファイルサーバーにより実現されています。「Windowsアプリ」から見るとネットワーク上に公開されている共有フォルダーや共有ボリュームにアクセスする感覚です。
このサーバーが「Windowsアプリ」から要求される各種ファイル操作を処理します。
WSL init daemonの修正
「WSL init daemon」は9Pサーバーを含むように修正されました。このサーバーはLinuxのパーミッションなどLinux固有のメタデータをサポートするプロトコルを含んでいます。
また「WSL」のインスタンス内部で動作している9Pサーバーにアクセスし、クライアントとして振る舞うWindowsサービス及びドライバーも提供しています。
「WSL」は以前から「AF_UNIX」をサポートしており、クライアントとサーバーの通信は「AF_UNIX」を利用して行います。(ソケットによる通信)
Linuxファイルへのアクセスパス
「Windowsアプリ」からLinuxのファイルへアクセスするには、以下のパスにアクセスします。
\\wsl$\ディストリビューション名\
またパスが分かっているので、スクリプト等からLinuxのファイルへアクセスすることも可能です。
既知の課題と注意事項
既知の課題と注意事項です。1.Linuxを起動する必要がある
「Windowsアプリ」からLinuxのファイルにアクセスするためには、「Linux」側で9Pサーバーを起動しておく必要があるため、事前にアクセスしたいディストリビューションを起動しておく必要があります。これは現時点での制約であり、将来的に起動していないディストリビューションのファイルへのアクセスもサポートする計画があります。
2.ネットワークリソースと同じ扱い
Linuxのファイルへのアクセスは、ネットワークリソースへのアクセスと同じ扱いになります。そのためネットワークリソースへのアクセスと同じルールが課されます。
例えばコマンドプロンプト(CMD)は「UNC」パスをカレントディレクトリーとして扱えないため、「cd \\wsl$\Ubuntu\home」コマンドは動作しません。
一方で「\\wsl$\Ubuntu\home\somefile.txt C:\dev\」といったファイルのコピーなどは動作します。
3.直接アクセスは引き続き不可
「Windowsアプリ」から9Pサーバーを経由せず、直接「Linux」のファイルにアクセスしてしまうと、そのファイルは「Linux」から正常にアクセスできなくなります。この制約は従来と同じです。
つまり「AppData」内の各ディストリビューションのファイルに「Windowsアプリ」から直接アクセスしないでください。