Dockerはコンテナベースで軽量に仮想環境を運用できますが、Dockerが2016年に買収したUnikernel Systemsが普及を目指すUnikernelは「ライブラリOS」と言われ、さらに軽量にアプリケーションを仮想化することができます。
その仕組みは、実行させるアプリケーションに必要なカーネルのライブラリのみをリンクしてハイパーバイザ上で実行可能なイメージを作成するというものです。そのサイズの小型化は凄まじく、DNSで200kBしかありません。この200kBの中には、実行に必要なカーネルライブラリが全て含まれています。逆に言うと、必要なものしか含まれていないので、外から侵入する口もほとんど開いておらず、セキュリティにも比較的強いと言えます。
そんなUnikernelの実装の一つ、Mirage OSをMacで試してみました。
Macで試す
Mirage OSのサンプルは公式ページに使い方が載っているので、それを参考に動かしてみます。
Mirage OSをMacにインストールするには、brewが必要なので、あらかじめインストールしておきます。
Mirage OSはOCamlという、関数型言語MLの方言を使っており、OCamlでプログラムします。OCamlはopamというパッケージマネージャを用いるため、brewでインストールします。
$ brew install opam
$ opam init
$ opam --version
1.2.2
私が試したopamのバージョンは上記のように1.2.2でした。
次に、opamを使ってmirageをインストールします。
その際、opamを使ってインストールしたファイルは~/.opam以下にインストールされるので、~/.opam/system/binにパスを通しておきます。
$ export PATH=$PATH:~/.opam/system/bin/
$ opam install mirage
$ mirage --version
2.9.1
mirageのバージョンは2.9.1でした。
次に、サンプル(Hello World)をダウンロードします。
$ git clone https://github.com/mirage/mirage-skeleton.git
$ cd mirage-skeleton/console
このサンプルをビルドしてみます。
$ mirage configure
[ERROR]
Failure: ocamlfind not found on path, but -no-ocamlfind not used.
なぜかエラーが出ます。ocamlfindというコマンドは~/.ocaml/system/binに入っているのですが、なぜかmirageコマンド内から参照されないようです。
これはStackoverflowを見ると環境変数の設定のようで、以下のようにすれば修正できます。
$ eval $(opam config env)
$ mirage configure
$ make
上では続いてビルドしています。
これで通常の実行可能バイナリができるので、以下のように実行できます。
$ ./mir-console
hello
world
hello
world
hello
world
hello
world
$
MirageはXen上で動作するので、本当はそうしたいところなのですが、ベアメタル環境(またはAWSなどのクラウド環境)が必要なので今回はお預け。
おまけ
導入したMirageおよびOCaml環境を消す方法。
$ opam remove -a mirage mirage-clock-unix mirage-logs
$ brew uninstall opam
でokです。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!