runC热迁移原理简介

在runC中热迁移的工作主要是调用CRIU(Checkpoint and Restore in Userspace)来完成。CIRU负责冻结进程,并将作为一系列文件存储在硬盘上。并负责使用这些文件还原这个被冻结的进程。

runC使用SWRK模式来调用criu。这种模式是criu另外两种模式CLI和RPC的结合体,允许用户需要的时候像使用命令行工具一样运行criu,并接受用户远程调用的请求。

runC主要通过如下两个步骤完成热迁移工作。

  1. 生成container,通过state.json或者配置文件*.json来生成container结构体。

  2. 使用SWRK模式调用CRIU,runC首先收集并整理要进行Checkpoint或者Restore操作的容器的相关信息,并填入要发给SWRK模式下的CRIU的结构体中。结构体主要内容如下:

    req := &criurpc.CriuReq{
    Type: &t,     //C or R
    Opts: &rpcOpts,   //criu相关参数 
    }


    其中的字段t指定了这个请求是进行Checkpoint操作还是Restore操作,字段rpcOpts中则各种用户指定的选项和CRIU运行所需的参数。


随后通过syscall.Socketpair()创建runC(criuClient)与CIRU(criuServer)之间的通信管道。然后使用go语言中的os/exec包,以SWRK方式启动criu。再通过criuClient向criuServer发送request。最后通过criuClient接收执行结果即可。

3.3 当前版本下runC热迁移的配置与使用

由于当前版本的CRIU并非十分完善,还不能完全支持runC中的一少部分特性,所以在进行热迁移工作的时候需要对配置文件进行一些修改。具体修改的内容和原因如下:

  • 因为CRIU不支持seccomp,所以需要将config.json文件中关于seccomp的相关内容置空。

  • 因为CRIU不支外部终端,所以需要将config.json文件中terminal的值置为false。

  • 因为CRIU的需求runC所挂载的文件系统时可读的,所以将config.json文件中文件系统的可读写性设置为可读。