今夏に予定されるWindows 10のアップデートにより、UbuntuがWindows 10上で動作するようになるわけだが、それを実現するための技術概要がChannel 9で発表された。Windows向けの特徴が多少入っているが、基本的にはFreeBSDのLinuxバイナリ互換機能のように、多くのOSが実装しているシステムコールの差し替えが根底技術になっていることが説明されている。今回は、その仕組みについて説明しよう。

1. Windows Subsystem for Linux: Architectural Overview

Windows Subsystem for Linuxの仕組みを知りたくて、英語の動画と多少の技術的な話に抵抗がないなら、「Windows Subsystem for Linux: Architectural Overview - Channel 9」に掲載されている動画を見てもらうのが手っ取り早い。21分強の動画で、Windows Subsystem for Linuxが基本的にどういった仕組みで動作しているのかが説明されている。技術的と言っても、概要の話に終始しているので、それほどコーディングにくわしくなくても大丈夫だ。

Channel 9の「Windows Subsystem for Linux: Architectural Overview」の記事ページ

動画の説明によれば、Windows 10でUbuntuを動作させようというこの仕組みは、次の3つの主要コンポーネントで構成されている。

  • ユーザモード Lx Session Manager
  • ユーザモード User Mode Ubuntu
  • カーネルモード lxss.sysおよびlxcore.sysドライバ

「ユーザモード」というのは、通常のアプリケーションやソフトウェアを連想してもらえればよいだろう。一方、「カーネルモード」というのはWindowsカーネル側で動作しているものだと考えてもらえればよい。動画の前半では、なぜWindowsにはユーザモードとカーネルモードという2つの異なる特権状態が用意されているのかという説明もある。現在広く活用されているOSでは、一般的な構造だ。

lxss.sysドライバおよびlxcore.sysがこの技術の根幹に当たる部分で、LinuxカーネルシステムコールをWindows NTカーネルのシステムコールに差し替えて処理を行っている。この部分は1からクリーンな状態で実装されたものだそうだ。多分、ライセンス問題などの懸念を抱かれたくないので、あえて説明しているのだろう。

ユーザモードで動作するのは、管理や処理に必要になるプロセスだ。lxss.sysドライバやlxcore.sysだけでは足りない部分をユーザランド側のプロセス(サービス)で処理しているようだ。こうした構成も、比較的よくとられる方法だ。

2. lxss.sysおよびlxcore.sysカーネルモードドライバ

Windows Subsystem for Linuxは、基本的にLinuxカーネルのシステムコールをWindows NTカーネルのシステムコールに差し替えて実行する技術だと言えそうだ。ソースコードが読めるわけではないので真実のほどはわからないが、説明によると、例えばfork(2)、open(2)、kill(2)といったシステムコールは、それぞれNtCreateProcess、NtOpenFile、NtTerminateProcessといったWindows NTカーネルのシステムコールに差し替えられて実行されることになるようだ。仕組みから考えても、それが妥当だろう。

UNIX系のOSであれば、大体POSIXに規定されているようなシステムコールは実装されているので、このあたりの差し替えは簡単だ。あとは足りない部分を新しく実装したり、別のシステムコールに置き換える処理を入れたりすればよい。Windows NTカーネルのシステムコールはPOSIX(Portable Operating System Interface)に規定されているシステムコールとは系統が異なるが、だいたい同じようなシステムコールがあるようだ。

Microsoftは以前、WindowsでUNIX系のソフトウェアを動作させるためのソフトウェアパッケージを提供していたが、仮想化環境「Hyper-V」が導入された辺りから積極的には提供しなくなり、代わりに仮想環境で動作させてほしいという態度をとってきた。今回のWindows Subsystem for Linuxで、最初の取り組みに戻ってきたような印象がある。具体的なことはわからないが、当時の開発の成果物なども利用されているのではないかと思われる。

3. ユーザーごとにLinuxインスタンスを生成

例えば、ユーザーがシステムにログインしてから初めてbashを実行しようとすると、Lx Session Managerを経由してUser mode UbuntuをベースとしたLinuxインスタンスが作成される。このインスタンス上でinit(8)プロセスが実行され、Linuxのプロセスを実行するのに必要となる準備が整えられる。このインスタンスは、ユーザーごとに作成されるようだ。

FreeBSDのようにUNIX系のOSがホスト側になっている場合は、こうした処理は必要ない。すでにホストが同様の環境を提供しているからだ。WindowsはUNIX系のOSとはこの辺りの仕組みが異なるので、個別にLinuxが動作するためのインスタンス作成して下準備をするようだ。

Lx Session Managerは、こうしたLinuxバイナリの実行に必要になるほかのプロセスのライフサイクル管理なども実施しているという。また、ファイルパーミッションやプロパティなど、LinuxとWindowsで概念そのものが大きく異なる部分は、今のところ相互に機能するようにはなっていないそうだ。この辺りは、今後の開発次第といったところではないかと思う。前回取り上げた内容とも合致している部分だ。

4. 優れた性能と今後の開発予定

Windows Subsystem for Linuxは、システムコールを差し替えて実行するタイプのエミュレータのような、もしくは互換機能のようなものを実行するためのシステムだ。ハイパーバイザや仮想化機能のように、ハードウェアをエミュレートするシステムと比較すると、パフォーマンスが優れているという特徴がある。動画の中でも、Windows Subsystem for Linuxが優れた性能を上げていることに触れている。

この技術がもたらす利便性は、どこまで包括的にシステムコールをカバーできるかに依存している。現在のところ、いくつかのコマンドやソフトウェアは、想定しているようには動作しない。未対応のシステムコールがあるためだが、動画の説明によれば、特に要求の高いシステムコールから順に実装を進め、きちんと動作するソフトウェアを増やしていくという。

Windows Subsystem for LinuxがこれまでMicrosoftが提供していた仕組みと抜本的に異なるのは、Linux(Ubuntu)のユーザランド部分をCanonicalが提供しているという点にある。Microsoftは、Linuxカーネルが提供する機能に注力して機能を提供し続ければよく、Ubuntuのユーザランド部分のアップデートに関しては、まるごとCanonicalや周辺のエコシステムに任せればよい。相互互恵関係、Win-Winの関係ができていることになる。

5. 今回のおさらい

今回のおさらいは、次のとおりだ。

  • Windows Subsystem for Linuxでは、LinuxカーネルシステムコールをWindows NTカーネルシステムコールに差し替えることで、Linuxコマンドを動作させている
  • ハイパーバイザのような仮想化技術と比較して、優れたパフォーマンスを発揮できる
  • 今後は、足りていない機能のうち要望の高い機能(システムコール)を順次実装していく

本当の活用は夏のWindows 10アップデートが提供された後になるが、思った以上にわくわくできる状況になってきているようだ。今後の展開が楽しみである。