CRIU(8)
โจ CRIU โจ
okay bestie, welcome to the CRIU Manual, section 8 โ yes, criu(8), the one and only. this is the tool that checkpoints and restores running applications, and i'm gonna walk you through it like we're texting at 2am. ๐ซถ
๐ธ NAME ๐ธ
criu โ checkpoint/restore in userspace ๐
๐ฆ SYNOPSIS ๐ฆ
criu command [option ...]
๐ DESCRIPTION ๐
so like, criu is a tool for checkpointing and restoring running applications. it does this by saving their state as a collection of files (see the dump command) and creating equivalent processes from those files (see the restore command). the restore operation can be performed at a later time, on a different system, or both. literally time travel but for processes, no cap. โณโจ
๐ฅ OPTIONS ๐ฅ
most of the long flags can be prefixed with no- to negate the option (example: --display-stats and --no-display-stats). so if you wanna be a hater, just add no-. ๐
๐ Common options ๐
these ones are applicable to any command. universal besties. ๐ซถ
-v[v...],--verbosityโ bump verbosity up from the default level. with the short option you can stack multiplevs, and each one cranks verbosity up by one. so-vvvis you screaming "tell me EVERYTHING". ๐ญ-vnum,--verbosity=numโ set the verbosity level to num directly. the higher the level, the more output is produced.
the following levels are available:
-v0no output;-v1only errors;-v2above plus warnings (this is the default level);-v3above plus information messages and timestamps;-v4above plus lots of debug.
--configfile โ pass a specific configuration file tocriu. your own personal config, main character energy. ๐--no-default-configโ disable parsing of default configuration files. don't come for the defaults, they're doing their best. ๐--pidfilefile โ write root task, service or page-server pid into a file.-o,--log-filefile โ write logging messages to a file.--display-statsโ during dump, as well as during restore,criucollects some statistics, like the time required to dump or restore the process, or the number of pages dumped or restored. this information is always saved to thestats-dumpandstats-restorefiles, and can be shown usingcrit(1). the--display-statsoption prints out this information on the console at the end of a dump or restore operation. numbers on the screen at the end = the lil dopamine hit. ๐-D,--images-dirpath โ use path as a base directory where to look for sets of image files.--streamโ dump/restore images usingcriu-image-streamer. seehttps://github.com/checkpoint-restore/criu-image-streamerfor detailed usage.--prev-images-dirpath โ use path as a parent directory where to look for sets of image files. this option makes sense in case of incremental dumps. (incremental? we love a glow-up arc. โจ)-W,--work-dirdir โ use directory dir for putting logs, pidfiles and statistics. if not specified, path from the-Doption is taken.--closefd โ close file descriptor fd before performing any actions.-L,--libdirpath โ path to plugins directory.--enable-fs [fs[,fs...]]โ specify a comma-separated list of filesystem names that should be auto-detected. the valueallenables auto-detection for all filesystems.
Note: this option is not safe, use at your own risk. auto-detecting a filesystem mount assumes that the mountpoint can be restored withmount(src, mountpoint, flags, options). when used, dump is expected to always succeed if a mountpoint is to be auto-detected, however restore may fail (or do something wrong) if the assumption for restore logic is incorrect. this option is not compatible with--external dev. โ ๏ธ
--action-scriptscript โ add an external action script to be executed at certain stages. the environment variableCRTOOLS_SCRIPT_ACTIONis available to the script to find out which action is being executed, and its value can be one of the following:pre-dumpโ run prior to beginning a dumppost-dumpโ run upon dump completionpre-restoreโ run prior to beginning a restorepost-restoreโ run upon restore completionpre-resumeโ run when all processes and resources are restored but tasks are stopped waiting for final kick to run. must not fail.post-resumeโ called at the very end, when everything is restored and processes were resumednetwork-lockโ run to lock network in a target network namespacenetwork-unlockโ run to unlock network in a target network namespacesetup-namespacesโ run once root task has just been created with required namespaces. note it is an early stage of restore, when nothing is restored yet, except for namespaces themselvespost-setup-namespacesโ called after the namespaces are configuredorphan-pts-masterโ called after master pty is opened and unlocked. this hook can be used only in the RPC mode, and the notification message contains a file descriptor for the master ptyquery-ext-filesโ called after the process tree is stopped and network is locked. this hook is used only in the RPC mode. the notification reply contains file ids to be added to external file list (may be empty).
--unprivilegedโ this option tellscriuto accept the limitations when running as non-root. running as non-root requirescriuat least to haveCAP_SYS_ADMINorCAP_CHECKPOINT_RESTORE. for details about runningcriuas non-root please consult the NON-ROOT section. (yes you can run it without root, no it's not free, there's lore. ๐)-V,--versionโ print program version and exit.-h,--helpโ print some help and exit.
๐ง pre-dump ๐ง
performs the pre-dump procedure, during which criu creates a snapshot of memory changes since the previous pre-dump. note that during this criu also creates the fsnotify cache which speeds up the restore procedure. pre-dump requires at least -t option (see dump below). in addition, page-server options may be specified.
--track-memโ turn on memory changes tracker in the kernel. if the option is not passed the memory tracker get turned on implicitly. sneaky lil auto-on, she's always watching. ๐- *
--pre-dump-mode=mode* โ there are two mode to operate pre-dump algorithm. thesplicemode is parasite based, whereasreadmode is based onprocess_vm_readvsyscall. thereadmode incurs reduced frozen time and reduced memory pressure as compared tosplicemode. default issplicemode.
๐ dump ๐
performs a checkpoint procedure.
-t,--treepid โ checkpoint the whole process tree starting from pid.-R,--leave-runningโ leave tasks in running state after checkpoint, instead of killing. this option is pretty dangerous and should be used only if you understand what you are doing.
Note: if task is about to run after been checkpointed, it can modify TCP connections, delete files and do other dangerous actions. therefore,criucan not guarantee that the next restore action will succeed. most likely if this option is used, at least the file system snapshot must be made with the help ofpost-dumpaction script.
in other words, do not use it unless really needed. bestie. i'm begging. ๐ญ
-s,--leave-stoppedโ leave tasks in stopped state after checkpoint, instead of killing.--externaltype[id]:value โ dump an instance of an external resource. the generic syntax is type of resource, followed by resource id (enclosed in literal square brackets), and optional value (prepended by a literal colon). the following resource types are currently supported:mnt,dev,file,tty,unix. syntax depends on type. note to restore external resources, either--externalor--inherit-fdis used, depending on resource type.--external mnt[mountpoint]:nameโ dump an external bind mount referenced by mountpoint, saving it to image under the identifier name.--external mnt[]:flagsโ dump all external bind mounts, autodetecting those. optional flags can containmto also dump external master mounts,sto also dump external shared mounts (default behavior is to abort dumping if such mounts are found). if flags are not provided, colon is optional.--external dev[major/minor]:nameโ allow to dump a mount namespace having a real block device mounted. a block device is identified by its major and minor numbers, andcriusaves its information to image under the identifier name.--external file[mnt_id:inode]โ dump an external file, i.e. an opened file that is can not be resolved from the current mount namespace, which can not be dumped without using this option. the file is identified by mnt_id (a field obtained from/proc/pid/fdinfo/N) and inode (as returned bystat(2)).--external tty[rdev:dev]โ dump an external TTY, identified byst_rdevandst_devfields returned bystat(2).--external unix[id]โ tellcriuthat one end of a pair of UNIX sockets (created bysocketpair(2)) with the given id is OK to be disconnected.--external net[inode]:nameโ mark a network namespace as external and do not include it in the checkpoint. the label name can be used with--inherit-fdduring restore to specify a file descriptor to a preconfigured network namespace.--external pid[inode]:nameโ mark a PID namespace as external. this can be later used to restore a process into an existing PID namespace. the label name can be used to assign another PID namespace during restore with the help of--inherit-fd.--freeze-cgroupโ use cgroup freezer to collect processes.--manage-cgroupsโ collect cgroups into the image thus they gonna be restored then. without this option,criuwill not save cgroups configuration associated with a task.--cgroup-propsspec โ specify controllers and their properties to be saved into the image file.criupredefines specifications for common controllers, but since the kernel can add new controllers and modify their properties, there should be a way to specify ones matched the kernel.
the spec argument describes the controller and properties specification in a simplified YAML form:
"c1":
- "strategy": "merge"
- "properties": ["a", "b"]
"c2":
- "strategy": "replace"
- "properties": ["c", "d"]
where c1 and c2 are controllers names, and a, b, c, d are their properties.
note the format: double quotes, spaces and new lines are required. the strategy specifies what to do if a controller specified already exists as a built-in one: criu can either merge or replace such.
for example, the command line for the above example should look like this:
--cgroup-props "\"c1\":\n - \"strategy\": \"merge\"\n - \"properties\": [\"a\", \"b\"]\n \"c2\":\n - \"strategy\": \"replace\"\n - \"properties\": [\"c\", \"d\"]"
(yes the escaping is giving unhinged, no i did not make it up, yes you have to copy it exactly. ๐)
--cgroup-props-filefile โ literally the same as--cgroup-props, except the spec gets read out of file instead of you typing it inline. ๐--cgroup-dump-controllername โ dump a controller by name only, and skip everything else that got auto-discovered (usually through/proc). Obsessed with this one when you just need CRIU to not touch some controllers. ๐--cgroup-yardpath โ instead of letting CRIU try to mount cgroups itself, you hand it a path to a directory that already has the cgroup yard built. Chef's kiss when you don't wanna grantCAP_SYS_ADMINto CRIU. Rules of the game: for every cgroup mount there should be exactly one directory. If there's only one controller in that mount, the dir's name should just be the controller's name. If multiple controllers are comounted, the directory name should have them separated by a comma. ๐
So like, if /proc/cgroups looks like this:
#subsys_name hierarchy num_cgroups enabled
cpu 1 1 1
devices 2 2 1
freezer 2 2 1
then you can create the cgroup yard with these commands:
mkdir private_yard
cd private_yard
mkdir cpu
mount -t cgroup -o cpu none cpu
mkdir devices,freezer
mount -t cgroup -o devices,freezer none devices,freezer
--tcp-establishedโ checkpoint established TCP connections. ๐ค--tcp-closeโ don't dump the state of, or block, established tcp connections (including the connection that's once established but now closed). This is giving "we're not restoring these anyway" energy โ it's useful when tcp connections are not going to be restored. โจ--skip-in-flightโ this one skips in-flight TCP connections. If any TCP connections that are not yet completely established get found, criu ignores these connections, rather than erroring out. The TCP stack on the client side is expected to handle the re-connect gracefully. no cap, that's on the client bestie ๐--evasive-devicesโ use any path to a device file if the original one is inaccessible. She's flexible like that. ๐--page-serverโ send pages to a page server (see thepage-servercommand). ๐ฎ--force-irmapโ force resolving names for inotify and fsnotify watches. ๐--auto-dedupโ deduplicate "old" data in pages images of a previous dump. Heads up: this option implies incremental dump mode (see thepre-dumpcommand). โป๏ธ-l,--file-locksโ dump file locks. But bestie, listen: it is necessary to make sure that all file lock users are taken into dump, so it is only safe to use this for enclosed containers where locks are not held by any processes outside of the dumped process tree. โ ๏ธ--link-remapโ allows linking unlinked files back, if possible. Note that this modifies filesystem during restore, so know what you're doing. ๐ซฃ--timeoutnumber โ set a time limit in seconds for collecting tasks during the dump operation. The timeout is10seconds by default. โฐ--ghost-limitsize โ set the maximum size of deleted file to be carried inside image. By default, up to1Mfile is allowed. Using this option lets you not put big deleted files inside images. The size argument may be postfixed with aK,MorG, which stands for kilo-, mega, and gigabytes, accordingly. ๐ป--ghost-fiemapโ enable an optimization based on fiemap ioctl that can reduce the number of system calls used when checkpointing highly sparse ghost files. This option is enabled by default, and it can be disabled with--no-ghost-fiemap. An automatic fallback toSEEK_HOLE/SEEK_DATAis used when fiemap is not supported. ๐ธ-j,--shell-jobโ allow one to dump shell jobs. This implies the restored task will inherit session and process group ID from the criu itself. This option also allows to migrate a single external tty connection, to migrate applications liketop. If used withdumpcommand, it must be specified withrestoreas well. ๐--cpu-cap [cap[,cap...]]โ specify CPU capabilities to write to an image file. The argument is a comma-separated list of:noneto ignore capabilities at all; the image will not be produced on dump, neither any check performed on restore;fputo check if FPU module is compatible;insto check if CPU supports all instructions required;cputo check if CPU capabilities are exactly matching;allfor all above set.
By default the option is set to fpu and ins. ๐ง
--cgroup-root [controller:]/newrootโ change the root for the controller that will be dumped. By default, criu simply dumps everything below where any of the tasks live. However, if a container moves all of its tasks into a cgroup directory below the container engine's default directory for tasks, permissions will not be preserved on the upper directories with no tasks in them, which may cause problems. ๐--lazy-pagesโ perform the dump procedure without writing memory pages into the image files and prepare to service page requests over the network. When dump runs in this mode it presumes that lazy-pages daemon will connect to it and fetch memory pages to lazily inject them into the restored process address space. This option is intended for post-copy (lazy) migration and should be used in conjunction withrestorewith appropriate options. ๐ฆ--file-validation [mode]โ set the method to be used to validate open files. Validation is done to ensure that the version of the file being restored is the same version when it was dumped. The mode may be one of the following:filesizeโ to explicitly use only the file size check all the time. This is the fastest and least intensive check. ๐๏ธbuildidโ to validate ELF files with their build-ID. If the build-ID cannot be obtained,chksm-firstmethod will be used. This is the default if mode is unspecified. ๐
--network-lock [mode]โ set the method to be used for network locking/unlocking. Locking is done to ensure that tcp packets are dropped between dump and restore. This is done to avoid the kernel sending RST when a packet arrives destined for the dumped process. The mode may be one of the following:iptablesโ use iptables rules to drop the packets. This is the default if mode is not specified. ๐nftablesโ use nftables rules to drop the packets. ๐skipโ don't lock the network. If--tcp-closeis not used, the network must be locked externally to allow CRIU to dump TCP connections. โ ๏ธ
--allow-uprobesโ allow dumping when uprobes vma is present. When used on dump, this option is required on restore as well.
A uprobes vma is automatically created by the kernel once a uprobe is triggered. This mapping is not removed even once the uprobe is deleted. So, even if a process once had uprobes attached to it, and they're removed by the time the process is dumped, this option is still required because criu has no way of knowing whether there are active uprobes or not.
When using this option on restore, make sure the uprobes (if any) active on the dumped processes are still active. Otherwise, when execution reaches a uprobe'd location in any of the restored processes, that process will be sent a SIGTRAP.
As an example, say a uprobe is set at functionfooin the executable of the processp_bar. Whenever execution inp_barreaches functionfoo, the uprobe is triggered. If the uprobe has been triggered at least once, then the kernel will have created the uprobes vma. To dumpp_bar, this option is necessary. After dumping, say the uprobe is deleted. Now, on restoring with this option, once execution reaches functionfoo,SIGTRAPwill be sent to the restoredp_bar. Unless it has a signal handler installed forSIGTRAP, it will be terminated and core dumped. ๐
โจ restore โจ
Restores previously checkpointed processes. The glow-up moment fr fr. ๐
--inherit-fdfd[N]:resourceโ inherit a file descriptor. This option lets criu use an already opened file descriptorNfor restoring a file identified by resource. This option can be used to restore an external resource dumped with the help of--external file,tty,pidandunixoptions.
The resource argument can be one of the following:
tty[rdev:dev]pipe[inode]socket[inode*]*file[mnt_id:inode]path/to/file
Note that square brackets used in this option arguments are literals and usually need to be escaped from shell. ๐
-d,--restore-detachedโ detach criu itself once restore is complete. bye bestie ๐-s,--leave-stoppedโ leave tasks in stopped state after restore (rather than resuming their execution). ๐-S,--restore-siblingโ restore root task as a sibling (makes sense only with--restore-detached). ๐ฏ--log-pidโ write separate logging files per each pid. ๐-r,--rootpath โ change the root filesystem to path (when run in a mount namespace). This option is required to restore a mount namespace. The directory path must be a mount point and its parent must not be overmounted. ๐๏ธ--externaltype[id]:valueโ restore an instance of an external resource. The generic syntax is type of resource, followed by resource id (enclosed in literal square brackets), and optional value (prepended by a literal colon). The following resource types are currently supported:mnt,dev,veth,macvlan. Syntax depends on type. Note: to restore external resources dealing with opened file descriptors (such as dumped with the help of--external file,tty, andunixoptions), option--inherit-fdshould be used. ๐--externalmnt[name]:mountpointโ restore an external bind mount referenced in the image by name, bind-mounting it from the host mountpoint to a proper mount point. ๐--externalmnt[]โ restore all external bind mounts (dumped with the help of--external mnt[]auto-detection). ๐--externaldev[name]:/dev/pathโ restore an external mount device, identified in the image by name, using the existing block device/dev/path. ๐พ--externalveth[inner_dev]:outer_dev@bridgeโ set the outer VETH device name (corresponding to inner_dev being restored) to outer_dev. If optional@bridgeis specified, outer_dev is added to that bridge. If the option is not used, outer_dev will be autogenerated by the kernel. ๐--external macvlan[inner_dev]:outer_devโ restoring an image that's got a MacVLAN device inside it? Then bestie, you must use this one. It tells CRIU whichouter_dev(an existing network device hanging out in the CRIU namespace) the restoredinner_devshould get bound to. No option, no binding, no restore. ๐-J,--join-ns NS:{PID|NS_FILE}[,EXTRA_OPTS]โ restores the process tree inside a namespace that already exists. You can hand over the namespace as a PID or as anNS_FILEpath (for example--join-ns net:12345or--join-ns net:/foo/bar). Right now the supported values forNSare:ipc,net,time,user, anduts. This option does not do PID namespaces โ that's still possible, just via--externaland--inheritfd.EXTRA_OPTSis optional and lets you set UID and GID for the user namespace (like--join-ns user:PID,UID,GID). ๐ซถ--manage-cgroups [mode]โ restores the cgroup configuration tied to a task, straight out of the image. Controllers are always restored in an optimistic way โ if it's already in the system, criu just reuses it, otherwise it creates it. โจ
The mode can be one of these:
- none โ don't restore cgroup properties at all, but the cgroup is required to already exist at the moment of the restore procedure.
- props โ restore cgroup properties, and require the cgroup to pre-exist.
- soft โ restore cgroup properties only if the cgroup was created by criu; otherwise don't restore properties. This is the default when
modeis unspecified. - full โ always restore all cgroups and all their properties.
- strict โ restore all cgroups and their properties from scratch, and require that they are not present in the system.
- ignore โ don't deal with cgroups at all and just pretend they don't exist.
--cgroup-yard pathโ instead of trying to mount cgroups in CRIU, you give it apathto a directory that already has a cgroup yard all set up. For more info, go look in the dump section. ๐--cgroup-root [controller:]/newrootโ changes the root cgroup the controller will be installed into. Leave the controller out and the root becomes the default for every controller you didn't specify.--tcp-establishedโ restore previously dumped established TCP connections. Heads up, this implies the network was locked between the dump and restore phases, so the other side of the connection just notices a kind of lag. ๐ญ--tcp-closeโ restore connected TCP sockets in the closed state.--veth-pair IN=OUTโ the correspondence between the outside and inside names of veth devices.-l,--file-locksโ restore file locks from the image. ๐ฅ--lsm-profile type:nameโ pick an LSM profile to be used during restore. Thetypecan be eitherapparmororselinux.--lsm-mount-context contextโ sets a new mount context to be used during restore.
This option will only replace existing mount context information with the one you specified. Mounts that don't have the context= option will not be changed.
So if a mountpoint was checkpointed with an option like
context="system_u:object_r:container_file_t:s0:c82,c137"
you can change it using
--lsm-mount-context "system_u:object_r:container_file_t:s0:c204,c495"
and the result is that the mountpoint gets restored with the new context=. Super handy if you're using selinux and the labels need to change on restore โ like when a container gets restored into an existing Pod. ๐
--auto-dedupโ the second a page is restored, it gets punched out from the image.-j,--shell-jobโ restore shell jobs, aka inherit the session and process group ID from the criu itself.--cpu-cap [cap[,cap...]]โ says which CPU capabilities must be present on the CPU the process is restoring on. To inverse a capability, prefix it with^. This option implies that--cpu-capwas passed on dump as well โ except in thefpuoption case. Thecapargument can be any of these (or a set of comma-separated values):- all โ require all capabilities. This is the default mode when
--cpu-capis passed without arguments. Most safe mode. - cpu โ require the CPU to have all capabilities in the image to match the runtime CPU.
- fpu โ require the CPU to have a compatible FPU. For example, the process might be dumped with
xsavecapability but you attempt to restore without it present on the target CPU โ in that case we refuse to proceed. This is the default mode if--cpu-capis not present in the command line. Note this argument might be passed even if no--cpu-capwas specified on the dump, because FPU frames are always encoded into images. - ins โ require CPU compatibility on the instructions level.
- none โ ignore capabilities. Most dangerous mode. The behaviour is implementation dependent. Try not to use it until it's really required. ๐
- all โ require all capabilities. This is the default mode when
For example, this option can be used when --cpu-cap=cpu was used during dump and the images get migrated to a less capable CPU and are to be restored. By default criu shows an error that the CPU capabilities are not adequate, but you can suppress that with --cpu-cap=none.
--weak-sysctlsโ silently skip restoring sysctls that aren't available. This lets you restore on an older kernel, or a kernel that was configured without some options.--lazy-pagesโ restore the processes without filling out the entire memory contents. When this option is used, restore sets up the infrastructure required to fill memory pages either on demand (when the process accesses them) or in the background, without stopping the restored process. This option requires a running lazy-pages daemon. ๐ด--file-validation [mode]โ sets the method used to validate open files. Validation is done to make sure the version of the file being restored is the same version as when it was dumped.
The mode may be one of these:
- filesize โ explicitly use only the file size check, all the time. This is the fastest and least intensive check.
- buildid โ validate ELF files with their build-ID. If the build-ID can't be obtained, the
chksm-firstmethod will be used. This is the default whenmodeis unspecified.
--skip-file-rwx-checkโ skip checking file permissions (r/w/xforu/g/o) on restore. ๐--allow-uprobesโ required when it was dumped with this option. Refer to this option in the section on dumping for more details.
๐ฉบ check โ the kernel vibe check โจ
Checks whether the kernel supports the features criu needs to dump and restore a process tree. ๐ฆ
There are three categories of kernel support, and they go like this. criu check always checks Category 1 features, unless --feature is specified โ which then only checks the one specified feature.
Category 1 ๐
Absolutely required. These are features like support for /proc/PID/map_files, NETLINK_SOCK_DIAG socket monitoring, /proc/sys/kernel/ns_last_pid etc.
Category 2 ๐ธ
Required only for specific cases. These are features like AIO remap, /dev/net/tun and others that are only required if the process being dumped or restored is using them.
Category 3 ๐งช
Experimental. These are features like task-diag that are used for experimental purposes (mostly during development).
If there are no errors or warnings, criu prints "Looks good." and its exit code is 0. ๐
A missing Category 1 feature makes criu print "Does not look good." and its exit code is non-zero. ๐
Missing Category 2 and 3 features make criu print "Looks good but ..." and its exit code is non-zero.
Without any options, criu check checks Category 1 features. You can change that behavior with these options:
--extraโ check kernel support for Category 2 features.--experimentalโ check kernel support for Category 3 features.--allโ check kernel support for Category 1, 2, and 3 features.--feature nameโ check a specific feature. Ifnameislist, a list of valid kernel feature names that can be checked will be printed. ๐
๐ page-server ๐
Launches criu in page server mode. ๐ฆ
--daemonโ runs the page server as a daemon (background process).--status-fdโ write\0to the FD and close it once page-server is ready to handle requests. Thestatus-fdlets you not daemonize a process and still get its exit code at the end. It isn't supposed to be used with--daemonand--status-fdtogether. ๐ซถ--address addressโ page server IP address or hostname.--port numberโ page server port number.--ps-socket fdโ use the provided file descriptor as the socket for incoming connections. In this case--addressand--portare ignored. Useful for intercepting page-server traffic, e.g. to add encryption or authentication. ๐--lazy-pagesโ serve a local memory dump to a remote lazy-pages daemon. In this mode the page-server reads the local memory dump and lets the remote lazy-pages daemon request memory pages in random order.--tls-cacert fileโ specifies the path to a trusted Certificate Authority (CA) certificatefileused for verification of a client or server certificate. The file must be in PEM format. When this option is used, only the specified CA is used for verification. Otherwise, the system's trusted CAs and, if present,/etc/pki/CA/cacert.pemwill be used.--tls-cacrl fileโ specifies a path to a Certificate Revocation List (CRL)file, which contains a list of revoked certificates that should no longer be trusted. The file must be in PEM format. When this option is not specified, the file, if present,/etc/pki/CA/cacrl.pemwill be used.--tls-cert fileโ specifies a path to afilethat contains an X.509 certificate to present to the remote entity. The file must be in PEM format. When this option is not specified, the default location (/etc/pki/criu/cert.pem) will be used.--tls-key fileโ specifies a path to afilethat contains the TLS private key. The file must be in PEM format. When this option is not specified, the default location (/etc/pki/criu/private/key.pem) will be used.--tlsโ use TLS to secure remote connections. ๐ฅ
๐ด lazy-pages ๐ฆ
Launches criu in lazy-pages daemon mode.
okay so the lazy-pages daemon ๐ค is the girlboss in charge of user-level demand paging for the processes you just restored. She pulls everything she needs to fill in the process memory pages from the restore and from the checkpoint directory โ two sources, no cap. And here's the magic โจ: the first time a restored process touches a certain memory page, she swoops in and injects its contents into the process address space. And the pages nobody's asked for yet? She injects those in the background like the multitasking queen she is. ๐
โจ exec โจ
Runs a system call inside a destination task's context. ๐ซถ
lowkey deprecated!! This functionality is deprecated โ please use Compel instead. periodt. ๐
โจ service โจ
Launches criu in RPC daemon mode, where criu is sitting there listening for RPC commands over a socket so it can go do the thing. ๐ง
Why is this iconic? Because it's so convenient for the case where the daemon itself is running in a privileged (superuser) mode but the clients are not. ๐
โจ dedup โจ
Kicks off the pagemap data deduplication procedure ๐งน โ criu scans over all the pagemap files and tries to minimize the number of pagemap entries by obtaining the references from a parent pagemap image. Less is more, bestie. ๐
โจ cpuinfo dump โจ
Fetches the current CPU features and writes them into an image file. ๐ธ Simple. Elegant. Ate.
โจ cpuinfo check โจ
Fetches the current CPU features (i.e. the CPU the criu is running on) and tests if they're compatible with the ones present in an image file. ๐ง Compatibility vibe check, basically.
๐ธ CONFIGURATION FILES ๐ธ
Criu supports usage of configuration files so you don't have to write every single option on the command line every single time โ which is so useful, especially when you're repeating the same options over and over. ๐
You can pass a specific config file with the "--config file" option. If you don't pass one, the default configuration files /etc/criu/default.conf and $HOME/.criu/default.conf get parsed (if they're present on the system, of course ๐ซถ). And if the environment variable CRIU_CONFIG_FILE is set, that one gets parsed too.
The options passed to CRIU via CLI, RPC or configuration file are evaluated in this order, bestie โ don't mess it up:
apply_config(/etc/criu/default.conf)apply_config($HOME/.criu/default.conf)apply_config(CRIU_CONFIG_FILE)apply_config(--config file)apply_config(CLI)orapply_config(RPC)apply_config(RPC configuration file)(only for RPC mode)
Default configuration file parsing can be deactivated with "--no-default-config" if you need that. And parsed configuration files get merged with command line options, which allows overriding boolean options. ๐ฅ
๐ Configuration file syntax ๐
Comments are supported using the '#' sign โ the rest of the line is just ignored, she's not listening. ๐
Options are the same as command line options but without the '--' prefix, and you use one option per line (with the corresponding argument if applicable, divided by whitespaces). If needed, the argument can be provided in double quotes (this should be needed only if the argument contains whitespaces). And in case this type of argument contains a literal double quote as well, it can be escaped using the '\' sign. Usage of commands is disallowed and all other escape sequences are interpreted literally. ๐
Example of configuration file to illustrate syntax:
$ cat ~/.criu/default.conf
tcp-established
work-dir "/home/USERNAME/criu/my \"work\" directory"
#this is a comment
no-restore-sibling # this is another comment
๐ Configuration files in RPC mode ๐
Not only does criu evaluate configuration files in CLI mode โ she also evaluates configuration files in RPC mode. Just as in CLI mode, the configuration file values are evaluated first. Which means any option set via RPC will overwrite the configuration file setting. So the user can change criu's default behavior, but it is not possible to change settings which are explicitly set by the RPC client. ๐ซถ
The RPC client can, however, specify an additional configuration file which will be evaluated after the RPC options (see above for the option evaluation order ๐). The RPC client specifies this additional configuration file via req.opts.config_file = /path/to/file. The values from this configuration file will overwrite all other configuration file settings or RPC options. ๐ฅ
heads up bestie!! This can lead to undesired behavior of criu and should only be used carefully. Not me telling you to be careful twice. ๐ญ
๐ NON-ROOT ๐
criu can be used as non-root with either the CAP_SYS_ADMIN capability or with the CAP_CHECKPOINT_RESTORE capability introduced in Linux kernel 5.9. And just so we're clear: CAP_CHECKPOINT_RESTORE is the minimum that is required. periodt.
criu also needs either CAP_SYS_PTRACE or a value of 0 in /proc/sys/kernel/yama/ptrace_scope (see ptrace(2)) to be able to interrupt the process for dumping. ๐
Running criu as non-root has many limitations and, depending on the process you want to checkpoint and restore, it may not be possible. ngl, that's just how it is. ๐
In addition to CAP_CHECKPOINT_RESTORE it is possible to give criu additional capabilities to enable additional features in non-root mode. โจ Currently criu can benefit from the following additional capabilities:
CAP_NET_ADMINCAP_SYS_CHROOTCAP_SETUIDCAP_SYS_RESOURCE
Note that for some operations, having a capability in a namespace other than the init namespace (i.e. the default/root namespace) is not sufficient. For example, in order to read symlinks in proc/[pid]/map_files CRIU requires CAP_CHECKPOINT_RESTORE in the init namespace โ having CAP_CHECKPOINT_RESTORE while running in another user namespace (e.g. in a container) does not allow CRIU to read symlinks in /proc/[pid]/map_files. ๐ซ
And without access to /proc/[pid]/map_files, checkpointing/restoring processes that have mapped deleted files may not be possible. ๐
Independent of the capabilities, it is always necessary to use "--unprivileged" to accept criu's limitation in non-root mode. No skipping this step, bestie. ๐
๐ฆ EXAMPLES ๐ฆ
To checkpoint a program with pid of 1234 and write all image files into directory checkpoint:
criu dump -D checkpoint -t 1234
To restore this program detaching criu itself:
criu restore -d -D checkpoint
๐ AUTHOR ๐
The CRIU team. ๐ซถ (icons, all of them)
๐ COPYRIGHT ๐
Copyright (C) 2011-2016, Parallels Holdings, Inc.
okay that's the whole page bestie, we made it to the end ๐ฅนโจ this masterpiece comes from the criu source, dated 2026-07-21, and it lives in section CRIU(8) of the manual โ go forth and checkpoint something iconic. no cap. ๐ ๐๐ฆ
๐ฆ where this page comes from
- fedora 43: criu 4.2.1-1.fc43 ยท GPL-2.0-only AND LGPL-2.1-only AND MIT
- fedora 44: criu 4.2.1-1.fc44 ยท GPL-2.0-only AND LGPL-2.1-only AND MIT
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms