唔,暂时杂记一下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
Restore恢复过程主要进行以下步骤:
CRIUforDocker
Dockercontainer实际上也是一个进程,故CRIU实质上是对容器进程进行checkpoint/restore。
使用之前
源码装CRIU有一丢丢麻烦,记得把官网说的这些库都下完整哦。
docker即使提供了checkpoint,但切换至experimental下才会用,新建/etc/docker/daemon.json文件,(docker的配置文件,默认没有)。
$ echo "{"experimental": true}" >> /etc/docker/daemon.json

$ 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
听说是???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 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: