このページの本文へ

前へ 1 2 次へ

Windows Info 第161回

Win32側からWindows Subsystem for LinuxのVolFsへのアクセスが可能に

2019年02月24日 10時00分更新

文● 塩田紳二 編集● ASCII編集部

  • この記事をはてなブックマークに追加
  • 本文印刷

WSL$の詳細を詳しく見る

 WSL$は、Plan 9のために開発された9Pというプロトコルを使っている。Plan 9は、Unixを開発したベル研究所で作られてきたOSで「Plan 9 from Bell Labs」というのが正式な名前である(この名前はカルト的な人気を誇る映画「Plan9 from Outer Space」が元ネタである)。

 Plan 9は、Unixの次の研究プロジェクトとして作られ、ファイルという形でOSの管理するリソースにアクセスできたため、9Pは単純なファイルシステム以外にも適用が可能だった。また、UnixやLinuxへのポーティングも進められていたため、すでに実績のあるコードが作られていた。

 Linux/Unixで一般的なNFSを使わなかったのは、9Pが疑似ファイルシステムなどもサポートできたこと、ファイル共有プロトコルとしては軽量だったことが理由と考えられる。もちろん、すでにLinuxに移植されていたということもあるだろう。

 そのソースコードの由来はともかく、マイクロソフトはWSLで9Pプロトコルを扱えるようにした。また、/initプロセスで9Pファイルサーバーを動作させるように改良した。これにより、WSL側は、VolFs(ルートディレクトリ以下)や/proc、/sysなどの特殊ファイルシステムを含めて、Win32側からアクセスを可能にした。

WSL$は、Win32側の9Pクライアント(リダイレクタドライバー)とWSL側の9Pサーバーから構成される。9Pサーバーは/initプロセスに含まれていると考えられる。9Pのクライアントとサーバー間はAF_UNIXによるプロセス間通信が使われる

 Win32側は、9Pプロトコルのクライアントをリダイレクタードライバーとして実装した。これは、C:\windows\system32\driversにある「p9rdr.sys」が対応している。このp9rdr.sysは、リダイレクタードライバーとして組み込まれ、ネットワークフォルダーに「wsl$」ホストを見せるようになっている。

 p9rdr.sysと/init(9Pサーバー)の間は、AF_UNIXによるプロセス間通信を使う。AF_UNIXは、ソケット(バークレーソケット)を使う場合に同一マシン内のプロセス間通信に使う「アドレスファミリー(Address Family)」である。これは、Windows 10 Ver.1803(RS4)でWindows側とWSLに実装された機能だ。このときには、何に使うのかが見えていなかったが、実はこうした用途が想定されていたというわけだ。

 利用面からいえば、これでWin32とWSLは、どちら側からもお互いのファイルシステムをアクセスできるようになった。今までは、WSLのファイルシステムにあるファイルはWSL側からしかアクセスできず、コマンドをDrvFs側(/mnt/cなど)の上で動かすことが強いられたが、今後はWSLのユーザーホームディレクトリなどにあるファイルをWin32側から簡単にアクセスできようになる。

 文字コードや行末コードにさえ注意すれば、.bashrcをメモ帳で編集するといったことも可能になるし、WSL複数のディストリビューション間でのファイル転送がWin32のエクスプローラーからも可能になった(従来はDrvFsに一旦コピーする必要があった)。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン