Slide 1

Slide 1 text

Wasmを実行するunikernel 
 とWasmコンパイラ 
 2024/02/18
 MITOU2023 Demo Day
 1 上田 蒼一朗 (京都大学 岡部研究室) 野崎 愛 (東京大学 中村・高瀬研究室)

Slide 2

Slide 2 text

ブラウザ 2

Slide 3

Slide 3 text

ブラウザ 3

Slide 4

Slide 4 text

 ブラウザ上で 
 Wasm を動かしてみる 
 4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

など 6

Slide 7

Slide 7 text

など 7

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

Linux 上で 
 Wasm を動かしてみる 
 9

Slide 10

Slide 10 text

Operating System Machine Wasm Runtime Application 10

Slide 11

Slide 11 text

Operating System Machine Application Application Operating System 11

Slide 12

Slide 12 text

12 https://github.com/mewz-project/mewz

Slide 13

Slide 13 text

Operating System Machine Application Application Operating System 13

Slide 14

Slide 14 text

Operating System Machine Application ● OS と Wasm(アプリケーション)が一体化 ● 単一の Wasm のみを実行 Application Operating System 14

Slide 15

Slide 15 text

Operating System Machine Application ● OS と Wasm(アプリケーション)が一体化 ● 単一の Wasm のみを実行 → unikernel Application Operating System 15

Slide 16

Slide 16 text

Mewz 上で 
 Wasm を動かしてみる 
 16

Slide 17

Slide 17 text

Mewz 上で 
 Wasm を動かしてみる 
 17 https://demoday.saza.dev

Slide 18

Slide 18 text

Wasm の動向 
 18

Slide 19

Slide 19 text

19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

Machine Host OS Hypervisor Guest OS Lib Guest OS Lib App App 仮想マシン 21

Slide 22

Slide 22 text

Machine Host OS Hypervisor Guest OS Lib Container Runtime Guest OS Lib App Machine Host OS Lib App App Lib App 仮想マシン コンテナ 22

Slide 23

Slide 23 text

Machine Host OS Hypervisor Guest OS Lib Container Runtime Guest OS Lib App Machine Host OS Lib App App Lib App 仮想マシン コンテナ Wasm Runtime Machine Host OS App App Wasm 23

Slide 24

Slide 24 text

VS 24

Slide 25

Slide 25 text

VS ✅ ポータビリティ ✅ セキュリティ ✅ 軽量 25

Slide 26

Slide 26 text

VS ✅ ポータビリティ ✅ セキュリティ ✅ 軽量 26

Slide 27

Slide 27 text

27 FROM ubuntu:22.04 RUN apt-get update && apt-get install -y \ package-foo \ package-bar COPY . /app CMD python /app/app.py

Slide 28

Slide 28 text

28 FROM ubuntu:22.04 RUN apt-get update && apt-get install -y \ package-foo \ package-bar COPY . /app CMD python /app/app.py Lib App コンテナイメージ

Slide 29

Slide 29 text

29 FROM ubuntu:22.04 RUN apt-get update && apt-get install -y \ package-foo \ package-bar COPY . /app CMD python /app/app.py Lib App コンテナイメージ コンテナイメージ

Slide 30

Slide 30 text

30 ソースコード ソースコード ソースコード

Slide 31

Slide 31 text

31 ソースコード ソースコード ソースコード コンパイル

Slide 32

Slide 32 text

32 ソースコード ソースコード ソースコード コンパイル スタンドアロン

Slide 33

Slide 33 text

Machine Host OS Hypervisor Guest OS Lib Container Runtime Guest OS Lib App Machine Host OS Lib App App Lib App Wasm Runtime Machine Host OS App App 33 仮想マシン コンテナ Wasm

Slide 34

Slide 34 text

Machine Host OS Hypervisor Guest OS Lib Container Runtime Guest OS Lib App Machine Host OS Lib App App Lib App Wasm Runtime Machine Host OS App App 34 仮想マシン コンテナ Wasm

Slide 35

Slide 35 text

Mewz が果たす役割・貢献 
 35

Slide 36

Slide 36 text

Machine Host OS Hypervisor Guest OS Lib Container Runtime Guest OS Lib App Machine Host OS Lib App App Lib App Wasm Runtime Machine Host OS App App 36

Slide 37

Slide 37 text

