我有关于使用criu和docker进行实时检查点和恢复的问题。
目前我正在使用ubuntu 16.04,我想实现一项功能 使用户检查他们当前的游戏应用程序状态。 例如,用户可以在玩游戏时随时检查点。 但是,当我尝试在sfml编写的游戏中使用criu dump时,它失败了。
更具体地说,我在ubuntu 16.04下使用了sfml和criu 2.x编写的游戏。当我开始游戏时,我尝试使用criu提供的转储功能,如下所示:
criu dump -D img -t 2833 --shell-job --tcp-established --ext-unix-sk --external unix[33323] --external unix[33326] --external unix[33316] --external unix[33317]
似乎criu内存和文件转储不支持实时检查某些特定设备,例如路径为/dev/dri/card0
的视频卡。
因此,我修改了criu源代码,使其跳过部分设备
当遇到一些不受支持的设备时:
criu/parse_proc.c, line 721
但是,当我尝试使用以下命令恢复时发生错误:
criu restore -D img -t 2833 --shell-job --tcp-established --ext-unix-sk --inherit-fd fd[10]:socket:[33326] --inherit-fd fd[3]:socket:[33316] --inherit-fd fd[7]:socket:[33317] --inherit-fd fd[8]:pipe:[33323] --inherit-fd fd[9]:pipe:[33323]
错误消息显示:
错误(criu / files.c:1477):无法继承fd 10:错误的文件 描述符
我认为docker也无法处理它,因为它的实时检查点机制是建立在criu之上的。 我想知道是否有任何可能的方法来处理它或它 有没有人在码头工作之前做过这样的事情?
由于
答案 0 :(得分:0)
使用Docker CLI进行检查点和恢复更容易,问题更少。 您可以尝试:https://forums.docker.com/t/docker-checkpoint-restore-on-another-host/27427/2和https://github.com/docker/cli/blob/master/experimental/checkpoint-restore.md
具体来说,必须启用docker中的实验模式。检查点:
UNSAFE ASSEMBLY
还原:
sudo docker checkpoint create --checkpoint-dir=<dir-checkpoint-files> <container-ID> <checkpoint-name>
我尝试使用criu进行检查点和恢复;然而,它引起了很多像你这样的问题。