7/12/2017

ユニカーネルとは

昨年、DockerがUnikernel Systems社を買収したことで注目されているユニカーネル。アプリの動作に必要な機能のみで作ったソフトウェアを、ハイパーバイザやハードウェアの上で直接動作させてしまおうという野心的な試み。Wikipediaより

ユニカーネル(Unikernel)は、ライブラリ・オペレーティング・システムを使って構築された専門化した単一のアドレス空間マシン・イメージである。[1][2] 開発者は、モジュラー・スタックからアプリケーションを実行するために必要なOS構造に対応するライブラリの最小セットを選択する。次に、これらのライブラリは、LinuxやWindowsのようなOSを介在させることなく、ハイパーバイザあるいはハードウェア上で直接動作するよう、確定された固定目的のイメージを構築するためにアプリケーションや設定コードでコンパイルされる。

ライブラリ・オペレーティング・システム

ライブラリ・オペレーティング・システムでは、保護境界は最下位のハードウェア層に押し込められ、その結果次になる:

  1. ハードウェアを駆動する、あるいはネットワーク・プロトコルを話すために必要なメカニズムを実装する一連のライブラリ
  2. アプリケーション層でアクセス制御と分離を実行する一連のポリシー

そのようなシステムの初の試みは、1990年代のExokernelNemesisだった。

ライブラリOSのアーキテクチャは従来のOSデザインと比較して、いくつかの利点と欠点を有する。利点の一つは、単一のアドレス空間のみなので、ユーザ空間とカーネル空間の間をデータが移動するために権限の遷移を繰り返す必要がないことである。従って、ライブラリOSはユーザモードやカーネルモード間の遷移が不要なため、ハードウェアに直接アクセスすることで性能向上ができる(従来のカーネルでは、この遷移は単一のTRAP命令[3]からなり、コンテキスト・スイッチ[4]と同じではない)。これは、従来のオペレーティング・システムではゼロコピー・デバイス・ドライバでも可能だが、ユーザ空間とカーネル空間の間でデータコピーを廃止することで性能の向上が実現されている。

欠点は、分離が無いため、ライブラリOSで複数のアプリケーションを並べて実行しようとすると、強いリソース分離を持つため、複雑になる[5]可能性がある。更に、ライブラリOSを実行する特定のハードウェアにはデバイス・ドライバが必要である。ハードウェアが急速に変化するため、これを最新に保つためにドライバを定期的に書き直す負担が生じる。

OSの仮想化は、ハードウェアのコモディティ化でこれらの欠点のいくつかを克服できる。最新のハイパーバイザは、仮想マシンにCPU時間と強力に分離された仮想デバイスを提供する。仮想マシンとして動作するライブラリOSは、これらの安定した仮想ハードウェア・デバイス用のドライバを実装すれば十分で、実際の物理ハードウェアを駆動するのにハイパーバイザに依存できる。しかし、従来のオペレーティング・システムのサービスを置き換えるには、プロトコル・ライブラリはまだ必要である。これらのプロトコル・ライブラリを作成することは、今のライブラリOS[1]を実装する際の作業の大部分を占めている。更に、ハイパーバイザ頼みはユニカーネルとハイパーバイザ間を切り換える時、あるはハイパーバイザ仮想デバイス間でデータをやり取りする時に、性能のオーバーヘッドを再導入(reintroduce)してしまうかも知れない。

メリットと欠点

ユニカーネルは従来のオペレーティング・システムと比較すると、メリットと欠点がある。

セキュリティの改善
デプロイされるコード量を減るので、ユニカーネルは必然的に攻撃面の可能性が減少し、従ってセキュリティ特性が向上する[6][7]
省スペース
ユニカーネルは従来のOSを使用した同等のコードベースのサイズの約4%であることが示されている[8]
システム全体の最適化
構成の性質上、デバイス・ドライバとアプリケーション・ロジック全体でシステム全体の最適化を実行することができ、それによって専門性を高められる[9][10]
短い起動時間
ユニカーネルは、要求がタイムアウトする前に、次の要求に応答する時間内に非常に迅速に起動することが普通に示されている[11][12][13]

これらのメリットは、サービス指向またはマイクロ・サービス・ソフトウェア・アーキテクチャに従ったシステムの構築に役立つ。

しかし、高度な専門性は、ユニカーネルが従来のオペレーティング・システムで使用される汎用目的のマルチユーザ・コンピューティングには不向きであることを意味する。追加機能を加えたり、コンパイルされたユニカーネルを変更するのは一般的に不可能で、代わりのやり方は、望ましい変更意を持つ新しいユニカーネルをコンパイルしてデプロイすることである。

今の実装

成熟度の異なるユニカーネルの構築には、数多くの新しいやり方がある。