Container Runtime Machine Lib App Lib App Wasm Runtime Machine Guest OS App App 37 Hypervisor Host OS Machine Guest OS パブリッククラウドの場合 Machine Host OS Hypervisor Guest OS Lib Guest OS Lib App App

Slide 38

Slide 38 text

Container Runtime Machine Lib App Lib App Wasm Runtime Machine Guest OS App App 38 Hypervisor Host OS Machine Guest OS パブリッククラウドの場合 隔離性が必要 → Machine Host OS Hypervisor Guest OS Lib Guest OS Lib App App

Slide 39

Slide 39 text

Container Runtime Machine Lib App Lib App Wasm Runtime Machine Guest OS App App 39 Hypervisor Host OS Machine Guest OS パブリッククラウドの場合 隔離性が必要 → CVE-2024-21626 コンテナの隔離が 破られる脆弱性

Slide 40

Slide 40 text

40 Wasm Runtime Machine Guest OS App 40 Hypervisor Host OS Machine

Slide 41

Slide 41 text

41 Wasm Runtime Machine Guest OS App 41 Hypervisor Host OS Machine 無駄

Slide 42

Slide 42 text

App 42 Wasm Runtime Machine Guest OS App 42 Hypervisor Host OS Machine Machine unikernel Hypervisor Host OS Machine

Slide 43

Slide 43 text

App 43 Wasm Runtime Machine Guest OS App 43 Hypervisor Host OS Machine Machine unikernel Hypervisor Host OS Machine 隔離性の維持 × ゲスト OS のオーバーヘッドの削減

Slide 44

Slide 44 text

44 30% 高速化

Slide 45

Slide 45 text

アーキテクチャ 
 45

Slide 46

Slide 46 text

46

Slide 47

Slide 47 text

47 wasm.o AoT コンパイル

Slide 48

Slide 48 text

Wasm コンパイラ 
 48 https://github.com/mewz-project/wasker

Slide 49

Slide 49 text

49 wasm.o AoT コンパイル

Slide 50

Slide 50 text

50 wasm.o AoT コンパイル mewz.o mewz.o mewz.o コンパイル

Slide 51

Slide 51 text

51 wasm.o AoT コンパイル mewz.o mewz.o mewz.o kernel.elf コンパイル 静的リンク

Slide 52

Slide 52 text

52 wasm.o AoT コンパイル mewz.o mewz.o mewz.o kernel.elf コンパイル 静的リンク

Slide 53

Slide 53 text

53 wasm.o AoT コンパイル mewz.o mewz.o mewz.o kernel.elf コンパイル 静的リンク … // 呼び出し call fd_read … … // 実装 fn fd_read() …

Slide 54

Slide 54 text

Kubernetes から 
 Mewz を起動してみる 
 54

Slide 55

Slide 55 text

55 Container Runtime

Slide 56

Slide 56 text

56 Container Runtime runwasi

Slide 57

Slide 57 text

57 Container Runtime runwasi

Slide 58

Slide 58 text

MikanOS 上で 
 Wasm を実行してみる 
 58

Slide 59

Slide 59 text

59 wasm.o mewz.o mewz.o mewz.o kernel.elf

Slide 60

Slide 60 text

60 wasm.o mewz.o mewz.o wasi.o app.elf あるOS上の WASI の 実装

Slide 61

Slide 61 text

Wasm を任意の OS 上で 実行することを可能にする 61 wasm.o mewz.o mewz.o wasi.o app.elf あるOS上の WASI の 実装

Slide 62

Slide 62 text

Wasm を任意の OS 上で 実行することを可能にする 62 wasm.o mewz.o mewz.o wasi.o app.elf MikanOS上 WASI の 実装

Slide 63

Slide 63 text

謝辞
 63 @kateinoigakukun さん @utam0k さん

Slide 64

Slide 64 text

まとめ
 ● Mewz: Wasm を実行するのに特化した軽量 OS
 ○ クラウド上で Wasm を高い隔離性 を保ちつつ
 低オーバーヘッド で実行
 ○ runwasi に対応 → Kubernetes などから実行できる
 
 ● Wasker: Wasm をオブジェクトファイルに変換
 ○ 任意の OS 上で Wasm を実行可能にする
 64 https://github.com/mewz-project/

Slide 65

Slide 65 text

補足スライド 
 65

Slide 66

Slide 66 text

コンテナランタイムの仕組み 
 66 コンテナ 高レベルランタイム 低レベルランタイム containerd-shim-runc

