Docker热迁移工具CRIU原理系列: CLI, RPC and C API

 

     使用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 [] 通过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

 

 

 

 

 

你可能感兴趣的:(docker,docker,linux)