criu is an utility to checkpoint/restore a process tree. This page describes how to manually build and install prerequisites and the tool itself.
|Note: Most probably you don't need manual installation, but rather Packages for your distro.|
Protocol Buffers with C Bindings
CRIU uses the C bindings of Google's Protocol Buffers. The easiest approach for most would be to install a distribution packages. RPM package name:
protobuf-c-devel. Debian package name:
Building Protocol Buffers From Source
If you would like to build from source instead of using a package, the Protocol Buffer library can be found at http://code.google.com/p/protobuf/, while the Protocol Buffer C bindings can be found at http://code.google.com/p/protobuf-c/. You can use the following commands to obtain the source code repositories via
git. Note that when cross compiling you will need to compile once for your build machine in order to get a
protoc binary to use in the build process, and build once for each target machine to generate
git svn clone http://protobuf.googlecode.com/svn/trunk protobuf cd protobuf ./autogen.sh ./configure --prefix=`pwd`/`uname -m` make make install cd ..
If you are cross compiling, then you will additionally want to build a version for your target architecture. This example targets AArch64.
cd protobuf ./configure --host=aarch64-linux-gnu --prefix=`pwd`/aarch64 --with-protoc=`pwd`/`uname -m`/bin/protoc make make install cd ..
git svn clone http://protobuf-c.googlecode.com/svn/trunk protobuf-c cd protobuf-c ./autogen.sh ./configure --prefix=`pwd`/`uname -m` PATH="`pwd`/../protobuf/`uname -m`/bin:$PATH" make make install cd ..
Linux kernel v3.11 or newer is required, with some specific options set. If your distribution does not provide needed kernel, you might want to compile one yourself. Note we also have our custom kernel, which might contain some experimental CRIU related patches.
Note you might have to enable
- General setup -> Configure standard kernel features (expert users)
option, which depends on
- General setup -> Embedded system
(welcome to Kconfig reverse chains hell).
The following options must be enabled for CRIU to work:
- General setup -> Checkpoint/restore support
- General setup -> Namespaces support
- General setup -> Namespaces support -> UTS namespace
- General setup -> Namespaces support -> IPC namespace
- General setup -> Namespaces support -> PID namespaces
- General setup -> Namespaces support -> Network namespace
- General setup -> open by fhandle syscalls
- General setup -> Enable eventfd() system call
- General setup -> Enable eventpoll support
- File systems -> Inotify support for userspace
- Executable file formats -> Emulations -> IA32 Emulation
- Networking support -> Networking options -> Unix domain sockets -> UNIX: socket monitoring interface
- Networking support -> Networking options -> TCP/IP networking -> INET: socket monitoring interface
- Networking support -> Networking options -> TCP/IP networking -> INET: socket monitoring interface -> UDP: socket monitoring interface
- Networking support -> Networking options -> Packet socket -> Packet: sockets monitoring interface
- Networking support -> Networking options -> Netlink socket -> Netlink: sockets monitoring interface
- Processor type and features -> Track memory changes
At the moment it's known that CRIU will NOT work if packet generator module is loaded. Thus make sure that either module is unloaded or not compiled at all.
- Networking support -> Networking options -> Network testing -> Packet generator
The iproute2 tool version 3.5.0 or higher is needed for dumping network namespaces.
The latest one can be cloned from iproute2. It should be compiled and a path to ip written in the environment variable
Building CRIU From Source
Get the latest release:
|Version:||3.16.1 "Petrified Puffin"|
|Released:||14 Oct 2021|
Alternatively, use git.criu.org git repository. Clone this repo to test new functionality.
make in the sources root. Please note that the tool only supports x86_64 and ARM architectures.
Checking That It Works
First thing to do is to run
# criu check --ms
At the end it should say "Looks OK", if it doesn't the messages on the screen explain what functionality is missing.
If you're using our custom kernel, then the
--ms option should not be used, in this case CRIU would
check for all the kernel features to work.
You can then try running the ZDTM Test Suite which sits in the