快速、轻量级OCI容器运行时crun介绍

crun 是一个快速、轻量级的 OCI(Open Container Initiative)容器运行时,完全用 C 语言编写。


为什么选择 C 而不是 Go?

大多数容器生态工具(如 runc)用 Go 编写,但作者认为 C 更适合底层工具。runc 本身也会 re-exec 并调用 C 模块来设置环境。
crun 的设计目标是:

  • 可作为库(libcrun)直接嵌入其他程序,无需额外进程管理 OCI 容器。
  • 更低的资源占用和更快的启动速度。

性能优势

相比 runc:

  • 启动更快(示例:连续运行 100 个 /bin/true 容器,crun 约 1.69 秒,runc 约 3.34 秒,快约 49%)。
  • 内存占用更低(可支持更严格的内存限制,例如 512KB 级别仍能正常运行,而 runc 在 4MB 时可能失败)。
  • 二进制体积更小(优化后约几百 KB,而 runc 约 15MB 级别)。

这些特性使其特别适合资源受限环境(边缘计算、IoT)、高密度容器场景(Kubernetes 节点大量 Pod),以及需要极低开销的场景。

主要特性

  • 完整 OCI 运行时功能(create、start、run、delete、exec、pause、checkpoint/restore 等,支持 CRIU)。
  • 支持 cgroup v2 原生。
  • 支持 rootless 容器。
  • 支持 WASM(通过 wasmedge 等)。
  • 提供 krun 模式:结合 libkrun,在 KVM 虚拟化隔离环境中运行容器。
  • 可选 Lua / Python 绑定。
  • 可作为共享库使用(--enable-shared)。

使用场景与生态

  • 默认运行时:在 RHEL 9+、Fedora、Podman、CRI-O 等中常作为默认或推荐运行时。
  • 可与 Docker、containerd、Kubernetes、Podman 等无缝替换 runc(只需配置运行时路径即可)。
  • 适合需要高性能、低开销的生产环境。

构建与依赖

支持 Fedora、RHEL/CentOS、Ubuntu、Alpine、openSUSE 等。典型构建步骤:

1
2
3
4
./autogen.sh
./configure
make
sudo make install

也支持 Nix 静态构建、共享库等。