ClickOS
ClickOS[10][14]は、オープンソースの仮想化に基づく高性能で仮想化されたソフトウェア・ミドルボックス・プラットフォームである。初期の性能分析は、ClickOS VMが小さく(5MB)、起動が速く(わずか20ミリ秒)、低遅延(45マイクロ秒)、安価なコモディティサーバに10Gbパイプを飽和させると同時に100を超える性能を発揮することを示している
Clive
Clive[15]は、Goプログラミング言語で書かれた分散型及びクラウド・コンピューティング環境で動作するよう設計されたオペレーティング・システムである
Drawbridge
Drawbridgeは、アプリケーションのサンドボックス化のための新しい仮想化形式の研究プロトタイプである。Drawbridgeは、最小限のカーネルAPI面を備えたプロセスベースの分離コンテナであるピコプロセスと、ピコプロセス内で効率的に動作するようエンライトン(啓発された)WindowsバージョンのライブラリOSという2つのコア技術を組み合わせている[16]
Graphene
Graphene[5][17]は、マルチプロセス、サーバ型あるいはシェル型のレガシーアプリの安全性にフォーカスするLinux互換のライブラリ・オペレーティング・システムである。Grapheneは、シンプルなパイプライクなストリームで調整されるプロセス間抽象化(例えば、シグナル、メッセージ・キュー、セマフォ)で、複数のピコプロセスにまたがるマルチプロセス・アプリケーションに及ぶ。複数のセキュリティ原則を持つアプリケーションには、Grapheneは安全ではないピコプロセスを動的にサンドボックス化できる
HaLVM
Haskell軽量仮想マシン(HaLVM)は、開発者がXenハイパーバイザ上で直接実行できる高水準、軽量のVMを記述できるGlasgow Haskell Compilerツールパッケージを移植したもの
HermitCore
HermitCore[18]は、HPCとクラウド環境のスケーラブルで予測可能なランタイム動作をターゲットにした新しいユニカーネルである。HermitCoreは、メッセージ・パッシング・ライブラリとしてCC++FortranGoPthreadsOpenMP、iRCCE[19]をサポートする。マルチカーネル手法を拡張し、ユニカーネルの機能と組み合わせる研究プロジェクトである。HermitCoreは、KVMハイパーバイザ上で直接実行できる上に、x86_64アーキテクチャ上でネイティブにも実行できる
IncludeOS
IncludeOSは、クラウドサービスのための最小限のサービス指向のオープンソースのライブラリ・オペレーティング・システムである。今のところ、仮想ハードウェア上でC++コードを実行するための研究プロジェクトである
LING
LING[20]は、Erlang/OTPに基づくユニカーネルで、.beamファイルを理解する。開発者は、Erlangでコードを作成し、LINGユニカーネルとしてデプロイできる。LINGはベクトルファイルの大部分を削除し、3つの外部ライブラリのみを使用し、OpenSSLは使わない
MirageOS
MirageOS[21]は、様々なクラウド・コンピューティングやモバイル・プラットフォームに渡る安全で高性能なネットワーク・アプリケーションのためのユニカーネルを構築するクリーン・スレートなライブラリ・オペレーティング・システムである。現在、100以上のMirageOSライブラリ[22]があり、幅広いOCamlエコシステム内に互換性のあるライブラリが増えている
OSv
OSvは、Cloudius Systems[23]のクラウドVMに特別に設計された新しいOSである。1秒未満で起動できるOSvは、あらゆるハイパーバイザ上で単一のアプリケーションを実行できるよう設計されており、優れた性能、スピードと容易な管理を実現する。そのままLinuxの実行ファイルを実行でき(いくつかの制限はある)、CC++JVMRubyNode.jsのアプリケーション・スタックもサポートされている
Rumprun
Rumprunは、既存の未修正のPOSIXソフトウェアをユニカーネルとして実行できるようにするソフトウェア・スタックである。Rumprunは、裸のARMハードウェアからXenなどのハイパーバイザまで複数のプラットフォームをサポートしている。ファイルシステム、POSIXシステムコール・ハンドラ、PCIデバイス・ドライバ、SCSIプロトコル・スタック、virtio、TCP/IPスタックなど、フリーで移植可能で、コンポーネント化されたカーネル品質ドライバを提供するランプ・カーネル(rump kernels)をベースにしている[24]
Runtime.js
Runtime.jsは、クラウド用のオープンソースのライブラリ・オペレーティング・システムで、JavaScript VM上で動作し、アプリケーションにバンドルされ、軽量でイミュータブルなVMイメージとしてデプロイされる。Runtime.jsは、V8 JavaScriptエンジン上に構築され、現在QEMU/KVMハイパーバイザをサポートする

