Difference between revisions of "RPC"
Line 4: | Line 4: | ||
Well described here: [[Self_dump]]. | Well described here: [[Self_dump]]. | ||
− | == | + | == CRIU request == |
− | + | criu_req is used to wrap requests to provide compatibility with an older versions of rpc. | |
− | There | + | Any request must be wrapped into criu_req to send to criu. |
− | === | + | |
− | criu_dump_req is used to store dump options | + | <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 = | + | required int32 images_dir_fd = 1; |
− | optional bool leave_running = | + | optional int32 pid = 2; |
− | optional bool ext_unix_sk = | + | |
− | optional bool tcp_established = | + | optional bool leave_running = 3; |
− | optional bool evasive_devices = | + | optional bool ext_unix_sk = 4; |
− | optional bool shell_job = | + | optional bool tcp_established = 5; |
− | optional bool file_locks | + | optional bool evasive_devices = 6; |
− | + | 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". | ||
− | === | + | == 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 { | ||
− | + | optional bool restored = 1; | |
− | optional bool restored = | ||
} | } | ||
</pre> | </pre> | ||
Field "restored" is set to "true" if process was restored. | Field "restored" is set to "true" if process was restored. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Server == | == Server == | ||
− | On a server side, CRIU creates SOCK_SEQPACKET Unix socket and listens for connections on it. After receiving | + | 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 | + | 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/.