唔,暂时杂记一下checkpoint/restore,希望以后能回顾并深入认识下目前的问题。

CRIU

CRIU全称“Checkpoint/RestoreinUserspace”,是一个为Linux提供检测点/恢复功能的工具docker checkpoint,主要是对运行中的应用进行冻结(freeze)再基于其在c盘上的所有文件构建检测点,并按照checkpoint恢复冻结时状态并继续运行。CRIU可以运用到场景包括:应用热迁移(livemigration)、快照、远程调试(debugging)等等。CRIU为OpenVZ、LXZ/LXD、Docker等都提供了挺好的支持。

Checkpoint

/proc是一个基于显存的文件系统,包括CPU、内存、分区界定、[I/O地址]、直接显存访问通道和正在运行的进程等等,Linux通过/proc访问内核内部数据结构及修改内核设置等。Checkpoint很大程度上是基于/proc文件系统进行的,主要依赖/proc获取文件描述符信息、管道参数、内存映射等。

Checkpoint通过进程转存器(processdumper)进行以下步骤:

Restore

docker checkpoint_docker checkpoint_docker checkpoint

Restore恢复过程主要进行以下步骤:

CRIUforDocker

Dockercontainer实际上也是一个进程,故CRIU实质上是对容器进程进行checkpoint/restore。

使用之前

源码装CRIU有一丢丢麻烦,记得把官网说的这些库都下完整哦。

docker即使提供了checkpoint,但切换至experimental下才会用,新建/etc/docker/daemon.json文件,(docker的配置文件,默认没有)。

$ echo "{"experimental": true}" >> /etc/docker/daemon.json

docker checkpoint_docker checkpoint_docker checkpoint

$ systemctl restart docker

若该文件参数修改好多,才会起冲突……解决办法:尽量只将自己须要修改的配置参数写入就好,若还冲突,就启动docker时自动指定参数或脚本启动吧。

另外,我使用docker18及以后的版本时,checkpoint未能正常使用,主要出现以下问题:

Error response from daemon: open /var/lib/docker/containers/[CONTAINER_ID]/checkpoints/[CHECKPOINT_ID]/config.json: no such file or directory

Error response from daemon: failed to retrieve OCI runtime container pid: open /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/[CONTAINER_ID]/init.pid: no such file or directory: UNKOWN 

docker checkpoint_docker checkpoint_docker checkpoint

听说是???moby的诱因linux系统界面linux重启命令,但看Stackflow上的问题也还是open的,关掉了一个但觉得他关的莫名其妙;有一个问题下,开发人员说解决了,但还未推到新版本。我的解决办法:试验以后,建议使用较新版本17.06进行checkpoint/restore,可以正常使用,可能18版本(小生年方18,尚已婚娶)太新了膝盖还没站稳。

DockerCLIforcheckpoint

如今可以开始愉快地使用dockercheckpoint了!!DockerCLI提供了checkpoint命令

create

$ docker checkpoint create [OPTIONS] CONTAINER CHECKPOINT

ls

docker checkpoint_docker checkpoint_docker checkpoint

$ docker checkpoint ls CONTAINER

rm无话可说

start

启动时没有单独的命令,但在containerstart可以指定checkpoint选项参数,如将容器从/home/vickee/chkps/目录下的chkp0恢复:

$ docker start --checkpoint chkp0 --checkpoint-dir /home/vickee/chkps/[CONTAINER_FULL_ID]/checkpoints CONTAINER

注意:在创建checkpoint时,若我们指定的路径为/home/PATHdocker checkpoint,则恢复时还须要具体指定到该路径下的/home/PATH/[CONTAINER_FULL_ID]/checkpoints。由于恢复时,我们可能新建容器,或则将另一个容器从别的容器的checkpoint恢复,故需自己按照checkpoint信息进行路径建立。

limitations

CRIU对最新内核的支持有限,且似乎在较新版本中,移不仅--checkpoint-dir即指定目录这一特点。

若容器运行时有用externalterminal(dockerrun-t),checkpoint会失败的。[参数-t让docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开,常一起使用。]

links:

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复