CRIU用户指南

更新时间:
复制为 MD 格式

1. CRIU介绍

CRIU(Checkpoint/Restore In Userspace)是运行在用户态的进程检查点与恢复的开源工具,用于将正在运行的进程或容器的状态完整保存下来,并在之后重新恢复执行。其核心目标是实现进程的“冻结 → 导出运行状态 → 保存为镜像 → 在需要时重建并恢复执行”。

CRIU 能够保存 CPU 侧进程的各类运行时数据,但对于进程所依赖的设备资源,其状态通常无法由 CRIU 直接处理。因此,CRIU 提供了 plugin 机制作为通用解决方案,用于扩展对特定设备状态的保存/恢复能力。从SDK v2.1版本开始,平头哥提供了PPU版本的CRIU插件来实现对PPU设备状态的保存和恢复(alixpu_plugin.so,跟随PPU SDK发布)。

2. 安装指南

2.1 安装CRIU

用户可直接安装软件包或自行源码编译安装:

  1. 源码:GitHub - checkpoint-restore/criu

  2. ubuntu2404为例,需要安装以下依赖,其他可选依赖参考Installation - CRIU

apt install -y --no-install-recommends \
uuid-dev libnl-3-dev libnet-dev libcap-dev protobuf-compiler protobuf-c-compiler libprotobuf-dev libprotobuf-c-dev python3-protobuf
  1. cd $CRIU_SOURCE && make -j,可执行文件位于$CRIU_SOURCE/criu/criu

2.2 添加PPU插件

安装CRIU后,可使用以下几种方式添加PPU插件:

  1. PPU_SDK中的alixpu_plugin.so放到/usr/lib/criu(CRIU默认查询路径)中。

  2. 使用环境变量CRIU_LIBS_DIR指定。

  3. 通过命令行参数指定。

- L|--libdir           path to a plugin directory (by default /usr/lib/criu/)

3. 使用指南

CRIU有两种使用方式:

  • 手动执行criu实现进程级别保存/恢复。

  • 结合docker实现容器级别保存/恢复。

3.1 进程级别保存/恢复

  • 保存:传入进程组的根进程pid,进程和PPU状态将保存到images dir中。

    criu dump --shell-job --images-dir <images dir> --tree <root pid>
  • 恢复:从images dir恢复进程和PPU状态继续执行。

    criu restore --shell-job --images-dir <images dir>

    CRIU会创建子进程并将其一步步修改为原进程,该命令结束也就是原进程结束。

3.2 容器级别保存/恢复

3.2.1 环境配置

需要开启实验性功能:/etc/docker/demon.json中添加{"experimental": true},重启dockerd。

3.2.2 对容器保存/恢复

  • 保存:

    docker checkpoint create <container name> <checkpoint name>

    image默认保存在/var/lib/docker/containers/<id>/checkpoints/<checkpoint name>/

  • 恢复:

    docker start --checkpoint <checkpoint name> <container name>

4. 可能遇到的问题

  • 结合docker使用,并使用环境变量添加plugin时,注意需要在docker启动时设置环境变量:

    [Service]
    Environment="CRIU_LIBS_DIR=<path to plugin dir>"
  • checkpoint可能会打断系统调用(如poll),所以原进程需要支持系统调用返回EINTR的情况。

  • 原进程使用TCP时需要添加参数--tcp-established

5. 参考文档

  1. docker checkpoint

  2. Main page - CRIU

  3. CLI - CRIU

  4. Installation - CRIU