連載
» 2019年03月01日 05時00分 公開

Windows 10 The Latest:次期Windows 10最新動向:Windows 10からWSL上のLinuxのファイルシステムへのアクセスが可能に (1/2)

これまでWSLからWindows 10のファイルシステムへのアクセスは可能であったが、逆にWindows 10からWSLのファイルシステムへはアクセスできなかった。しかし、2019年4月にリリース予定の次期機能アップデート「19H1」では、この制限が取り除かれる。

[塩田紳二,著]
「Windows 10 The Latest」のインデックス

連載目次

 本稿では、2019年1月末から2月末にかけてのWindows 10の動きを見ていこう。

 2019年4月にリリース予定となっている次期Windows 10の機能アップデート(19H1。Ver.1903)の開発も大詰めに入っているようで、Windows Insider Previewで配布される開発バージョンに大きな機能追加や変更が行われなくなっている。既知のバグが明らかになっていることから、これらを解消して品質を向上させる程度で最終版となりそうだ。

Win32側からのWSLファイルシステムのアクセスが可能に

 Windows 10 The Latest「次期Windows 10最新動向:セキュリティ新機能『Windows Sandbox』とは?」「次期Windows 10最新動向:小容量ストレージでも機能アップグレードできる『予約済み記憶域』とは?」で紹介したように、19H1では「Sandbox」と「予約済み記憶域」が新機能として導入予定となっている。

 さらに2019年2月20日にリリースされたビルド18342では、WSL関連で強化があった。これは、Windows 10側からWSL側のファイルシステム(VolFsと呼ばれている)へアクセスする機能だ。「wsl$」という仮想的なネットワークホストを介してVolFsへのアクセスが行える。

WSLのファイルシステムへのアクセス機能 WSLのファイルシステムへのアクセス機能
ビルド18342には、WSLのファイルシステムをWin32側からアクセスする機能が搭載された。

 これまでは、WSL側に対して、DrvFsというWin32側ファイルシステムをにアクセスするための手段が提供されていたが、Win32側に対しては、WSLのファイルシステムへのアクセス手段が提供されていなかった。

 今回実装された機能(特に名称がないためここでは大文字でWSL$と表記する)は、ネットワーク共有フォルダを介してWin32側からWSL側のルートファイルシステム(VolFsと呼ばれる)へのアクセスを可能にするものだ。

 具体的には、WSL側で「/home/user」というディレクトリは、WSL$を介して「\\wsl$\<ディストリビューション名>/home/user」というパスでWin32側からアクセスが可能になる。

 これまでは、Win32側からWSLのファイルシステムにアクセスする方法がなかったため、WSL側でDrvFs側にファイルを置くといった手間をかける必要があった。また、WSLに複数のディストリビューションをインストールしている場合に、ディストリビューション間でファイルを移動させる場合にも一度、DrvFs側にファイルを置かなければならなかった。

 しかし、WSL$の搭載により、WSL側に置いたファイルをWin32から簡単にアクセスできるし、ディとスリビューション間のコピーもエクスプローラーを使って簡単に行えるようになった。

 そもそも、WSL側のファイルシステム(VolFs)にWin32側からアクセスが行えなかったのは、LinuxとWindows 10ではファイルのアクセス権管理などが違っていたからだ。そこでWSL側では、WSLが持つVolFsを使い、NTFSの拡張アトリビュートにLinuxのファイルアクセス権情報(パーミッションや所有者ユーザー番号など)を保存していた。

 Linux側を改変しないで利用するWSLでは、何らかの方法でLinux側の情報を維持しなければならないため、NTFSのファイル管理情報への変換が困難だったためだ。

 NTFSの拡張アトリビュートは、Windows 10やWindows OS側のアプリケーションでは読み書きを行うことがないため、Win32側ではファイルのアクセス権やロック状態なども知ることができず、WSLとWin32が同時にファイルを変更しようとして壊してしまう可能性があった。このため、WSLでは、VolFsに対応するWSLのファイルシステムにはWin32からはアクセスしないというルール(機能的にアクセスが禁止されているわけではない)が作られた。

WSL$によるアクセスの実際

 WSLが起動しているとき、エクスプローラーのネットワークを開くとwsl$というホストが見える。その下にディストリビューションごとの共有名が見える。

Bash上からエクスプローラーを起動可能に Bash上からエクスプローラーを起動可能に
bash上でWin32相互運用機能を使い、カレントディレクトリをエクスプローラーで開くことができる。

 WSLの各ディストリビューションのルートフォルダは、具体的には、以下のようなUNCでアクセスが可能だ。

\\wsl$\<ディストリビューション名>/

