2016年10月19日(現地時間)、MicrosoftはWindows Insider Program参加者に配信しているWindows 10 Insider Preview ビルド14951で、Windows 10とWSL(Windows Services for Linux)の相互運用性を向上させたと公式ブログで伝えている。例えばコマンドプロンプトには「findstr」、Bashには「grep」という目的が類似したコマンドを用意しているが、dirコマンドの出力結果をgrepコマンドで抽出、もしくはその逆といった操作を今回の改善で可能にしている。

WindowsコマンドとWSLコマンドをパイプ経由で同列に扱える(公式ブログより抜粋)

下図に示した図はプロセスを起動した際の入出力をまとめたものだ。1.Bash.exeはCreateLxProcess COM APIを通じてLXSS Manager Serviceと通信し、2.LXSS Manager Serviceは現在のワークディレクトリをWSLのパスに変換。この際LxCore.sysを通じてコンソールや標準入出力、標準エラーなどを整理(マーシャリング)する。3.LXSS Manager ServiceはLxBusを介してInitデーモンにメッセージを送信し、4.Initデーモンが各種整理したメッセージを元にttyファイル記述子を作成。5./bin/bashバイナリおよび次に作成するプロセスメッセージを聞くため、Initはフォークし実行する。

標準入出力や標準エラーのやりとりを実現するプロセスの概要

ここからはBash.exe(WSL)からWindowsバイナリを実行するプロセスだ。6.Windowsバイナリをフォークして実行する際は、binfmt_miscを登録し、Windows PEイメージやインタプリタを呼び出す。7.Initは現在の作業ディレクトリを変換し、LxCore.sysを通じてファイル記述子や標準入出力などを整理。8.InitはBahs.exeへ作成したNTプロセスメッセージを送信し、9.Bash.exeはファイル識別子を解除し、NTハンドルの作成と作成プロセスの指定先として標準入出力と標準エラーを指定する。

その結果としてBash上でwgetコマンドを用いて取得したHTMLファイルを、そのままメモ帳で閲覧できる

現時点では、WindowsコマンドはDrvFsパス(/mnt/c/Windows/System32)から実行しなければならず、NT環境変数およびWSL環境変数は異なる存在として扱われるなど多くの制限があり、"相互運用性"とは言い難いものの、本機能はいくつかのシェルからWindowsおよびLinuxバイナリ両者を実行できるのは、相互運用性を高める第一歩と言えるだろう。

阿久津良和(Cactus)