Windows で Ubuntu のバイナリパッケージがネイティブに動作
Windows 10 Anniversary Update の目玉である Ubuntu On Windows。当初「Bash が使える」っていうニュースばかりでスルーしている人も多いと思いますが、Windows NT 系で昔から実装されている POSIX 互換 API を使って Linux のバイナリを動作させる技術です*1。ネイティブに Ubuntu のバイナリが実行できるので高速です(API 変換のオーバーヘッドはあるはずですが)。
VMware のように仮想マシンを起動する必要もなく、10年ぐらい前に流行った coLinux のように別途サービスを起動する必要もありません。Microsoft と Canonical がコラボして Windows に Ubuntu のフルセット機能を提供してくれるという大盤振る舞い。これが熟成してくると Cygwin や MinGW を使うシーンが減っていきそうです。
ディベロッパーが Mac から Windows マシンにスイッチする流れが
Ubuntu on Windows がカバーする領域は、
- Linux ネイティブ技術での Web アプリ開発 (Rails とか Node.js とか Perl とか Python とか) をやりたい
- Rust とか Julia のような LLVM の最新言語を使いたい
- clang や GCC のツールチェインを使いたい
- Hadoop とか Spark などの OSS の分散処理系の開発をしたい
などのユースケースです。これまでは Windows なら VMware や VirtualBox の仮想マシン使ってたところをほぼネイティブに近い使い勝手(起動の速さやフットプリントの小ささ)に置き換える技術ということができます。マシンの増強をしなくても良いのです*2。Web デベロッパーは MacBook Pro/Air で Homebrew / MacPorts のようなパッケージ管理システムで開発環境を整えるのが一般的でしたが、今後は Windows ラップトップも有力な選択肢になっていくでしょう。iOS / macOS アプリ開発者以外は積極的に Mac を選ぶ理由がなくなります。
WIndows で Ruby や MySQL など Unix 由来のテクノロジーを使う場合、これまでは個別にインストーラーをダウンロードしなければならず、Linux 版との挙動の違いや機能制限に悩まされました。今後はそのようなことで消耗する必要ははなくなるはずです。
開発環境が OS X(macOS) でプロダクション環境が Linux という場合、どうしても開発時には気づかない環境の差異が表面化することもありますが、開発時点から Linux 環境であればそのようなリスクも少ないでしょう。
導入の流れ
Windows 10 Anniversary Update を導入後*3、設定で開発者モードにした上で Windows Subsystem for Linux を有効化します*4。しかしリリースされたのにまだベータ版?
コマンドウィンドウにも「ベータ」の文字が。。
本体のインストールは数分で終わります。
Ubuntu パッケージのインストール
普通に sudo apt-get install でいけます。
Emacs 動きました。
Git の Text-mode interface である tig も動きました。
自分は使ってませんが Rails のインストールもいけるっぽいです。
動作イメージ
Ubuntu サブシステムを起動するスピードはコマンドプロンプトと変わらないし、CPU やメモリの負荷も低い感じです。
前述の coLinux は仮想マシンではありませんが、ホスト側の Windows と隔離されたプロセス空間を必要としました。
この10年前のエントリでは、メモリ 512MB の ThinkPad X40 で100MBぐらい coLinux 側にメモリを配分するなど苦労しています。そういう苦労はもう過去のものです。
Ubuntu on Windows が coLinux と違うところは、Ubuntu 上のプロセスも Windows のプロセスとして認識されるところです。bash で Emacs を起動すると、タスクマネージャにも bash と emacs が表示されています。
こういうの見ると、Cygwin っぽい動作イメージに見えます*5。Cygwin との違いは Microsoft と Canonical が最適なランタイムを提供してくれるところとビルドで苦労しなくて良いところですね。
コマンドプロンプトと同じシェル環境で動くので、フォントが MSゴシックじゃないと日本語表示がちゃんとできません。あと日本語入力は効かないです。putty とかで ssh 接続すればいいのですが、OS X のターミナル感覚で使いたいのでなんとか改善してほしいところです*6。
node.js / npm も一応インストールできました。Windows で Node.js を使ってると、プロジェクトフォルダ配下の node_modules のパスが深くなりすぎてパスの長さの条件を超えてしまって詰むということがありますが、Ubuntu on Windows では大丈夫なのかとか懸念はあります。
コマンドプロンプトや PowerShell はどうなる?
Bash on Ubuntu が Windows で普通に使えるようになると、CMD.exe とか PowerShell は今後どうなっていくでしょうか? Windows のネイティブ環境のシェルスクリプティングについては、PowerShell の利便性は圧倒的であり、Ubuntu on Windows は PowerShell を置き換える存在ではないと僕は考えます。
CMD.exe にはそろそろ引退していただきたいですが。