2016年3月31日現在、bashというキーワードがツイッターのトレンドに挙がっています。
Ubuntu on WindowsというWindows 10でUbuntu向けバイナリを動作させる取り組みがあり、Build2016というマイクロソフトのカンファレンスでBashを動かすデモが発表されたためです。
Ubuntuを開発しているCanonicalの人とMicrosoftの人で作成されたようです。
Windows Insider Previewで公開されたので動かしてみました。
Table of Contents
1 Ubuntu on Windows
BashはUbuntu on Windows上で動作しているにすぎません。
Bashではなく、UbuntuがWindows上で動作している点が肝です。
ls等の基本コマンドやGCC等のコンパイラ、pythonコマンドも動作します。おそらく、perlコマンドやrubyコマンドも動くのでしょう。
これはシェルスクリプト、C言語、pythonで作成されたUbuntu上で提供されているパッケージがWindows上で動作することを意味します。
そして、これらは全てELFフォーマットです。
ちなみにUbuntuのバージョンはしばらくUbuntu 14.04のようです。Windows Storeからダウンロードできるようになるようです。
1.1 Ubuntuはユーザスペースのみ
Ubuntu on WindowsのUbuntuはユーザスペースのみです。
LinuxカーネルにはあってWindowsにはない機能を利用したパッケージは利用できないでしょう(KVM、perf、ftrace、cgroup等)。
1.2 コンテナではない
Webサイト等のホスティングサービスで有用なコンテナ技術とは異なるそうです。
コンテナ技術は複数のコンテナを互いに影響を与えることなく、リソースを厳密に制限して同時に動作させる目的のものです。
Ubuntu on Windowsは複数動作させる目的のものではないようです。
1.3 Wineの逆に近い
WineはWindowsアプリをLinux上で動かすフレームワークです。
WineはEXEフォーマットを解析し、Win32APIやDLLをWineが提供するAPIに置き換えてプログラムにロードします。
カーネルプロセス等のWindows固有の機能はwineserverというデーモンで代替します。
プログラムロード後は仮想マシンとは異なり、命令セットを逐一解釈しながら実行するインタプリタ形式ではありません。
Ubuntu on WindowsはELFフォーマットを解析し、LinuxのシステムコールをWindowsのものに置き換えてプログラムを実行するようです。
WindowsにはないLinux固有の仕組みとして、/dev、/proc、/sysのファイルにアクセスすることでカーネル機能を呼び出す仕組みがあります。
これらもWindows側の機能を呼び出すように変更されるのでしょう。
2 どこまでUbuntu on Windowsは動くのか
LinuxカーネルのシステムコールをテストするLTPの大部分はPASSしているようです。
プロセス一覧を出力するpsコマンド、システム全体のメモリの使用状況を出力するfreeコマンドが動作しています。
wgetコマンドでネットワーク経由でファイルを取得しています。
pythonが動いてます。
残念なことに、現在は/dev/tty周りで課題があり、screen/tmux等が動かないらしいです。
Linuxカーネル固有の機能を提供する/sysはあまり再現されないのでしょう(Windows上で動かす用途では不要ですが)。
開発環境に使うには十分な気がしますが、gdbとかどうなるんでしょう。シンボル情報もUbuntu on Windowsで変換してくれるのかな?
Webサーバも動作させることができれば、WindowsのみでWeb開発している人にも役に立つのでしょう。
3 オープンソース化の一貫なのか
LinuxカーネルにHyper-Vの準仮想化用コードをコミットしるのを知って、マイクロソフト社もオープンソースにコードをコミットするんだと思っていましたが、ここ最近のマイクロソフト社の開発物をたくさんオープンソース化しているイメージです。
自社の開発物をオープンソース化する前に、自社で採用したオープンソースのパッケージに対して、コミットしていくスタイルから始めた方が心象が良いように思います。
4 GNUのパッケージ
GNUのパッケージをマイクロソフト社の人がWindowsに持ち込むってちょっと面白いですね。
WindowsからLinux/Unixに変えろという文言はよくありますが、Windowsを使うならプロプライエタリでないソフトウェアに置き換えろというリストまでよく作るなと思います。
5 他種類のOS向けのアプリを動かす仕組みのまとめ
別の種類のOSとその上で実行されるアプリを動かす仕組みをまとめます。
5.1 QEMU-KVM / VirtualBox / Hyper-V
ゲストOSのカーネルスペースとユーザスペースの下で動作する仮想マシンをエミュレートします。
実装方法はハイパーバイザを用いるHyper-V、ホストOSのカーネルスペースに仮想マシンをエミュレートする機能を持たせるQEMU-KVMとVirtualBox、ホストOSのユーザスペースで仮想マシンをエミュレートするQEMUがあります。
ゲストOSのカーネルスペースで仮想マシンを意識する準仮想化(準仮想化ドライバ)と、意識せずに済む完全仮想化が概念としてあります。
CPUも仮想化支援機能を持っており(Intel CPUではVT)、特権命令やメモリ管理のハードウェアアクセラレーションを利用することができます。
CPUの仮想化支援機能を使いつつ、I/Oやネットワーク等の完全仮想化が苦手とする部分はは準仮想化にするものが多いです。
コンテナ技術はこれらの仮想化のオーバーヘッドが存在しません。従来のchrootのみ利用した環境と異なり、cgroupsによる厳密なリソース制御がある為、ひとつのコンテナがリソースを枯渇させることはありません。
5.2 Wine / Ubuntu on Windows
WineはEXEフォーマットのバイナリをLinux上でロード時に変換してから実行するフレームワークです。
Windowsアプリはソースコードが配布されず、バイナリのみの提供が一般的であった背景があります。
Ubuntu on WindowsはELFフォーマットのバイナリをWindows上でロード時に変換してから実行するフレームワークです。
Ubuntuのユーザスペース一式を持ってくる仕組みである為、Linuxカーネル固有の機能を直接使うものでなければ、Linuxアプリを手軽に動作させることが期待されます。
5.3 Cygwin
Linux/Unix向けのパッケージをWindowsバイナリにコンパイルしたものです。
Bashはbash.exeというEXEフォーマットのバイナリになります。
Linux/Unix向けのパッケージの大半はWindows上で簡単にコンパイルできるようになっていない為、Linux/Unixに比べて、パッケージは多くありません。