Slide 67

Slide 67 text

WasmEdge ✖ コンテナランタイム 
 67 Wasmプログラム 高レベルランタイム Wasmランタイム containerd-shim-wasmedge ● イメージからWasmファイルを 読み取る ● WasmEdgeインスタンスを起 動

Slide 68

Slide 68 text

mew ✖ コンテナランタイム 
 68 Wasmプログラム 高レベルランタイム VM containerd-shim-mew ● Wasmを読み取る ● waskerでコンパイル ● mewとwaskerの生成物をリンク ● VM上でmewを起動 mew

Slide 69

Slide 69 text

何がアツいか 
 🔥 unikernel による Wasm の高速な実行 
 
 🔥 WASI によって unikernel の互換性の問題 を解決
 
 🔥 unikernel を Wasm コンテナとして透過的 に扱う
 
 🔥 Wasm コンパイラによって WASI をカーネルに対する標準的な インターフェース として普及 


Slide 70

Slide 70 text

unikernel の利点 
 ● アプリケーションとカーネルがリンク
 → スタンドアローンなバイナリに
 ● アプリケーションがカーネルモードで動く
 → システムコールのオーバーヘッドが削減される
 ● アドレス空間が単一
 → コンテキストスイッチのオーバーヘッドが削減
 70 MirageOS という unikernel の説明より →

Slide 71

Slide 71 text

unikernelの課題
 71 運用のつらさ 
 互換性
 アプリケーションの移植が必要 
 独自のビルドシステム 
 手元でカーネルごとビルド 
 煩雑なデプロイ 
 ディスクイメージを作ってカーネルをブートして... 


Slide 72

Slide 72 text

unikernelの互換性問題の解決 
 72 従来
 互換性/軽量さにトレードオフ 
 ⨯ 互換性
 ✓ 実行速度
 ✓ 互換性
 ⨯ 実行速度
 mew
 WASIによる 
 カーネルインターフェース 
 ✓ 互換性
 ✓ 実行速度
 🔥 WASI によって unikernel の互換性の問題を解決

Slide 73

Slide 73 text

既存のWasmランタイムとの比較 
 Wasmランタイム カーネル mew WASI WASI システムコール Hypervisor

Slide 74

Slide 74 text

Wasker: Wasm コンパイラ 
 Wasm binaryをnative binaryに変換するコンパイラ
 ● WASI 関数を未解決シンボルにして
 オブジェクトファイルへ変換
 ● 生成するオブジェクトファイルは
 独自に実装したWASI関数の実装と
 リンクできる
 → 独自の WASI 実装を差し込める 
 74

Slide 75

Slide 75 text

Wasker: 開発するに至った経緯 
 ● Wasm をネイティブバイナリに変換するものはすでにある
 ● ↑ OS 依存なバイナリが出力される
 ○ Linux、Windows のシステムコールを
 叩いている
 ○ WASI API の実装がすでに同梱されている
 ○ → mew 上では動かない
 ● Wasker は WASI API の実装自体はバイナリに含まず、未解決シンボ ルにする
 ○ → OS 非依存 
 ○ mew のみならず、他の OS 上で Wasm を実行することが可能に 


Slide 76

Slide 76 text

今までの世界 
 76

Slide 77

Slide 77 text

今までの世界 
 77

Slide 78

Slide 78 text

wasker が実現する世界 
 78

Slide 79

Slide 79 text

wasker が実現する世界 
 79

Slide 80

Slide 80 text

wasker が実現する世界 
 80

Slide 81

Slide 81 text

wasker が実現する世界 
 81 🔥 Wasm コンパイラによって WASI をカーネルに 
 対する標準的なインターフェースとして普及

Slide 82

Slide 82 text

82

Slide 83

Slide 83 text

Windows x86_64 Linux AArch64 Linux AArch64 Windows x86_64 83

Slide 84

Slide 84 text

Windows x86_64 Linux AArch64 Linux AArch64 Windows x86_64 84

Slide 85

Slide 85 text

Linux AArch64 Windows x86_64 100MB~ ~10MB 85

Slide 86

Slide 86 text

サンドボックス 86

Slide 87

Slide 87 text

サンドボックス 87

Slide 88

Slide 88 text

サンドボックス 88

Slide 89

Slide 89 text

サンドボックス CVE-2024-21626 コンテナの隔離が破られる脆弱性 89