CRIT
This page describes the CRiu Image Tool. CRIT is a feature-rich replacement for existing "criu show". It is written completely in Python, so it is quite easy to read the code and extend its features.
Usage
usage: crit [-h] {decode,encode,info,x,show} ... CRiu Image Tool positional arguments: {decode,encode,info,x,show} Use crit CMD --help for command-specific help decode convert criu image from binary type to json encode convert criu image from json type to binary info show info about image x explore image dir show convert criu image from binary to human-readable json optional arguments: -h, --help show this help message and exit
Pretty output
Command <decode> prints JSON text in one line. This can be read by any further JSON-aware tool for parsing. For human eyes it's more convenient to read JSON multi-line with indentation. CRIT can do this when using the show
action or the --pretty
option.
Wend doing pretty optput CRIT does a little bit more, than just multiline indented JSON.
- Addresses and registers
- VM addresses and core.img register values are all printed in hex. Since JSON doesn't support this form of numbers, such fields are encoded as strings.
- Bit-fields
- Such things as flags and masks (e.g. sig-block mask) are also better understood when written in hex, so CRIT does this.
- IP addresses
- By default those a printed in decimal, but the "1.2.3.4" for v4 or "::1" for v6 can be seen in the --pretty mode.
- Symbolic names for flags
- Some known bit sets (e.g. MAP_PRIVATE, MAP_ANONYMOUS, etc. for vma->flags) are shown with names.
- Device numbers
- If the field is known to be of
dev_t
type, it's printed in themajor:minor
manner
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.
It uses text_format as a human-readable format for protobuf messages.
The output file is structured in the following way.
Without "--pretty":
{ "magic" : "FOO", "entries" : [{"foo": "bar", "bar": "foo", "extra": "abc"}, {"foo": "bar", "bar" : "foo", "extra" : "abc"} ]}
With "--pretty":
{ "magic" : "FOO", "entries" : [ { "foo" : "bar", "bar" : "foo", "extra" : "abc" }, { "foo" : "bar", "bar" : "foo", "extra" : "abc" } ] }
Example("crit decode -i core-5679.img --pretty")
{ "magic": "CORE", "entries": [ { "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 } }, "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, "xsave": { "ymmh_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, 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 ], "xstate_bv": 2 }, "xmm_space": [ 0, 4278190080, 4294967295, 4294967295, 1701145715, 3219568, 0, 0, 0, 0, 33, 0, 792358505, 1953460082, 1852400175, 0, 942882145, 876295483, 774519349, 1031303283, 893073459, 976565307, 1937255978, 859661936, 993344312, 3814708, 65, 0, 37049520, 0, 37049632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4294901760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "cwd": 0, "mxcsr_mask": 65535 }, "clear_tid_addr": 0, "gpregs": { "gs": "0x0", "ip": "0x7f172cf1ea04", "cx": "0xffffffffffffffff", "cs": "0x33", "ax": "0x38", "orig_ax": "0x38", "di": "0x1200011", "es": "0x0", "gs_base": "0x0", "r14": "0x0", "r15": "0x2355e00", "r12": "0x7ffffdbf74f0", "r13": "0x0", "r10": "0x7f172d83d9d0", "r11": "0x246", "fs_base": "0x7f172d83d700", "bp": "0x7ffffdbf7530", "dx": "0x0", "bx": "0x0", "ds": "0x0", "ss": "0x2b", "sp": "0x7ffffdbf74f0", "r8": "0x0", "r9": "0x0", "fs": "0x0", "si": "0x0", "flags": "0x246" } }, "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": "0x10002", "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": 62844, "cur": 62844 }, { "max": 4096, "cur": 1024 }, { "max": 65536, "cur": 65536 }, { "max": 18446744073709551615, "cur": 18446744073709551615 }, { "max": 18446744073709551615, "cur": 18446744073709551615 }, { "max": 62844, "cur": 62844 }, { "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 } } ] }
Generate core files out of task images
Moved into separate project called criu-coredump.
Show images statistics
E.g. -- total number of processes, files, memory, sockets, etc. Use
crit x $directory_with_images <explore type>
Supported explorers are
- 'ps'
- to show process tree
- 'fds'
- to show files used by tasks
- 'mems'
- to show memory mappings info
Planned functionality
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
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.
Check/validate images
Check that
- all images are present
- the inter-images IDs are in consistent state