「和解せよシリーズ」を発表、佐伯学哉氏
佐伯学哉氏(以下、佐伯):「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と和解できました、という話です。