各ディストリビューションのルートフォルダのUNC

 ディストリビューション名は、「wsl.exe --list」や「wslconfig /List」コマンドで表示されるものを使う。wsl$というホストは、9Pサーバ(詳細は後述)がWSL内で動作する関係で、WSLが起動されているとき(bashが動いているとき)にしか見えない。なおビルド18346ではWSL終了後すぐにwsl$が消えずに、しばらくの間はwsl$にアクセスができる。Win32側でwsl$にアクセスしていると存在し続けるようだが、何もアクセスしていないと、消えてしまうようだ。このあたり、まだまだ挙動が変わる可能性がある。

 なお、WSL内では、Win32相互運用性を使い、エクスプローラーを直接開くことが可能だ。このとき引数としてカレントディレクトリを示す「.」を使い「explorer.exe .」とすることで、WSLのカレントフォルダを直接エクスプローラーで開くことができる。WSL$では、ネットワークアクセスと同じく、ファイルのメタ情報などは、相手側で処理されるため、エクスプローラーではローカルファイルと同じようにファイルを扱うことができる。

wsl$という特殊なホストの下に配置 wsl$という特殊なホストの下に配置
WSL側へのアクセスにはネットワーク共有を使い、wsl$という特殊なホストを開く。その下にはディストリビューションごとの共有名があり、個別にアクセスが可能。ただし、WSLの該当ディストリビューションが起動している必要がある。

 また、コマンドライン(cmd.exeやPowerShell)でもネットワークフォルダと同様にファイルを扱える。ただし、旧来からの制限でcmd.exeでは、UNC上にカレントディレクトリを移動できない(PowerShellはできる)。cmd.exe側では、こうしたネットワーク共有には、ドライブ文字を割り当てる必要がある。Net Useコマンドを使った割り当てはBuild 18346では可能だった。WindowsのPUSHDコマンドは、ネットワークの共有名を含むUNCパスに対して自動的にドライブ文字を割り当てるが、こちらも動作した。しかし、同じBuild 18346では、WSL$に対してエクスプローラーの右クリックメニューにある「ネットワークドライブの割り当て」を使って、ドライブ文字を割り当てることはできないようだ。

コマンドプロンプトからアクセス可能 コマンドプロンプトからアクセス可能
ネットワーク共有なので、UNC形式で指定すれば、コマンドライン(cmd.exe)からもアクセスが可能だ。
Net Useコマンドでドライブ名の割り当ても可能 Net Useコマンドでドライブ名の割り当ても可能
WSL$によるネットワーク共有名は、Net Useコマンドを使うとドライブ文字を割り当てることが可能だ。

WSL$の仕組み

 WSL$は、9Pと呼ばれるファイル共有プロトコルを利用する。WSL側には9Pサーバが動作し、Win32側は、9PクライアントをWindowsのリダイレクタードライバとして実装している。9Pは、「Plan 9 from Bell Labs」というOS用に作られたファイル共有プロトコルだ。

 Plan 9は、OSが管理するリソースをファイルシステム空間にマッピングするという機能を持つ。9Pが選ばれたのは、/procファイルシステムなどの疑似ファイルシステムを扱えるのが大きな理由だと考えられる。そもそもLinuxのprocファイルシステムは、Plan 9を参考に作られており、9Pとは相性がよかった。UNIX系で普及しているNFS(Network File System)では、疑似ファイルシステムへの対応が必要であること、プロトコルとしては複雑であることなどから9Pという選択になったと考えられる。

 ただし、WSL側には、9Pサーバなどはプロセスとしては見えず、おそらく、/initプロセスやLinuxカーネルを代行しているLxcore.sysなどの中に組み込まれていると考えられる。Windows OS側は、ネットワークによるファイル共有などを実現するための「リダイレクタ」という機能を使う。リダイレクタは、ファイルアクセスのときに、パス(UNC)を解釈してアクセス方法を切り替える仕組みだ。

 具体的には、「Paln 9 Redirector Driver」(C:\Windows\System32\Drivers\p9rdr.sys)というリダイレクタードライバが組み込まれており、これがwsl$ホストへ「9Pクライアント」としてアクセスを行う。なお、wsl$とドルマークの付いたホスト名を使う理由は、Windowsネットワークではホスト名に$を含むことができず、既存のホストと名前が重複することがないからだ。

WSL$機能には9Pプロトコルを利用 WSL$機能には9Pプロトコルを利用
WSL$機能には9Pプロトコルが使われ、Win32側には、9Pによるアクセスを行うための「リダイレクタードライバ」が組み込まれている。

エクスプローラーで名前がドットから始まるファイルを作成可能に

 Linuxでは、設定ファイルなどを名前が「.(ドット)」から始まるファイルに保存することがよくある。こうした「.」で始まるファイル名をエクスプローラーで付けようとすると、エラーが表示された(すでに存在するそのようなファイル名を表示することは可能)。19H1では、この点が改善され、エクスプローラーで「.」で始まるファイル名も作成可能となった。

エクスプローラーで先頭が「.」のファイルが作成可能に エクスプローラーで先頭が「.」のファイルが作成可能に
エクスプローラーで「.」で始まるファイル名も作成可能となった。Linuxなどでは、「.」で始まるファイル名がよく利用されるため、そうしたファイルがWindows 10側で簡単に作成できるようになる。

 次ページでは、19H1の目玉機能「Windows Sandbox」の初期設定ファイル機能など、新たに追加となって機能について解説していく。

       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。