Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rust no_stdで作るコンテナ
Search
Takashi IIGUNI
October 10, 2021
Programming
2
2.7k
Rust no_stdで作るコンテナ
Takashi IIGUNI
October 10, 2021
Tweet
Share
More Decks by Takashi IIGUNI
See All by Takashi IIGUNI
SRE へのサポートケースをAIに管理させる方法
guni1192
2
5.7k
Other Decks in Programming
See All in Programming
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
460
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
2.1k
AI時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
490
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1.1k
DSPy入門 Pythonで実現する自動プロンプト最適化 〜人手によるプロンプト調整からの卒業〜
seaturt1e
1
320
NetBSD+Raspberry Piで 本物のPSGを鳴らすデモを OSC駆動の7日間で作った話 / OSC2026Osaka
tsutsui
1
130
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
0
200
生成AIを活用したソフトウェア開発ライフサイクル変革の現在値
hiroyukimori
PRO
0
140
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
6
1.6k
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
190
並行開発のためのコードレビュー
miyukiw
2
2.1k
ぼくの開発環境2026
yuzneri
1
290
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
9.7k
For a Future-Friendly Web
brad_frost
183
10k
Done Done
chrislema
186
16k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
130
Scaling GitHub
holman
464
140k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
450
Balancing Empowerment & Direction
lara
5
920
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
610
Building Adaptive Systems
keathley
44
2.9k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
92
sira's awesome portfolio website redesign presentation
elsirapls
0
170
Transcript
Rust no_stdで作る コンテナエンジン 第15回 コンテナ技術の情報交換会@オンライン Takashi Iiguni (@guni1192) Kagawa University
10/9/2021 1
Profile • 氏名: 飯國 隆志(Takashi Iiguni) • 香川大学大学院工学研究科 信頼性情報システム工学専攻M2 •
Favorite: Container, Security, Rust, eBPF • Twitter: guni1192 • GitHub: guni1192 • 来年から東京でSoftware Engineer 10/9/2021 2
今日の話 Rustのミドルウェアも Goみたいにポータブルな バイナリを作って配りたい 10/9/2021 3
Agenda • 今日話すこと • Rustでポータブルなシングルバイナリ作る話 • Rustからlibcなしでシステムコールを呼び出す話 • Rustの標準ライブラリ縛りでコンテナもどきを作る話 •
話さないこと • OCI Runtimeの話 10/9/2021 4
Rust and Go • Goは基本的にstatic link • 標準ライブラリはあまりCに依存しないようにできてい るからstatic linkしやすい
• システムコールの呼び出しすらGoとアセンブラ • Rustは基本的にdynamic link(が多い気がする) • 標準ライブラリ(std)がlibcに依存しているからstatic linkしにくい • musl libcを使うことでstatic linkできる • 依存ライブラリの再コンパイルが必要になる場合も ある 10/9/2021 5
例えばyoukiの場合 10/9/2021 6
Rust library for implementing containers • libc: libc(7)をRustから呼び出すFFI binding •
nix: libc crateのRust likeなwrapper • ResultによるError Handleなど 10/9/2021 7
libc(7) • C言語の標準ライブラリ • printf(3)やfopen(3)などのライブラリ関数を提供 • write(2), open(2)などのシステムコールを呼ぶための関数も提供 • 実装例
• glibc(GNU C Library): GNU Projectのlibc • musl libc: MITライセンスのlibc. Alpine Linuxなどで利用されている 10/9/2021 8
Rustからlibc経由でシステムコール を発行する • Pros • 既存の実装を利用して多くの関数が利用できる • 成熟していて多くのArchに対応している • Cons
• Rustの型に合わせた実装が難しい • Resultなどが使いたかったらnixのような抽象化ライブラリが必要 • libcの脆弱性や更新などが必要 10/9/2021 9
Issue syscall in Linux x86_64 • システムコールの発行はレジスタに値を格納し,syscall命令を実行する • 結果はraxレジスタに格納 Register
write(2) execve(2) clone(2) syscall number rax 1 59 56 arg1 rdi fd cmd flags arg2 rsi buf args child stack arg3 rdx buf size env TID field in parent arg4 r10 TID field in child arg5 r8 thread pointer arg6 r9 10/9/2021 10
Rustから直接システムコールを呼ぶ Rustのinline assemblyを使う(asm!マクロ) 10/9/2021 11
余談: 僕らがシステムコールと思ってい たものはシステムコールじゃなかった • wait系のシステムコール • Linux x86_64はwait4しかない • libcのwaitpidはwait4システムコールを呼んでいる
(歴史的経緯やアーキテクチャの違いがありそう) • $ man 2 waitpidが引けたからといってシステムコールとは限らない 10/9/2021 12
苦労話: libc とシステムコール • cloneシステムコール • libcの引数とカーネル側のレジスタの値 が違う • コールバック関数があるのはlibc側の仕様
musl libcのコードは読みやすかった glibcはコメントに重要なことがたくさん書いてあった 10/9/2021 13
余談: libcを経由しないシステムコー ルの発行について • OpenBSDはlibc以外からのシステムコールをブロックする仕組みがある • 信頼できない経路からのシステムコールの発行を止めたい • この機構の導入によってGoのようなlibcを経由しない言語がブロック •
GoはOpenBSDの場合はCGOを利用するようになった 10/9/2021 14
試しにシングルバイナリの コンテナエンジンを作ろう! Rustからシステムコールを呼べた 10/9/2021 15
シングルバイナリな コンテナエンジンの要件 • std crateを使用しない • std crateはlibcに依存している • Dynamic
linkを一切しない • std crate • Rustの標準ライブラリ • Vec, Option, Boxといったプリミ ティブなライブラリを提供 • 標準マクロ,IO,マルチスレッドな どの機能 10/9/2021 16
Rust no_std • std crateを用いないモード • stdの代わりにcore crateを使用できる • core
crate • プラットフォームに依存しないポータブルな標準ライブラリ • 浮動小数点,文字列,スライス,アトミック操作やSIMD命令などのAPIを提供 • 一般的にカーネルやブートローダ,ベアメタルな環境で用いるモード • 動的メモリ確保などの昨日は 備考: Rustのno_std環境をちゃんと触るなら 「Writing an OS in Rust」https://os.phil-opp.com がおすすめ 10/9/2021 17
Nosc(No std container) • Portable and Tiny Container Engine •
without std crate • without dynamic link binary • Environment • Linux >= 5.7 • Arch: x86_64 • Cgroup v2 • https://github.com/guni1192/nosc 10/9/2021 18
Nosc Feature • プロセスのNamespaceの分離 • プロセスを親と異なるCgroupへ所属 • 必要なシステムコール • clone3
• execve • write • open • wait4 • mkdir 10/9/2021 19
clone3 • 子プロセスを作るシステムコール • Linux 5.3で追加された • Linux 5.7以降で子プロセスを親とは別のcgroupに配属可能に •
clone_args.cgroupに配属させるcgroupディレクトリのfdを与えて実行 • clone_args.flagsにCLONE_INTO_CGROUPを指定 10/9/2021 20
Nosc Run container 10/9/2021 21
Binary size Container Engine Size(Bytes) Nosc (static link + stripped)
24,904 go tiny container (static link + stripped) ※ 1,584,856 youki (striped) 2,574,792 runc (striped) 11,445,576 ※go tiny containerは即興で作ったnoscと似たような挙動をするコンテナエンジン 10/9/2021 22
Future work • libcに依存しないAlternative nixみたいなものを作ってみても面白そう • Cに依存しないコンテナエンジンとかも面白そう Summary • Rustでもポータブルなバイナリを作りたかった
• libc無しでシステムコールを発行するライブラリを作っている • no_std環境で動くコンテナエンジンもどきを作ってみた • 失って初めて分かるstdとlibcの便利さ 10/9/2021 23