Upgrade to Pro — share decks privately, control downloads, hide ads and more …

youki libkrunで実現するVM型コンテナ

Avatar for Yusuke Sakurai Yusuke Sakurai
October 23, 2025
7

youki libkrunで実現するVM型コンテナ

Avatar for Yusuke Sakurai

Yusuke Sakurai

October 23, 2025
Tweet

Transcript

  1. 概要 4 話すこと • youki: 低レベルコンテナランタイム • libkrun: 動的ライブラリとして提供されているVMM(仮想マシンモニター) •

    youkiにlibkrunを組み込み、VM型のコンテナを実現する • 実装や処理方針、通常のコンテナとの違いについて説明する
  2. OCIコンテナランタイム 6 • OCI ランタイム ◦ 以下の技術を利用してlinuxのプロセスを隔離する技術 ▪ pivot_root •

    ルートファイルシステムを変更してコンテナに独立したファイルシステムを 提供 ▪ cgroup • memory, cpuなどプロセスのリソースを制限する ▪ namespace • mount/pid/net/ipc/uts/cgroupなどを隔離して実行 • コンテナを作成する流れ ◦ Kubelet(Kubernetes) →(CRI)→ 高レベルコンテナランタイム(containerd / CRI-O)→ 低レベルOCIランタイ ム
  3. libkrunとは 8 • RedHatが開発している仮想マシンモニター(VMM) • 動的ライブラリとして提供されている ◦ C API 経由で呼び出すことができる

    • コンテナ向けの軽量VMMとして開発 • KVMベースの仮想化を実現する • ユースケース ◦ crun: コンテナに仮想化ベースの分離を実現 ◦ krunkit: macOSでGPU対応の軽量VMを起動
  4. youki x libkrun 9 • コンテナに仮想化(VM)ベースの分離をする • VMベースで仮想化することにより、通常のコンテナより強い分離とセキュリティを実現する モチベーション •

    crun ◦ libkrunを利用して各コンテナを VM上で実行できるようにした • youkiへの応用 ◦ ➡crunと同様にyoukiでもlibkrunによるVMレベルでコンテナを分離できないか ? ◦ wasmからrunwasiにつながったように、利用用途は広がるか ? 余談 • runc ◦ 標準のOCI ランタイム • crun ◦ 実験的な機能をどんどん入れていく (wasm, libkrun…)
  5. コンテナ比較 10 • コンテナ ◦ 軽量・高速に隔離された環境を提供する ◦ コンテナはホストとLinuxカーネルを共有 • libkrun

    x youki(OCI Runtime) ◦ ホストとカーネルを共有しない ◦ VMでコンテナ単位で隔離 • Kata Container ◦ 別のVM型のコンテナ ◦ ホストとカーネルを共有しない ◦ VMでPod単位でコンテナを隔離
  6. crunの実装 13 • https://github.com/containers/crun • 参照実装: crun/src/libcrun/handlers/krun.c • 判定: annotationsで判断

    ◦ libkrun統合のコンテナ(libkrun) ◦ 通常のコンテナ(libcrun) • ライブラリ読み込み: libkrun.soをロード • デバイス許可: コンテナから/dev/kvmにアクセス可能に • VM起動 引用: Don’t peek into Container
  7. 処理概要 youki(通常のコンテナ起動) 17 1. (準備) a. ルートファイルシステムを用意 b. config.jsonでコンテナの設定を準備 2.

    youki run コマンド実行 3. config.jsonでコンテナの設定を読み込む 4. コンテナ初期化プロセスをクローン 5. cgroup を作成・適用してリソースを制限する 6. uts/ipc/net/mount/pidなどのnamespace を設定する 7. pivot_rootして新しいルートファイルシステムに切り替える 8. 指定したエントリポイント/コマンドを実行 9. namespace/cgroupで隔離されたプロセスが実行される
  8. libkrunを動かすには? 19 libkrunでVMを起動する単純なコード • libloading ◦ libkrun.soをロード • krun_create_ctx ◦

    contextを設定する • krun_set_vm_config ◦ VMのRAMとvCPUを設定する • krun_set_root ◦ ホスト上のディレクトリを VM内のルート設定 • krun_set_log_level ◦ ログを設定する • krun_set_exec ◦ 実行する処理(/bin/sh)を指定 • krun_start_enter ◦ VMを起動する
  9. libkrunを動かす 20 • libkrunでVMを起動する単純なコード • libloading ◦ libkrun.soをロード • krun_create_ctx

    ◦ contextを設定する • krun_set_vm_config ◦ VMのRAMとvCPUを設定する • krun_set_root ◦ ホスト上のディレクトリを VM内のルート ◦ としてマウント • krun_set_log_level ◦ ログを設定する • krun_set_exec ◦ 実行する処理(/bin/sh)を指定 • krun_start_enter ◦ VMを起動する この処理をコンテナの作成ワークフローの中に組み込む
  10. 処理概要 youki(通常のコンテナ起動)(再喝) 21 1. (準備) a. ルートファイルシステムを用意 b. config.jsonでコンテナの設定を準備 2.

    youki run コマンド実行 3. config.jsonでコンテナの設定を読み込む 4. コンテナ初期化プロセスをクローン 5. cgroup を作成・適用してリソースを制限する 6. uts/ipc/net/mount/pidなどのnamespace を設定する 7. pivot_rootして新しいルートファイルシステムに切り替える 8. 指定したエントリポイント/コマンドを実行 9. namespace/cgroupで隔離されたプロセスが実行される
  11. 処理概要 (youki x libkrun) 22 既存のyoukiのコンテナ作成プロセスに libkrunの設定、実行プロセスを組み込む 1. (準備) a.

    ルートファイルシステムを用意 b. config.jsonでコンテナの設定を準備 c. libkrun, libkrunfwを配置 2. youki run コマンド実行 3. config.jsonでコンテナの設定を読み込む a. annotationsで判定 "run.oci.handler" = "krun" を指定した場合 libkrun用の処理を実行する 4. libkrun をロードし、コンテキストを作成 a. libkrun.soを読み込み , krun_create_ctxを実行 5. コンテナ初期化プロセスをクローン 6. cgroup を作成・適用してリソースを制限する 7. uts/ipc/net/mount/pidなどのnamespace を設定する 8. pivot_rootして新しいルートファイルシステムに切り替える 9. libkrunのVM起動設定 a. krun_set_vm_config, krun_set_root, krun_set_log_level 10. libkrunのVMを実行 a. krun_start_enter
  12. 処理概要 (youki x libkrun) 23 既存のyoukiのコンテナ作成プロセスに libkrunの設定、実行プロセスを組み込む 1. 準備 a.

    ルートファイルシステムを用意 b. config.jsonでコンテナの設定を準備 c. libkrun, libkrunfwを配置 2. youki run コマンド実行 3. config.jsonでコンテナの設定を読み込む a. annotationsで判定 "run.oci.handler" = "krun" を指定した場合 libkrun用の処理を実行する 4. libkrun をロードし、コンテキストを作成 a. libkrun.soを読み込み , krun_create_ctxを実行 5. コンテナ初期化プロセスをクローン 6. cgroup を作成・適用してリソースを制限する 7. uts/ipc/net/mount/pidなどのnamespace をセットアップ 8. pivot_rootして新しいルートファイルシステムに切り替える 9. libkrunのVM起動設定 a. krun_set_vm_config, krun_set_root, krun_set_log_level 10. libkrunのVMを実行 a. krun_start_enter namespace切り替え前にロードしてランタイムの同一プロセス メモリ マップ上にlibkrunとlibkrunfwをのせる 通常のコンテナと同様に config.jsonで指定したエントリポイントを VMで 実行
  13. libkrun実装 25 • /dev/kvm, cgroup ◦ youki(やcrun)のコンテナ内でlibkrunを実行するにはコンテナ内で /dev/kvmを利用できる必要があ る ◦

    youkiで暗黙的にconfig.jsonを変更して、/dev/kvmを利用できるようにdevice, cgroupの設定をする
  14. youki x libkrun 26 • 良い点 ◦ 通常のyoukiのコンテナ作成のワークフローに統合できる ◦ config.jsonのannotationsで通常のコンテナを起動するか、libkrun統合のコンテナを起動す

    るか簡単に切り替えることができる ▪ 既存ワークフローを崩さずにVM型隔離を実現できる ◦ コード上も通常の処理とほぼ分離した形で実装をすることができる • 気になる点 ◦ /dev/kvmが必要 ◦ コンテナごとにVMを起動するのでメモリ‧IOなどオーバーヘッドは発⽣する ◦ コンテナ起動が遅くなる可能性 ◦ VM型のコンテナというものを考える必要 ▪ VM型コンテナを作成する過程で脆弱性が出る可能性
  15. youki x libkrun を動かす 27 • ビルド方法 $ ./scripts/build.sh -o

    . -r -f libkrun • 準備 • 通常のコンテナと同様にルートファイルシステムを用意する $ mkdir -p tutorial/rootfs $ cd tutorial $ docker export $(docker create busybox) | tar -C rootfs -xvf - • config.jsonを用意する $ youki spec • libkrun用の準備 ◦ kvmが有効であること ◦ libkrunとlibkrunfwがインストールされていること
  16. youkiを動かす(youki x libkrun) 29 $ youki --debug run -b tutorial/

    container libkrun.soをロード libkrun用の設定でコンテナを実行
  17. 今後の展望 33 • crun でも現在でも機能が追加されている ◦ krun: add support for

    krun-sev ◦ krun: Add support to run AWS Nitro Enclaves ◦ krun: enable virtio-gpu