Difference between revisions of "RPC"

From CRIU
Jump to navigation Jump to search
Line 4: Line 4:
 
Well described here: [[Self_dump]].
 
Well described here: [[Self_dump]].
  
== Protocol Buffers ==  
+
== CRIU request ==
See protobuf/criu-rpc.proto.
+
criu_req is used to wrap requests to provide compatibility with an older versions of rpc.
There are three types of structures for now:
+
Any request must be wrapped into criu_req to send to criu.
=== Dump request ===
+
 
criu_dump_req is used to store dump options from client.
+
<pre>
 +
message criu_req {
 +
required criu_req_type type = 1;
 +
 
 +
optional criu_dump_req dump = 2;
 +
}
 +
</pre>
 +
 
 +
There is only 1 request/response type for now.
 +
<pre>enum criu_req_type {
 +
EMPTY = 0;
 +
DUMP = 1;
 +
}
 +
</pre>
 +
=== CRIU dump request ===
 +
criu_dump_req is used to store dump options.
 
<pre>message criu_dump_req {
 
<pre>message criu_dump_req {
optional int32 pid = 1;
+
required int32 images_dir_fd = 1;
optional bool leave_running = 2;
+
optional int32 pid = 2;
optional bool ext_unix_sk = 3;
+
 
optional bool tcp_established = 4;
+
optional bool leave_running = 3;
optional bool evasive_devices = 5;
+
optional bool ext_unix_sk = 4;
optional bool shell_job = 6;
+
optional bool tcp_established = 5;
optional bool file_locks = 7;
+
optional bool evasive_devices = 6;
required int32 images_dir_fd = 8;
+
optional bool shell_job = 7;
 +
optional bool file_locks = 8;
 
optional int32 log_level = 9 [default = 2];
 
optional int32 log_level = 9 [default = 2];
 
}</pre>
 
}</pre>
Line 30: Line 46:
 
For other options description, please run "criu -h".
 
For other options description, please run "criu -h".
  
=== Dump response ===
+
== CRIU response ==
 +
criu_resp is a wrapper for responses. It consists of success bool field, response type field and response, that depends on sent request type.
 +
<pre>message criu_resp {
 +
required criu_req_type type = 1;
 +
required bool success = 2;
 +
 
 +
optional criu_dump_resp dump = 3;
 +
}
 +
</pre>
 +
=== CRIU dump response ===
 
criu_dump_resp is used to store response from CRIU.
 
criu_dump_resp is used to store response from CRIU.
 
<pre>
 
<pre>
 
message criu_dump_resp {
 
message criu_dump_resp {
required bool success = 1;
+
optional bool restored = 1;
optional bool restored = 2;
 
 
}
 
}
 
</pre>
 
</pre>
  
 
Field "restored" is set to "true" if process was restored.
 
Field "restored" is set to "true" if process was restored.
 
=== CRIU msg ===
 
criu_msg is a wrapper for other two structures to pass them through the socket.
 
<pre>
 
message criu_msg {
 
enum Type {
 
EMPTY = 0;
 
DUMPREQ = 1;
 
DUMPRESP = 2;
 
}
 
 
required Type type = 1;
 
 
optional criu_dump_req dump_req = 2;
 
optional criu_dump_resp dump_resp = 3;
 
}
 
</pre>
 
  
 
== Server ==
 
== Server ==
On a server side, CRIU creates SOCK_SEQPACKET Unix socket and listens for connections on it. After receiving criu_msg, CRIU processes it and do what is requested and sends response back.
+
On a server side, CRIU creates SOCK_SEQPACKET Unix socket and listens for connections on it. After receiving criu_req, CRIU processes it, do what is requested and sends response back.
  
 
To launch service server run:
 
To launch service server run:
Line 70: Line 77:
  
 
== Client ==
 
== Client ==
Client, in its turn, must connect to service socket, send criu_msg with request in it, and wait for a criu_msg with response.
+
Client, in its turn, must connect to service socket, send criu_msg with request in it, and wait for a criu_resp with response.
 
You can find examples of client programs in C and Python in test/rpc/.
 
You can find examples of client programs in C and Python in test/rpc/.

Revision as of 18:38, 21 September 2013

CRIU-RPC is a remote procedure call (RPC) protocol which uses Google Protocol Buffers to encode its calls and SOCK_SEQPACKET Unix domain socket as a transport mechanism.

Preconditions

Well described here: Self_dump.

CRIU request

criu_req is used to wrap requests to provide compatibility with an older versions of rpc. Any request must be wrapped into criu_req to send to criu.

message criu_req {
	required criu_req_type type	= 1;

	optional criu_dump_req dump	= 2;
}

There is only 1 request/response type for now.

enum criu_req_type {
	EMPTY		= 0;
	DUMP		= 1;
}

CRIU dump request

criu_dump_req is used to store dump options.

message criu_dump_req {
	required int32 images_dir_fd	= 1;
	optional int32 pid		= 2;

	optional bool leave_running	= 3;
	optional bool ext_unix_sk	= 4;
	optional bool tcp_established	= 5;
	optional bool evasive_devices	= 6;
	optional bool shell_job		= 7;
	optional bool file_locks	= 8;
	optional int32 log_level	= 9 [default = 2];
}

If no pid is set, CRIU will dump client process by default. Note: Whole tree <pid> must have the same uid, as a client, or client's uid must be == 0, otherwise CRIU won't dump nothing at all.

Only images_dir_fd is required, all other fields may not be set. Client must open directory for images by himself and set images_dir_fd to it's fd. CRIU will open /proc/<client's_pid>/fd/<images_dir_fd>, so it will work, if client is in another namespace.

For other options description, please run "criu -h".

CRIU response

criu_resp is a wrapper for responses. It consists of success bool field, response type field and response, that depends on sent request type.

message criu_resp {
	required criu_req_type type	= 1;
	required bool success		= 2;

	optional criu_dump_resp	dump	= 3;
}

CRIU dump response

criu_dump_resp is used to store response from CRIU.

message criu_dump_resp {
	optional bool restored		= 1;
}

Field "restored" is set to "true" if process was restored.

Server

On a server side, CRIU creates SOCK_SEQPACKET Unix socket and listens for connections on it. After receiving criu_req, CRIU processes it, do what is requested and sends response back.

To launch service server run:

#criu service --address <socket_address>

If no address is set, "/tmp/criu_service.socket" is used by default. You may also like to demonize server(-d), set log level(-v<N>) or set log file(-o <logname>). For the full list of options, please run "criu -h".

Client

Client, in its turn, must connect to service socket, send criu_msg with request in it, and wait for a criu_resp with response. You can find examples of client programs in C and Python in test/rpc/.