仮想マシンではなく、Windows環境とUbuntu環境が同時に動く仕組み
Buildで発表された「Bash on Ubuntu on Windows」とは?
2016年04月06日 07時00分更新
「BashがWindowsにやって来る(Bash coming to Windows)」。Build 2016の基調講演で、マイクロソフトのケビン・ギャロ氏はそう宣言した。今夏に予定されているWindows 10の次期メジャーアップデート「Windows 10 Anniversary Update」でそれが実現するという。
Bashだけでなく、多数のオープンソースツールがネイティブで動作する
「これは仮想マシンでも、(Cygwinのような)クロスコンパイルしたツールでもない。新しいWindowsサブシステムの“魔法”によって、Ubuntuのネイティブバイナリがそのまま動作する」(ギャロ氏)
ギャロ氏の短いデモでは「Windows上でBashが動作する」ことだけが強調されたが、実際にはBashだけでなく、Ubuntuが提供するユーザーモードアプリケーション(ELFバイナリ)の多くがそのまま動作するという。実際、ギャロ氏のデモにおいても、Bashから起動したEmacsやsshクライアントが動作していた(言うまでもなく、これらはBashとは独立したバイナリである)。
ギャロ氏によると、この“Ubuntu on Windows”環境は、Windowsストアから直接パッケージをダウンロード/インストールできるようになるという。さらにインストール後は、Ubuntuのapt-getコマンド(パッケージ管理コマンド)を使って、vi/vim、Python、Ruby、GCC、gitなど、Ubuntuが提供する豊富なOSSアプリケーション群を追加することも可能だ。
Ubuntuの開発を主導する英カノニカルのダスティン・カークランド(Dustin Kirkland)氏は、自身のブログ投稿で“Ubuntu on Windows”のパッケージ化を手がけたことを明らかにし、Windowsエクスプローラーで表示したスクリーンショットを掲載している。
このスクリーンショットを見ると、Ubuntuのルートファイルシステムは、Windows側から見れば「C:\Users\[ユーザー名]\AppData\Local\Lxss\rootfs\」以下に(隠しフォルダとして)展開される。一方で、Ubuntu側からはここがルート(/)になる。なお、Ubuntu側からWindowsのファイルシステムにアクセスしたい場合は、「/mnt/C(Cドライブ)」などのディレクトリをたどればよい。
カークランド氏によれば、現在のパッケージはUbuntu 14.04 LTSベースで作成したものだが、数週間後には最新版であるUbuntu 16.04 LTSのパッケージ化も完了するという。
Windowsサブシステムの正体は“通訳者”である
カークランド氏は、マイクロソフトのギャロ氏が“魔法”と称した「Windows Subsystem for Linux」の仕組みについても簡単な説明を加えている。
マイクロソフトが開発したこのWindowsサブシステムは、Ubuntuのユーザーモードバイナリが発するLinuxのシステムコールを、リアルタイムにWindows OSのシステムコールへと変換してWindowsカーネルに伝える役割を果たす。“Linuxの言葉(システムコール)”を理解する“通訳者(サブシステム)”が仲介することで、Ubuntuのバイナリを修正することなくWindows環境で動作させることができるわけだ。
上述の仕組みを考えると、サブシステムにおける“翻訳”処理のオーバーヘッドが気になるだろう。しかしカークランド氏は、「Sysbenchによるベンチマークでは、CPU/メモリ使用率やI/Oパフォーマンスは(ベアメタルのLinuxマシンで動作させる場合と)ほぼ同等だった」と証言している。少なくとも、仮想マシンでUbuntuを立ち上げ、バイナリを実行するよりはずっと負荷が少ないと考えてよさそうだ。
マイクロソフトのスコット・ハンセルマン氏も、自身のブログ投稿の中で、Cygwinとは違ってLinuxバイナリがそのまま動作し、しかも仮想マシンとは異なり動作は軽量だと述べ、これまでの手法とは異なることを説明している。