「和解せよシリーズ」を発表、佐伯学哉氏

佐伯学哉氏(以下、佐伯):「nullpo_head」、Takaya Saekiが、「Unikernelと和解せよ」というタイトルで発表します。

(会場の笑い声を聞いて)なんか今笑った人がいるんですけど、Unikernelはとても大事なものなので、大丈夫です。

とはいえ、今回やるのは確かに一発ネタです。僕はnullpo_headといいます。仮想化周りやOSをよくやっています。前回「デバッガと和解せよ」という発表をしたので、実は和解せよシリーズなんです。

Unikernelを使うのって腰が重くない?

いきなりですが、みなさん日々、Unikernelを使おうと試行錯誤していると思いますが、僕はしていません。していない理由はなにかというと、「Unikernel使うのって腰が重くない?」という話なんですよね。

本当はみなさんUnikernelを使いたいんですが、少しだけ面倒なので気軽に使えないんです。

どうしてかを僕が脳内でいろいろ調査してきたんですけど。まず1個目が、APIを忘れるから使いにくい。「POSIX互換だっけ?」とか。あと移植。普通のUnikernelはけっこう独自APIが必要なので、そもそもアプリケーションに移植する必要がある。

これは大変なので、もっとUnikernelを気軽に使いたいなというのが今回の話です。

UKLでRustプログラムをUnikernel OSにしてみる

UKL(Unikernel Linux)というのがあるそうです。ざっくり言うと、普通のLinuxアプリをLinuxカーネルに静的リンクしてUnikernelにする研究です。

理論上、普通のLinuxアプリが普通にUnikernelになって、あなたのアプリがOSとして動いてすごい、という研究ですね。

なので、これでUKLでRustプログラムを一瞬でUnikernel OSにできるとうれしいからやりたいというのが今回の話です。

何が起きるかというと、普通にcargoでukl buildとかをすると、あなたのRustプログラムがUnikernelになって、OSになって動き、cargo ukl bootすると、qemuでプログラムが動く。

がんばって作りました。ざっくり言ってcustom libcを差し替えるだけです。本当は--targetで動いてほしいんですが、なんやかんやあって難しかったので、cargo uklコマンドとして実現しました。

デモ

作ったので、デモします。

ところがどっこい、映らねぇ。これ、時間がすごくもったいないですね。

まず、cargo ukl newコマンドというのがあって、これで普通にcargoのプロジェクトができます。これを動かすと、「Hello, world!」が動きます。これをcargo ukl buildすると……あっ、cargoじゃなかった、悲しい(「carog」と打ち間違えていた)……ビルドが動いて……これ、遅いですねぇ!

(会場笑)

佐伯:Rustってね、コンパイルが遅いのがちょっとね、玉に瑕なんですよね。今度はいつものLinuxカーネルで出します。

(会場笑)

佐伯:普通のRustプログラムがさらに遅いビルドになるんですけど、これはすぐ終わるので。ちなみに(発表時間は)あと何秒ですか? わからない、わからない!

司会者:が、がんばれ〜!

佐伯:「がんばれ」しか言ってくれないんですね。

(会場笑)

司会者:5、4、3、2、1。

佐伯:bootします!! Linuxカーネルで動いて……。

(会場笑)

司会者:はい、ありがとうございました。

(会場拍手)

佐伯:あと3秒だけ。たぶんこれでいいので。

これ、UKLは、起動して5秒後にプログラムが動くんですね……はい!

司会者:動いた、動いた。

(会場拍手)

佐伯:Unikernelと和解できました、という話です。