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を直接操作することは禁止されたままだ。
この連載の記事
-
第429回
PC
Windows Updateの「利用可能になったらすぐに最新の更新プログラムを入手する」はオンにした方がいいか? -
第428回
PC
Google/Bingで使える検索オプション -
第427回
PC
WindowsのPowerShellのプロファイルを設定する -
第426回
PC
WindowsでAndroidスマホをWebカメラにする機能を試した -
第425回
PC
無料で使えるExcelにWord、Microsoft 365のウェブ版を調べた -
第424回
PC
Windowsの基本機能であるクリップボードについてあらためて整理 -
第423回
PC
PowerShellの今を見る 2つあるPowerShellはどっち使えばいい? -
第422回
PC
Windows 11の目玉機能が早くも終了、Windows Subsystem for Android(WSA)を振り返る -
第421回
PC
進化しているPowerToys LANで接続したマシンでキーボード/マウス共有機能などが追加 -
第420回
PC
Windowsプレビュー版に搭載されたsudoを試す -
第419回
PC
Windows Insider Previewが変わって、今秋登場のWindows 11 Ver.24H2の新機能が見えてきた? - この連載の一覧へ