|
|
Line 22: |
Line 22: |
| == Functionality == | | == Functionality == |
| | | |
− | === Convert images to human-readable and back === | + | === Convert images to JSON and back === |
| This is the replacement for (rather nasty) criu show code. Also this is the way to edit the images before restoring from them. | | This is the replacement for (rather nasty) criu show code. Also this is the way to edit the images before restoring from them. |
| | | |
Line 47: |
Line 47: |
| </pre> | | </pre> |
| | | |
− | So, here is how core file will look like with --format nice:
| |
− | <pre>
| |
− | #CORE
| |
− | #0 core_entry
| |
− | mtype: X86_64
| |
− | thread_info {
| |
− | clear_tid_addr: 0
| |
− | gpregs {
| |
− | r15: 0
| |
− | r14: 19884608
| |
− | r13: 1
| |
− | r12: 0
| |
− | bp: 19879232
| |
− | bx: 0
| |
− | r11: 582
| |
− | r10: 0
| |
− | r9: 0
| |
− | r8: 19879232
| |
− | ax: 61
| |
− | cx: 18446744073709551615
| |
− | dx: 0
| |
− | si: 140733241187376
| |
− | di: 18446744073709551615
| |
− | orig_ax: 61
| |
− | ip: 213251769082
| |
− | cs: 51
| |
− | flags: 582
| |
− | sp: 140733241187336
| |
− | ss: 43
| |
− | fs_base: 140140334651200
| |
− | gs_base: 0
| |
− | ds: 0
| |
− | es: 0
| |
− | fs: 0
| |
− | gs: 0
| |
− | }
| |
− | fpregs {
| |
− | cwd: 895
| |
− | swd: 0
| |
− | twd: 0
| |
− | fop: 0
| |
− | rip: 0
| |
− | rdp: 0
| |
− | mxcsr: 8064
| |
− | mxcsr_mask: 65535
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | st_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 4294967295
| |
− | xmm_space: 4294967295
| |
− | xmm_space: 16777215
| |
− | xmm_space: 16843009
| |
− | xmm_space: 16843009
| |
− | xmm_space: 16843009
| |
− | xmm_space: 4478800
| |
− | xmm_space: 661857632
| |
− | xmm_space: 1869488186
| |
− | xmm_space: 543236212
| |
− | xmm_space: 1970037624
| |
− | xmm_space: 1680696676
| |
− | xmm_space: 775778921
| |
− | xmm_space: 544500071
| |
− | xmm_space: 2019896621
| |
− | xmm_space: 1685417059
| |
− | xmm_space: 1768172901
| |
− | xmm_space: 1747860850
| |
− | xmm_space: 809328999
| |
− | xmm_space: 909327153
| |
− | xmm_space: 1932405306
| |
− | xmm_space: 809334896
| |
− | xmm_space: 909327153
| |
− | xmm_space: 2016291386
| |
− | xmm_space: 1030123635
| |
− | xmm_space: 859517232
| |
− | xmm_space: 14902
| |
− | xmm_space: 0
| |
− | xmm_space: 65
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 4294967295
| |
− | xmm_space: 4294967295
| |
− | xmm_space: 4294967295
| |
− | xmm_space: 4294967295
| |
− | xmm_space: 4294967040
| |
− | xmm_space: 4294967295
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | xmm_space: 0
| |
− | }
| |
− | }
| |
− | tc {
| |
− | task_state: 1
| |
− | exit_code: 0
| |
− | personality: 0
| |
− | flags: 1077960704
| |
− | blk_sigset: 65536
| |
− | comm: "loop.sh"
| |
− | timers {
| |
− | real {
| |
− | isec: 0
| |
− | iusec: 0
| |
− | vsec: 0
| |
− | vusec: 0
| |
− | }
| |
− | virt {
| |
− | isec: 0
| |
− | iusec: 0
| |
− | vsec: 0
| |
− | vusec: 0
| |
− | }
| |
− | prof {
| |
− | isec: 0
| |
− | iusec: 0
| |
− | vsec: 0
| |
− | vusec: 0
| |
− | }
| |
− | }
| |
− | rlimits {
| |
− | rlimits {
| |
− | cur: 18446744073709551615
| |
− | max: 18446744073709551615
| |
− | }
| |
− | rlimits {
| |
− | cur: 18446744073709551615
| |
− | max: 18446744073709551615
| |
− | }
| |
− | rlimits {
| |
− | cur: 18446744073709551615
| |
− | max: 18446744073709551615
| |
− | }
| |
− | rlimits {
| |
− | cur: 8388608
| |
− | max: 18446744073709551615
| |
− | }
| |
− | rlimits {
| |
− | cur: 0
| |
− | max: 18446744073709551615
| |
− | }
| |
− | rlimits {
| |
− | cur: 18446744073709551615
| |
− | max: 18446744073709551615
| |
− | }
| |
− | rlimits {
| |
− | cur: 3898
| |
− | max: 3898
| |
− | }
| |
− | rlimits {
| |
− | cur: 1024
| |
− | max: 4096
| |
− | }
| |
− | rlimits {
| |
− | cur: 65536
| |
− | max: 65536
| |
− | }
| |
− | rlimits {
| |
− | cur: 18446744073709551615
| |
− | max: 18446744073709551615
| |
− | }
| |
− | rlimits {
| |
− | cur: 18446744073709551615
| |
− | max: 18446744073709551615
| |
− | }
| |
− | rlimits {
| |
− | cur: 3898
| |
− | max: 3898
| |
− | }
| |
− | rlimits {
| |
− | cur: 819200
| |
− | max: 819200
| |
− | }
| |
− | rlimits {
| |
− | cur: 0
| |
− | max: 0
| |
− | }
| |
− | rlimits {
| |
− | cur: 0
| |
− | max: 0
| |
− | }
| |
− | rlimits {
| |
− | cur: 18446744073709551615
| |
− | max: 18446744073709551615
| |
− | }
| |
− | }
| |
− | cg_set: 1
| |
− | signals_s {
| |
− | }
| |
− | }
| |
− | thread_core {
| |
− | futex_rla: 0
| |
− | futex_rla_len: 24
| |
− | sched_nice: 0
| |
− | sched_policy: 0
| |
− | sas {
| |
− | ss_sp: 0
| |
− | ss_size: 0
| |
− | ss_flags: 2
| |
− | }
| |
− | signals_p {
| |
− | }
| |
− | }
| |
− | </pre>
| |
− |
| |
− | === Convert to json (and back) ===
| |
− |
| |
− | Same as before, but the human-readable format is JSON
| |
− |
| |
− | '''Status: Ready'''<br>
| |
− | For now, it does it in a dumb way, by just wrapping text_format in brackets and adding commas where needed.
| |
− | Example:
| |
− | <pre>
| |
− | {
| |
− | "magic": "CORE",
| |
− | "0": {
| |
− | "mtype": "X86_64",
| |
− | "thread_core": {
| |
− | "futex_rla_len": "24",
| |
− | "sched_policy": "0",
| |
− | "sched_nice": "0",
| |
− | "futex_rla": "0",
| |
− | "signals_p": {},
| |
− | "sas": {
| |
− | "ss_size": "0",
| |
− | "ss_sp": "0",
| |
− | "ss_flags": "2"
| |
− | }
| |
− | },
| |
− | "pbtype": "core_entry",
| |
− | "thread_info": {
| |
− | "fpregs": {
| |
− | "st_space": [
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0"
| |
− | ],
| |
− | "fop": "0",
| |
− | "rdp": "0",
| |
− | "twd": "0",
| |
− | "mxcsr": "8064",
| |
− | "swd": "0",
| |
− | "rip": "0",
| |
− | "xmm_space": [
| |
− | "0",
| |
− | "0",
| |
− | "4294967295",
| |
− | "4294967295",
| |
− | "16777215",
| |
− | "16843009",
| |
− | "16843009",
| |
− | "16843009",
| |
− | "4478800",
| |
− | "661857632",
| |
− | "1869488186",
| |
− | "543236212",
| |
− | "1970037624",
| |
− | "1680696676",
| |
− | "775778921",
| |
− | "544500071",
| |
− | "2019896621",
| |
− | "1685417059",
| |
− | "1768172901",
| |
− | "1747860850",
| |
− | "809328999",
| |
− | "909327153",
| |
− | "1932405306",
| |
− | "809334896",
| |
− | "909327153",
| |
− | "2016291386",
| |
− | "1030123635",
| |
− | "859517232",
| |
− | "14902",
| |
− | "0",
| |
− | "65",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "4294967295",
| |
− | "4294967295",
| |
− | "4294967295",
| |
− | "4294967295",
| |
− | "4294967040",
| |
− | "4294967295",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0",
| |
− | "0"
| |
− | ],
| |
− | "cwd": "895",
| |
− | "mxcsr_mask": "65535"
| |
− | },
| |
− | "clear_tid_addr": "0",
| |
− | "gpregs": {
| |
− | "gs": "0",
| |
− | "ip": "213251769082",
| |
− | "cx": "18446744073709551615",
| |
− | "cs": "51",
| |
− | "ax": "61",
| |
− | "orig_ax": "61",
| |
− | "di": "18446744073709551615",
| |
− | "es": "0",
| |
− | "gs_base": "0",
| |
− | "r14": "19884608",
| |
− | "r15": "0",
| |
− | "r12": "0",
| |
− | "r13": "1",
| |
− | "r10": "0",
| |
− | "r11": "582",
| |
− | "fs_base": "140140334651200",
| |
− | "bp": "19879232",
| |
− | "dx": "0",
| |
− | "bx": "0",
| |
− | "ds": "0",
| |
− | "ss": "43",
| |
− | "sp": "140733241187336",
| |
− | "r8": "19879232",
| |
− | "r9": "0",
| |
− | "fs": "0",
| |
− | "si": "140733241187376",
| |
− | "flags": "582"
| |
− | }
| |
− | },
| |
− | "tc": {
| |
− | "timers": {
| |
− | "real": {
| |
− | "isec": "0",
| |
− | "vusec": "0",
| |
− | "iusec": "0",
| |
− | "vsec": "0"
| |
− | },
| |
− | "virt": {
| |
− | "isec": "0",
| |
− | "vusec": "0",
| |
− | "iusec": "0",
| |
− | "vsec": "0"
| |
− | },
| |
− | "prof": {
| |
− | "isec": "0",
| |
− | "vusec": "0",
| |
− | "iusec": "0",
| |
− | "vsec": "0"
| |
− | }
| |
− | },
| |
− | "cg_set": "1",
| |
− | "signals_s": {},
| |
− | "blk_sigset": "65536",
| |
− | "exit_code": "0",
| |
− | "rlimits": {
| |
− | "rlimits": [
| |
− | {
| |
− | "max": "18446744073709551615",
| |
− | "cur": "18446744073709551615"
| |
− | },
| |
− | {
| |
− | "max": "18446744073709551615",
| |
− | "cur": "18446744073709551615"
| |
− | },
| |
− | {
| |
− | "max": "18446744073709551615",
| |
− | "cur": "18446744073709551615"
| |
− | },
| |
− | {
| |
− | "max": "18446744073709551615",
| |
− | "cur": "8388608"
| |
− | },
| |
− | {
| |
− | "max": "18446744073709551615",
| |
− | "cur": "0"
| |
− | },
| |
− | {
| |
− | "max": "18446744073709551615",
| |
− | "cur": "18446744073709551615"
| |
− | },
| |
− | {
| |
− | "max": "3898",
| |
− | "cur": "3898"
| |
− | },
| |
− | {
| |
− | "max": "4096",
| |
− | "cur": "1024"
| |
− | },
| |
− | {
| |
− | "max": "65536",
| |
− | "cur": "65536"
| |
− | },
| |
− | {
| |
− | "max": "18446744073709551615",
| |
− | "cur": "18446744073709551615"
| |
− | },
| |
− | {
| |
− | "max": "18446744073709551615",
| |
− | "cur": "18446744073709551615"
| |
− | },
| |
− | {
| |
− | "max": "3898",
| |
− | "cur": "3898"
| |
− | },
| |
− | {
| |
− | "max": "819200",
| |
− | "cur": "819200"
| |
− | },
| |
− | {
| |
− | "max": "0",
| |
− | "cur": "0"
| |
− | },
| |
− | {
| |
− | "max": "0",
| |
− | "cur": "0"
| |
− | },
| |
− | {
| |
− | "max": "18446744073709551615",
| |
− | "cur": "18446744073709551615"
| |
− | }
| |
− | ]
| |
− | },
| |
− | "comm": "\"loop.sh\"",
| |
− | "flags": "1077960704",
| |
− | "task_state": "1",
| |
− | "personality": "0"
| |
− | }
| |
− | }
| |
− | }
| |
− | </pre>
| |
| === Generate core files out of task images === | | === Generate core files out of task images === |
| | | |
This page describes the CRiu Image Tool.
Usage
usage: crit [-h] [-i IN] [-o OUT] [-f {raw,nice}] {decode,encode}
CRiu Image Tool
positional arguments:
{decode,encode} decode/encode - convert criu image from/to binary type
to/from json
optional arguments:
-h, --help show this help message and exit
-i IN, --in IN input file (stdin by default)
-o OUT, --out OUT output file (stdout by default)
-f {raw,nice}, --format {raw,nice}
well-formated output (by default: raw for files and
nice for stdout)
Functionality
Convert images to JSON and back
This is the replacement for (rather nasty) criu show code. Also this is the way to edit the images before restoring from them.
Status: Ready
It uses text_format as a human-readable format for protobuf messages.
Output file is structured like:
With "--format raw":
#<magic value>
#0
<pb entry in text_format>
....
#N
<pb entry in text_format>
With "--format nice":
#<magic name>
#0 <pb entry name>
<pb entry in text_format with tabs>
....
#N <pb entry name>
<pb entry in text_format with tabs>
Generate core files out of task images
All the needed information is in core-$pid.img and pagemap-$pid.img
Status: Not ready
On-the-fly conversion
There's an idea to make CRIU spawn CRIT and read images "through" it, to allow for at-the-restore-time modifications
Status: Not ready
Convert between different image versions
Right now we store the images version in inventory.img and collect info about what's bad with V1 images. If some day we have v2, CRIT will convert from v1. And for backward compatibility we'll use on-the-fly conversion when restoring from old images.
Status: Not ready
Show images statistics
E.g. -- total number of processes, files, memory, sockets, etc.
Status: Not ready
Check/validate images
Check that
- all images are present
- the inter-images IDs are in consistent state
Status: Not ready