Difference between revisions of "RPC"
Line 4: | Line 4: | ||
Well described here: [[Self_dump]]. | Well described here: [[Self_dump]]. | ||
− | == | + | == Protobuf messages == |
− | criu_req is | + | criu_req/criu_resp -- wrappers for requests/responses. They are to be used for transferring messages. It is needed to provide compatibility with an older versions of rpc. Field type in them _must_ be set accordingly to type of request/response that is stored. Types of request/response are defined in enum criu_req_type. |
− | |||
+ | === criu_req === | ||
<pre> | <pre> | ||
message criu_req { | message criu_req { | ||
Line 16: | Line 16: | ||
</pre> | </pre> | ||
+ | === criu_req_type === | ||
There is only 1 request/response type for now. | There is only 1 request/response type for now. | ||
<pre>enum criu_req_type { | <pre>enum criu_req_type { | ||
Line 22: | Line 23: | ||
} | } | ||
</pre> | </pre> | ||
− | === | + | === criu_dump_req === |
criu_dump_req is used to store dump options. | criu_dump_req is used to store dump options. | ||
<pre>message criu_dump_req { | <pre>message criu_dump_req { | ||
Line 46: | Line 47: | ||
For other options description, please run "criu -h". | For other options description, please run "criu -h". | ||
− | == | + | === criu_resp === |
− | |||
<pre>message criu_resp { | <pre>message criu_resp { | ||
required criu_req_type type = 1; | required criu_req_type type = 1; | ||
Line 55: | Line 55: | ||
} | } | ||
</pre> | </pre> | ||
− | === | + | === criu_dump_resp === |
criu_dump_resp is used to store response from CRIU. | criu_dump_resp is used to store response from CRIU. | ||
<pre> | <pre> |
Revision as of 18:55, 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.
Protobuf messages
criu_req/criu_resp -- wrappers for requests/responses. They are to be used for transferring messages. It is needed to provide compatibility with an older versions of rpc. Field type in them _must_ be set accordingly to type of request/response that is stored. Types of request/response are defined in enum criu_req_type.
criu_req
message criu_req { required criu_req_type type = 1; optional criu_dump_req dump = 2; }
criu_req_type
There is only 1 request/response type for now.
enum criu_req_type { EMPTY = 0; DUMP = 1; }
criu_dump_req
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_resp
message criu_resp { required criu_req_type type = 1; required bool success = 2; optional criu_dump_resp dump = 3; }
criu_dump_resp
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/.