再利用可能なモノリシックカーネル
Hajime Tazaki
IIJ Innovation Institute2016/04/12, IIJlab

セミナー

背景

仮想化技術の発達
リソース (計算機・ストレージ・ネットワークなど)の抽象化
物理的制約の緩和、複雑性の減少など仮想化する事で、できなかった事をできるようにする

http://ableit.ca/business-support-services/server-virtualization/
http://exelos.com/solutions/virtualization/

様々な仮想化とその用途 (ネットワーク)
手法
疑似 (仮想マシン)
名前空間分離カーネル迂回用途
多重化、隔離環境
機能追加への自由度
性能改善
軽量化、分化・専用用途
デバッグ・テスト、詳細・再現調査
大規模ネットワーク実験

モチベーション (Why)

新しい用途でも、実績のあるソフトウェアが利用したい
ネットワークスタック (618K LoC, Linux)
ファイルシステム (752K LoC, Linux)
アプリケーション (a lot)
VM は重い (再現性向上 => 機動性低下)
抽象化の場所 (プロセッサ、OS、システムコール、etc)
仮想化技術から前進させて、変形させる

Poll: "When you download and run software, how often do you use a virtual machine (to reduce security risks)?"
Jon Howell, Galen Hunt, David Molnar, and Donald E. Porter, Living Dangerously: A Survey of Software Download
Practices, no. MSR-TR-2010-51, May 2010

Poll: "When you download and run software, how often do you use avirtual machine (to reduce security risks)?"

Jon Howell, Galen Hunt, David Molnar, and Donald E. Porter, Living Dangerously: A Survey of Software Download
Practices, no. MSR-TR-2010-51, May 2010

性能と利便性の両立 ？

性能を求めるには既存の資産(コード)は障壁になる
既存の資産を生かすと、性能を犠牲にしなければならないAny problem in computer science can be solved withanother level of indirection.
(Wheeler and/or Lampson)

img src: https://www. ickr.com/photos/thomasclaveirole/305073153

モノリシックカーネルの再利用とは (What ?)Anykernel: NetBSD rump kernelに由来

We de ne an anykernel to be an organization ofkernel code which allows the kernel's unmodi ed
drivers to be run in various con gurations such as
application libraries and microkernel style servers,
and also as part of a monolithic kernel. -- Kantee
2012.

実績あるモノリシックカーネルのソースコードをそのまま利用(unmodi ed)
追加具材を糊付けし変形させ、ライブラリ化