参考文献

  1. "Unikernels: Rise of the Virtual Library Operating System". Retrieved 31 August 2015.
  2. "Unikernel.org". Unikernel.org. Retrieved 1 December 2015.
  3. Tanenbaum, Andrew S. (2008). Modern Operating Systems (3rd ed.). Prentice Hall. pp. 50–51. ISBN 0-13-600663-9. . . . nearly all system calls [are] invoked from C programs by calling a library procedure . . . The library procedure ... executes a TRAP instruction to switch from user mode to kernel mode and start execution ...
  4. コンテキストスイッチ#ユーザーモードとカーネルモードの切り替え
  5. Chia-Che, Tsai; Arora, Kumar-Saurabh; Bandi, Nehal; Jain, Bhushan; Jannen, William; John, Jitin; Kalodner, Harry; Kulkarni, Vrushali; Oliviera, Daniela; Porter, Donald E. (2014). "Cooperation and Security Isolation of Library OSes for Multi-process Applications" (PDF). Proceedings of the Ninth European Conference on Computer Systems (EuroSys). doi:10.1145/2592798.2592812.
  6. "Why Unikernels Can Improve Internet Security". Retrieved 31 August 2015.
  7. Madhavapeddy, Anil; Mortier, Richard; Charalampos, Rotsos; Scott, David; Singh, Balraj; Gazagnaire, Thomas; Smith, Steven; Hand, Steven; Crowcroft, Jon (March 2013). "Unikernels: Library Operating Systems for the Cloud" (PDF). SIGPLAN Notices (ASPLOS 13). 48 (4). doi:10.1145/2499368.2451167.
  8. Kaloper-Meršinjak, David; Mehnert, Hannes; Madhavapeddy, Anil; Sewell, Peter (2015). "Not-Quite-So-Broken TLS: Lessons in Re-Engineering a Security Protocol Specification and Implementation". Proceedings of the 24th USENIX Security Symposium (USENIX Security 15).
  9. Madhavapeddy, Anil; Mortier, Richard; Sohan, Ripduman; Gazagnaire, Thomas; Hand, Steven; Deegan, Tim; McAuley, Derek; Crowcroft, Jon (2010). "Turning Down the LAMP: Software Specialisation for the Cloud" (PDF). Proceedings of the 2Nd USENIX Conference on Hot Topics in Cloud Computing.
  10. Martins, Joao; Mohamed, Ahmed; Raiciu, Costin; Huici, Felipe (2013). "Enabling Fast, Dynamic Networking Processing with ClickOS" (PDF). Proceedings of the Second ACM SIGCOMM Workshop on Hot Topics in Software Defined Networking. doi:10.1145/2491185.2491195.
  11. "Just-in-Time Summoning of Unikernels (v0.2)". Magnus Skjegstad. Retrieved 30 August 2015.
  12. "Zerg". Zerg — an instance per request demo. Retrieved 30 August 2015.
  13. Madhavapeddy, Anil; Leonard, Thomas; Skjegstad, Magnus; Gazagnaire, Thomas; Sheets, David; Scott, David; Mortier, Richard; Chaudhry, Amir; Singh, Balraj; Ludlam, Jon; Crowcroft, Jon; Leslie, Ian (2015). "Jitsu: Just-In-Time Summoning of Unikernels" (PDF). the 12th USENIX Conference on Networked Systems Design and Implementation (NSDI). ISBN 978-1-931971-218.
  14. "ClickOS and the Art of Network Function Virtualization" (PDF). Retrieved 31 August 2015.
  15. "The Clive Operating System" (PDF). Retrieved 31 August 2015.
  16. "Drawbridge". Microsoft Research. Retrieved 30 August 2015.
  17. "Graphene library OS". Stony Brook University. Retrieved 31 Jan 2016.
  18. "HermitCore – A Unikernel for Extreme-Scale Computing". Retrieved 8 June 2016.
  19. "iRCCE: A Non-blocking Communication Extension to the RCCE Communication Library for the Intel Single-Chip Cloud Computer" (PDF). Retrieved 8 June 2016.
  20. "Erlang on Xen: at the heart of super-elastic clouds". Retrieved 31 August 2015.
  21. "MirageOS: A programming framework for building type-safe, modular systems". Retrieved 31 August 2015.
  22. "MirageOS TROVE". Retrieved 31 August 2015.
  23. Kivity, Avi; Costa, Glauber; Enberg, Pekka; Har'El, Nadav; Marti, Don; Zolotarov, Vlad (June 2014). "OSv: Optimizing the Operating System for Virtual Machines" (PDF). 2014 USENIX Annual Technical Conference.
  24. "Rump Kernels". rumpkernel.org. Retrieved 31 August 2015.