使用C/R功能的三种方式就是 CLI, RPC and C API。下面分别介绍。
一、CLI
CLI(Command Line Implementation)意思是CRIU的命令行工具,具体的工具名称是criu。比如我们可以执行最简单的命令” criu check“来确认当前系统内核是否提供支持CRIU正常使用的最小要求,如果条件达到,终端会返回成功,如下所示:
[root@localhost criu]# ./criu check
Looks good.
其他命令选项还有如下两个:
criu dump|pre-dump -t PID [
criu restore [
具体示例可以参考 https://criu.org/Simple_loop
CLI更多参数讲解可以参考 https://criu.org/CLI
二、RPC
CRIU-RPC 是一个使用Google Protocol Buffers的远程调用协议,请求在”swrk“模式下或者通过”criu service“命令启动的服务下保存。 在单例服务下,通过监听/var/run/criu-service.socket来实现通信。
RPC中,发送和请求使用结构体criu_req和criu_resp
。基本过程就是:客户端发送criu_req消息给服务端,服务端使用criu_resp回复客户端。这两个结构体的类型如下:
message criu_req {
required criu_req_type type = 1;
optional criu_opts opts = 2;
optional notify_success = 3; /* see Notifications below */
optional keep_open = 4; /* for multi-req, below */
}
message criu_resp {
required criu_req_type type = 1;
required bool success = 2;
optional criu_dump_resp dump = 3;
optional criu_restore_resp restore = 4;
optional criu_notify notify = 5;
optional criu_page_server_info ps = 6;
optional int32 cr_errno = 7;
}
比如我们可以使用如下CLI命令去备份一个进程:
# criu restore -D /path/to/imgs_dir -v4 -o restore.log
它就等价于:
request.type = RESTORE;
request.opts.imgs_dir_fd = open("/path/to/imgs_dir")
request.opts.log_level = 4
request.opts.log_file = "restore.log"
具体的使用示例可以参考CRIU源码(https://github.com/checkpoint-restore/criu.git)中的文件test/others/rpc/test-c.c
三、C API
libcriu 是CRIU的 c语言 API ,实际上是对上面CRIU-RPC的一个简单封装,所以libcriu提供了比直接使用RPC方式更加容易使用的C语言接口。 libcriu 提供的函数接口定义在lib/criu.h
。criu源码编译完成后,此库在./lib/c/libcriu.so。里面提供的接口有:
void criu_set_pid(int pid);
void criu_set_images_dir_fd(int fd); /* must be set for dump/restore */
void criu_set_leave_running(bool leave_running);
void criu_set_ext_unix_sk(bool ext_unix_sk);
void criu_set_tcp_established(bool tcp_established);
void criu_set_evasive_devices(bool evasive_devices);
void criu_set_shell_job(bool shell_job);
void criu_set_file_locks(bool file_locks);
void criu_set_log_level(int log_level);
void criu_set_log_file(char *log_file);
int criu_check(void);
int criu_dump(void);
int criu_restore(void);
比如我们通过CLI 命令行 实现一个进程的恢复过程,具体是:
# criu restore -D /path/to/imgs_dir -v4 -o restore.log
就等价于:
criu_init_opts();
criu_set_service_address("/path/to/criu/service/socket");
int fd = open("/path/to/imgs_dir", O_DIRECTORY);
criu_set_images_dir_fd(fd);
criu_set_log_file("restore.log");
criu_set_log_level(4);
criu_restore();
libcriu的具体使用示例可以参考CRIU源码的 test/others/libcriu/test_iters.c