モノリシ
ックカー
ネルの再利用とは(cont'd)

機能のアウトソース (環境依存コード)
時計メモリ
スケジュール
デバイス (NIC/ブロック) I/O
様々な実装でこの仕組みを利用
SeaStar/OSv, mTCP, LKL/LibOS, rumpkernel

として作るには、カーネル内に透過的にサブシステムを導入する必要があり
環境非依存コードCPU architecture として独立したサブシステムとしてAnykernel

Who else ?
ゼロから実装Full scratch ()Mirage [ASPLOS 2013]
IncludeOS [CloudCom 2016]
SeaStarmTCP [NSDI 2014]
porting (OS)OSv [USENIX 2014]
libuinet
SandStorm [SIGCOMM 2014]
Anykernel
NetBSD rump [USENIX 2009]UML
DrawBridge (?)

既存 の移植特定用途カーネルの作り方
full scratch

性能 既存資産 最新版追従++--+porting++/---anykernel-++++Linux Kernel Library (LKL)

Linux Kernel Library

カーネルのライブラリ
ハ ドウェア非依存のアーキテクチャ
下位ホストのインターフェースを規定
依存部をアウトソース
Windows, Linux, FreeBSDで動作
デバイスI/Oを簡素化
virtio ホスト実装
Linux カーネル内のドライバ利用
LinuxーPurdila et al., LKL: The Linux kernel library, RoEduNet2010.

歴史rump: 2007 (NetBSD)
LKL: 2007 (Linux)
DCE/LibOS: 2008 (Linux/FreeBSD)
LibOS/LKL revival: 2015
LibOS merged to LKLLKL v.s. LibOS

LKLLibOS

LKL v.s. LibOS (cont'd)
LoC:
arch/lkl (LKL) < arch/lib (LibOS)ー

スタブコ ドの量に依存
共通点
カーネルコンテキストの表現 (POSIX thread)
ホストインターフェース (時計、メモリ、スケジュール)CPU 非依存の arch として実装
他カーネルコードへの修正なし
相違点
LibOS: 高位 API (timer, irq, kthread)を pthread で再実装
LKL: pthread で IRQ, kthread, timer などを API 再実装はせずに表現

内部構造
ホストバックエンド (host_ops)
非依存アーキテクチャ (arch/lkl)
アプリケーションインターフェース

1.
2. CPU
3.

1.

ホストバックエンド

環境依存部のインターフェース
異プラットフォーム間で共通化(rump ハイパーコール like)
Virtio によるデバイスインターフェース
ブロックデバイス <=> ディスクイメージ
ネットワーク <=> TAP, DPDK, VDE

2. CPU

非依存アーキテクチャ
アーキテクチャ (arch/lkl)

アーキテクチャと同等に扱える他コードへの影響をなくす
2400 LoC
スレッド構造体 (struct thread_info) 定義
irq, timer, syscall handler を実装
下位層リソースへのアクセス(環境依存)は、host_opsにて表現
CPU

3.

アプリケーションインターフェース
Case 1: use exposed API (LKL syscall)
Case 2: use host libc (LD_PRELOAD)
Case 3: extend (alternative) libc

Case 1: use exposed API (LKLsyscall)

カーネル内のシステムコール入り口を直接 call
lkl_sys_open(), lkl_sys_socket()
通常のシステムコールとほぼ同じ復帰値、エラー番号の通知が違う
アプリケーションはこの API と、ホストの持つAPI を両方利用可能
LKL で ext4 ファイルを lkl_sys_read() =>ホスト (Windows) で write()Case 2:ホスト標準ライブラリのハ
イジャック

ホストの標準ライブラリ (libc) をLKL システムコールに実行時に置きかえ
LD_PRELOAD
socket() => lkl_sys_socket()

ホストのプログラムバイナリをそのまま利用可能
置きかえ可能なシンボルに制限あり
非 Linux ホストでのシステムコール変換は必要

Case 3: extend (alternative) libc
システムコールのみを呼びだす
標準ライブラリ
カーネルに対応して、(仮想的な)
CPU アーキテクチャ拡張
プログラムは、通常の標準ライブラリとしてリンクするシステムコールを経由して直接ホストの資源アクセスは不可
musl libc の拡張として実装
LKL

使い方 (アプリケーション)

ネットワ クシミュレータとの結合
簡易カ ネルバイパス
カ ネルコ ドを再利用したアプリケーション開発

Use Case 1:
ー
Use Case 2:
ー
Use Case 3: ーー
Use Case 4: Unikernel

Use Case 1:

ネットワークシミュレータとの結合

ネットワーク状態の調査
ns-3 ネットワークシミュレータ
多種のモデル
NIC
ノード移動
トラフィックタイミング
単一プロセスにて複数ノード動作
dlmopen(3) にて実現 (シンボル退避)Linux Multipath-TCP の実験
システムコール再実装 (ノード振り分け)
可視化
再現性 100 % (実験・バグの再現)

Use Case 1:

ネットワークシミュレータとの結合

カーネルのネットワークスタックテストツールとしても利用
Regression テスト (を複雑なネットワークで)再現率 100 % (仮想クロックを利用)
コードカバレッジ測定 (シミュレータの疑似乱数利用)
Valgrind でデバッグUse Case 2:

簡易カーネルバイパス

により、実行時にシステムコール迂回置きかえ可能なシステムコール (シンボル) に制限あり
LKL と外界 (ホストOS)の両方のシステムコールを利用可能
LD_PRELOAD

ホストカーネルに影響なく新機能を導入可能
LD_PRELOAD=liblkl-super-tcp++.so firefoxカーネルコードを再利用したアプリケーション開発

Use Case 3:

カーネルのコードを移植なしにユーザ空間でライブラリとして利用
LKL と外界 (ホストOS)の両方のシステムコールを利用可能
カーネル実装を利用したファイルシステムアクセス例： ext4 フォーマットのディスクイメージにアクセス
1. ディスクイメージを開く (CreateFile())
2. lkl_sys_mount()
3. lkl_sys_read()4.

ホストの別ファイルへ書きこみ (WriteFile())

Use Case 4: Unikernel

単一アプリケーションにリンクさせる LKL
python + LKL, nginx + LKL
LKL システムコールのみ利用可能
musl libc 移植
rump ハイパーコール利用 (frankenlibc)
OS のないホスト上でも動作 (rumprun)(on Xen Mini-OS)
Work in progress- http://www.linux.com/news/enterprise/cloudcomputing/751156-are-cloud-operatingsystems-the-next-big-thing-demos with linux kernel library

Unikernel on Linux (ping6 commandembedded kernel library)

Unikernel on qemu-arm (helloworld)

nginx (linked) LKL running on Linux

ベンチマーク

リンク (LibOS, 素の Linux)
コア
ネットワ クバックエンド (DPDK, netmap, rawソケットなど)と測定 (UDP 1024 byte パケット)
10Gbps Ethernet
8
CPUー
RTTThroughput

ベンチマーク (cont'd)
単純にカーネル迂回しただけでは速くはならない
原因
キャッシュミス
多量の(ホスト)システムコールの数

ボトルネック分析

ネットワークスタック部
CPU コアローカルではないプロセス内通信
1パケット毎の処理多数 (バルク処理)
システムコールのオーバヘッド (ホストバックエンド実装)
LKL 本体迂回 (Indirection)の影響

full scratch

性能 既存資産 最新版追従++--+

porting++/---anykernel-++++

full scratch

性能 既存資産 最新版追従
++

--

+

porting++/---anykernel+++++

まとめ

カーネルのコードは再利用するものです!
20 年近くの資産を捨てるのは無駄(面倒な)移植なしにライブラリとして (ユーザ空間プログラムに限らず)必要な部分のみ利用可能
オープンソースプロジェクトとして開発
https://github.com/lkl/linux

参考資料

Linux Kernel LibraryPurdila et al., LKL: The Linux kernel library, RoEduNet 2010.
https://github.com/lkl/linux
Rumpkernel (dissertation)
Kantee, Flexible Operating System Internals: The Design andImplementation of the Anykernel and Rump Kernels, Ph.D Thesis,
2012
Linux LibOS
Tazaki et al. Direct Code Execution: Revisiting Library OS
Architecture for Reproducible Network Experiments, CoNEXT 2013
http://libos-nuse.github.io/ (LibOS in general)
https://lwn.net/Articles/637658/

一般