Line 1: |
Line 1: |
| This page describes the CRiu Image Tool. | | This page describes the CRiu Image Tool. |
| + | {{Note|As for now(24 Nov 2014) it is not added to the official repo, but you could checkout it [https://github.com/efiop/criu/tree/crit-test here].}} |
| + | |
| + | == Usage == |
| + | <pre>Usage: crit [-h] [-i IN] [-o OUT] [-f {raw,nice}] [-t {json}] {convert} |
| + | |
| + | CRiu Image Tool |
| + | |
| + | positional arguments: |
| + | {convert} use "covert" to convert CRIU image to/from human- |
| + | readable format |
| + | |
| + | 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) |
| + | -t {json}, --type {json} |
| + | Type of output file (by default img is converted to |
| + | txt and vice versa) |
| + | </pre> |
| | | |
| == Functionality == | | == Functionality == |
| | | |
| === Convert images to human-readable and back === | | === Convert images to human-readable 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'''<br> |
| + | It uses [https://developers.google.com/protocol-buffers/docs/reference/python/google.protobuf.text_format-module text_format] as a human-readable format for protobuf messages. |
| + | Output file is structured like: |
| + | With "--format raw": |
| + | <pre> |
| + | #<magic value> |
| + | #0 |
| + | <pb entry in text_format> |
| + | .... |
| + | #N |
| + | <pb entry in text_format> |
| + | </pre> |
| + | With "--format nice": |
| + | <pre> |
| + | #<magic name> |
| + | #0 <pb entry name> |
| + | <pb entry in text_format with tabs> |
| + | .... |
| + | #N <pb entry name> |
| + | <pb entry in text_format with tabs> |
| + | </pre> |
| | | |
− | This is the replacement for (rather nasty) criu show code. Also this is the way to edit the images before restoring from them.
| + | 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) === | | === Convert to json (and back) === |
Line 11: |
Line 309: |
| Same as before, but the human-readable format is JSON | | 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 ";" 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 === |
| | | |
| All the needed information is in core-$pid.img and pagemap-$pid.img | | All the needed information is in core-$pid.img and pagemap-$pid.img |
| + | |
| + | '''Status: Not ready''' |
| | | |
| === On-the-fly conversion === | | === 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 | | 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 === | | === 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. | | 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 === | | === Show images statistics === |
| | | |
| E.g. -- total number of processes, files, memory, sockets, etc. | | E.g. -- total number of processes, files, memory, sockets, etc. |
| + | |
| + | Status: Not ready |
| | | |
| === Check/validate images === | | === Check/validate images === |
Line 32: |
Line 602: |
| * all images are present | | * all images are present |
| * the inter-images IDs are in consistent state | | * the inter-images IDs are in consistent state |
| + | |
| + | '''Status: Not ready''' |