Microsoftは先日、彼らのオペレーティングシステムで、Linux ELF64バイナリをネイティブに実行できるようにするLinux Bash with Windowsを統合する意向を発表した。間違った憶測を避けるために、Windows Subsystem for LinuxチームのDeepu Thomas氏がどのようにWindows上でLinuxを実行させるかの詳細を提供した。
Windows上でどのようにLinuxが実行できるかを説明するために、最初にいくつかの概念と機能を紹介する必要がある:
Windowsユーザーモード 分離と保護のために通常のアプリケーションで使われているCPUモード。各アプリケーションはこのモードで起動されて、他のアプリケーションから変更されることがない仮想アドレススペースを持つ。また、アプリケーションがクラッシュしたときに他のアプリケーションがダウンすることがない。
Windowsカーネルモード (カーネルモード)ドライバーのようにオペレーティングシステムのコアコンポーネントによって使用されるCPUモード。このモードでは、すべてのインタラクションはコンピューターのハードウェアが処理する。このレベルのクラッシュは、システム全体をダウンさせることができてしまうため、このモードで実行されるコンポーネントとWindowsによって提供されるものは、クラッシュを避けるために可能な限り広範囲にテストされている。このMSDNの記事では、ふたつのWindowsモードの違いの詳細についてより詳細に説明している。
Windows NTサブシステム Windows NTは最初からアプリケーションから呼ばれるAPIとカーネル層が分離されて導入された。これはWindows NTにPOSIX, OS/2, Win32のような複数のサブシステムをサポートすることを可能にする。これらのサブシステムによりUNIXとOS/2アプリケーションをWindowsに移植することを容易にすることを意味する。POSIXとOS/2サブシステムは後に破棄されたが、アーキテクチャは残っている。
Pico Processとドライバー Project DrawBridgeは、プロセスベースのコンテナを提供してそのドライバーでPico Processを導入した。OSサービスとシステムコールの不足はピコドライバーのペアによって処理される軽量のソリューションである。
ユーザーモードLinux これは他のLinuxホスト上にアプリケーションとしてLinuxを実行する方法である。ハードウェアに直接アクセスする代わりに、ゲストLinuxカーネルはシステムコールをジョブとしてホストLinuxに転送する。
Linuxを実行するためにWindowsは全体的なアーキテクチャとして以下の図に示されているWindows Subsystem for Linux (WSL)を作成した:
ユーザーが、ユーザーモードでbash.exeを起動すると、LX Session Managerという関連するサービスが起動する。このサービスは、コマンドプロンプトでユーザーによって入力されるbashコマンドと、実行されるネイティブELF64バイナリとの仲介をする。Linux バイナリはCanonicalによって提供されるユーザーモードUbuntu 14.04の一部であり、ユーザーモードでpico processesを起動する。Linuxカーネルをエミュレートするふたつのドライバー-lxss.sysとlxcore.sys-はそれらのシステムコールを横取りする。ほとんどの場合、各ドライバーはLinuxカーネルコールと同様のWindowsカーネルコールにマップされるが、対応が存在しないいくつかのケースが存在する。たとえばfork()だが、Thomas氏はそれがどのように動作するかを説明する:
Linux fork() syscallは直接的に同様なWindowsのドキュメント化された呼び出しは存在しません。Windows Subsystem for Linuxでforkシステムコールが呼ばれると、lxcore.sysは、プロセスのコピーを準備しはじめます。それは正しいセマンティクスでプロセスを作成するために、内部Windows NTカーネルAPIを呼び出して、新しいプロセルのための追加データのコピーを完了します。
WSLはLinuxからアクセス可能なふたつのファイルシステムを提供する: VolFsとDriveFs。 前者は、アクセス権、シンボリックリンク、大文字小文字の区別、Windowsファイルシステムで禁止されている文字など通常のLinuxファイルシステムのようなあらゆる方法である。後者はWindowsとの相互運用性を提供するもので、ユーザーがLinuxからWindowsのすべてのボリュームを見ることを可能にする。
それは可能化されているわけではなく、WSL上で実行させるためにLinuxバイナリーを移植や再コンパイルもしていない。Linuxコマンドは仮想化ネットワークではなく、Windowsアプリケーションがしているようにローカルホストにアクセスする方法で開始した。
いくつかのベンチマークの結果、WSLは同じハードウェアで直接実行したときに近い結果をたたき出し、WSLはよい結果を出したとThomas氏は言う。
MicrosoftチームはWSL上でPythonとRuby、そしてLinux上のgccでコンパイルされたプログラムを実行したため、ほとんどが動作するが、いくつかの問題が残っている:sudoは完全に動作せず、ファイルシステムで行われるいくつかにはチューニングが必要で、MySQLの実行に関していくつかの問題があるなど。何人かのユーザーは、Javaでセマフォや共有メモリが実行できないと話している。現時点でのUserVoice WSL channelにおけるトップ3のリクエストは: スラッシュを両方の環境で使えるようにして欲しい、BashからWindowsプロセスを起動したい、WSLをオープンソースにして欲しい。
Microsoftは他のコンピュータや仮想化ソリューションに頼ることなく、特にクラウドインスタンスで実行しているひとつのWindows/Linuxマシンから運用チームがWindows上にLinuxを実行して、自分のシステムを管理できるようにこの機能を提供している。多くのシステムはクラウド上のLinuxマシンで実行されていて、opsの生活を楽にするための合点がいく。
さらに詳細はMSDN WSL概要とChannel 9ビデオのWSL: アーキテクチャ概要を確認することをお勧めする。
Rate this Article
- Editor Review
- Chief Editor Action