Windows側から、WSLのファイルにアクセスする仕組みが追加
4月に配布予定の次期Windows 10機能アップデートである「19H1」(Windows 10 Ver.1903)には、Windows Subsystem for Linux(WSL)に新機能が搭載される予定だ。
現在配布中のプレビュー版ビルド18342にその機能が搭載されている。簡単に言えば、Win32側からWSLのファイルシステム(VolFs)をアクセスする機能だ。ただし、LinuxとWindowsではファイルのアクセス管理方法がちがうため、ネットワーク共有の仕組みを使う。
形式としては、Windows Explorerのネットワークの下に仮想的なwsl$というホストが見え、その下にVolFsが見えるようになる。この新機能には名前がないため、ここでは仮にホスト名をすべて大文字にした「WSL$」と呼ぶことにする。
まずは、簡単にWSLのファイルシステムについて復習しておく。WSLにはVolFsとDrvFsの2つのファイルシステムがある。VolFsは、Linux側のストレージをNTFSの上に仮想的に実現するもの。Linux側からは、VFS(仮想ファイルシステム)を経由した通常のファイルシステムのように見える。しかし実際には、ファイルはNTFSの上にあり、ユーザーフォルダーのディストリビューションパッケージの部分に記録されている。
具体的には、
%LOCALAPPDATA%\Packages\[WSLディストリビューションフォルダ-]\LocalState\rootfs
にある。しかし、LinuxとWindowsではファイルアクセス管理が異なるため、Win32側からのVolFs実ファイルへのアクセスは推奨されず、アクセスすれば結果は保証されない。最悪の場合では、ファイルシステムを壊してしまう可能性がある。機能的にファイルへのアクセスは禁止されているわけではないが、「触るな」というのが実際のところだろう。
このため、これまではWin32側からWSLのVolFs内にあるファイルをアクセスする方法は提供されてこなかった。しかし、WSL側からはWin32側のファイルにアクセスできる。これを可能にするのがDrvFsというものだ。
WSLからは、/mnt/cディレクトリ以下にCドライブが見えるようになっている。実質上、このDrvFs側にファイルを置くことで、WSLとWin32の間で共同作業をすることはできた。ただし、WSL側とwin32側では、同じファイルでもパスが違うため、ファイルパスを渡す場合には変換の必要があった。
今回実装されたWSL$は、Windowsのリダイレクタドライバーを利用し、仮想的なホストwsl$を見せる。実際、WSL側では、サーバーが動作し、プロセス間通信(AF_UNIX)を使って、Win32側のリダイレクタードライバーとWSL側のサーバー(9Pというプロトコルを使うため仮に9Pサーバーと呼ぶ)が通信し、VolFs側のファイルをアクセスさせる。
なお、WSL側で9Pサーバーが動作するため、wsl$ホストは、WSLが動作しているときにしか見えない。Win32とWSLとの間のファイルアクセスとそのときに使うファイルシステムなどを整理したのが、以下の図だ。これまで、WSL$の部分が欠けていたわけだ。
今回のビルド18342では、WSLを起動し、エクスプローラーのネットワークを開くと、wsl$というホストが見える。その下にディストリビューション名が並び、これを開くと、個々のWSL内で動作しているディストリビューションのファイルシステムが見える。
注意したいのは、WSLが起動していないと、wsl$自体が見えなくなることだ。なお、来年春に配布予定の「20H1」(Windows Ver.2003)のプレビュー版ビルド18836にも同様の機能があるが、こちらは、エクスプローラーに「Linux」アイコンが新設されており、その下にディストリビューションへのリンクが見える。
wsl$ホスト以下のディストリビューションごとのディレクトリーを見ると、VolFsによるファイルシステムだけでなく、/procなどの疑似ファイルシステムも見えている。
マウントされているファイルシステムを見るとわかるが、Linuxの/procや/sysは通常のファイルシステムではなく、カーネルの内部データを見せるための擬似的なファイルシステムになっている。それぞれproc、sysfsという特殊なファイルシステムになっている。
なお、WSL$は、Windows側から見れば、あくまでもファイル共有である。たとえば、WSL$へのアクセスは、
\\wsl$\Ubuntu\home
などのようにUNC(Universal Naming Convention)を使ってできる。
また、cmd.exeは、UNC(//wsl$/……といったネットワークパス)をファイルパスのように扱うことはできるが、cdコマンドを実行することはできない。
本来、cmd.exeからローカルフォルダーのように扱うには、ドライブ文字を割り当てる必要があるのだが、現時点では、WSL$にドライブ文字を割り当てることはできないようだ。なお、powershellは、UNCをカレントディレクトリに設定することが可能である。また、WSL$経由でのアクセスは可能だが、依然としてVolFsを直接操作することは禁止されたままだ。

この連載の記事
-
第472回
PC
WindowsのエラーをMicrosoftに送信するテレメトリ機能を理解する -
第471回
PC
Windowsのコマンドラインでエイリアスを使う -
第470回
PC
Windows用のパッケージマネージャー「Winget」 プレビュー版で機能が充実してきた -
第469回
PC
Windows Updateの27年 悪役だった頃から改良が進んで、徐々に目立たない存在に -
第468回
PC
2025年のWindowsどうなる!? Windows Insider Programの状況をあらためて見る -
第467回
PC
Copilot+ PCのNPUでカメラを処理する「Windows Studio Effects」 その内容や効果は? -
第466回
PC
PowerToysの最近の新機能には、複数アプリを指定位置に起動する「ワークスペース」や新規作成のカスタマイズがある -
第465回
PC
WindowsのPowerShellからBluetoothデバイスを調べる -
第464回
PC
Windows 10のサポート切れまで1年を切った さてWindows 10マシンをどうする? -
第463回
PC
Windows Terminal Preview版でSixelグラフィックスを実際に表示させてみる -
第462回
PC
Windows Terminal Preview版でSixelグラフィックスを扱う - この連載の一覧へ