如何检查点和恢复 Linux 进程
假设您有一个正在运行的 Linux 进程,并且想要在冻结后捕获其当前快照。然后从快照加载冻结的进程以恢复。这种进程检查点的概念在各种情况下都非常有用。它可以用于进程备份、实时迁移、更快的启动服务等。实际上有一个用户空间工具可以在Linux上执行进程检查点。
名为 criu
的 Linux 命令行实用程序可以检查点并恢复用户空间中的进程。 criu 可以冻结正在运行的进程或进程树,将其状态转储为一组文件,然后从快照恢复冻结的进程。为了让 criu 工作,必须有内核支持来公开有关 Linux 进程的附加信息。幸运的是,上游 Linux 内核 3.9 已经内置了大部分所需的内核支持。因此,您可以在 3.9
及更高版本的内核上轻松运行 criu
。
在本教程中,我将向您展示如何使用 criu
检查点和恢复 Linux 进程。我假设您的系统上已经安装了 Linux 内核 3.9
。
在 Linux 上安装 criu
对于 Ubuntu 或 Debian:
要在 Ubuntu 或 Debian 上安装 criu
,请首先安装以下先决条件。
$ sudo apt-get install libprotobuf-dev libprotoc-dev protobuf-c-compiler libprotobuf-c0 libprotobuf-c0-dev
然后继续构建 criu
,如下所示。
$ wget http://download.openvz.org/criu/criu-0.5.tar.bz2
$ tar xvfvj crtools-0.5.tar.bz2
$ cd crtools-0.5
$ make
一旦构建成功,它将生成一个名为 crtools 的命令行实用程序,用于检查点和恢复 Linux 进程。
检查点并恢复正在运行的进程
要使用 crtools 对正在运行的进程进行检查点,请运行以下命令。
是正在运行的进程的进程 ID。一旦进程检查点成功完成,进程将被终止,其状态将作为一组文件存储在当前目录中。
$ sudo ./crtools dump -t <PID>
要将转储的进程恢复到其原始运行状态:
$ sudo ./crtools restore -t <PID>
请注意,如果正在运行的进程是直接从 shell 启动的,则必须在 crtools
命令中使用 --shell-job
选项,如下所示。
$ sudo ./crtools dump -t <PID> --shell-job
$ sudo ./crtools restore -t <PID> --shell-job
恢复进程时,crtools
命令会等待恢复的进程完成,然后退出。这是因为当 crtools 恢复进程时,crtools 成为该进程的父进程。
如果您想让 crtools
在进程恢复后立即返回,请使用 --restore-detached
选项,如下所示。然后,恢复的进程将重新成为 init
的父级,因此 crtools
可以立即退出。
$ sudo ./crtools restore -t <PID> --shell-job --restore-detached
criu 还支持打开活动 TCP 连接的进程的检查点/重新启动。此功能利用修复模式下的套接字,Linux 内核 3.5
及更高版本支持该模式。
要检查具有活动 TCP 连接的进程:
$ sudo ./crtools dump -t <PID> --tcp-established
要恢复进程及其先前活动的 TCP 连接:
$ sudo ./crtools restore -t <PID> --tcp-established