CRIU恢复进程触发段错误失败求助(Ubuntu 22.04环境)
问题描述
在Ubuntu 22.04.4 LTS Jammy系统中执行以下操作:
- 通过
sudo apt-get install criu安装CRIU - 执行
sudo setcap cap_checkpoint_restore+eip /usr/sbin/criu配置权限 - 运行测试脚本
test.sh后,执行转储命令:
dump.log显示转储成功,但执行恢复命令时出错:sudo criu dump -t 281699 -v4 -o dump.log -D test_criu/ --shell-job
错误日志如下:sudo criu restore --shell-job -D test_criu/ -v2 -o restore.log
最终项目需在Docker中使用CRIU,但同样遇到该问题,询问进程无法正常恢复的原因。281699: Error (criu/cr-restore.c:1480): 281777 killed by signal 11: Segmentation fault Error (criu/cr-restore.c:2447): Restoring FAILED. Error (criu/cr-restore.c:1480): 281699 killed by signal 9: Killed
可能的原因及解决方向
CRIU版本兼容性问题
Ubuntu仓库中的CRIU版本可能较旧,存在已知的恢复bug。建议从CRIU官方源码编译安装最新稳定版,避免依赖包管理器提供的旧版本。编译步骤大致为:sudo apt-get install build-essential libprotobuf-dev libprotobuf-c-dev protobuf-compiler protobuf-c-compiler libcap-dev libnl-3-dev libnl-genl-3-dev libnet-dev libaio-dev libgnutls28-dev libpam0g-dev libjson-c-dev libyajl-dev git clone https://github.com/checkpoint-restore/criu.git cd criu make sudo make install安装后重新设置权限:
sudo setcap cap_checkpoint_restore+eip /usr/local/sbin/criuShell作业恢复的环境依赖问题
使用--shell-job参数时,CRIU需要恢复shell的会话上下文,包括终端环境变量、文件描述符、会话组等。如果转储时的终端环境和恢复时的环境差异较大(比如转储时在某个SSH会话,恢复时在另一个终端或Docker容器内),可能导致恢复失败。
建议:- 在与转储时相同的终端环境中执行恢复命令
- 避免在Docker容器内直接恢复宿主机上转储的shell作业,容器的隔离环境会破坏原有的会话上下文
进程状态与资源依赖问题
转储的进程(PID 281699)可能持有一些无法被正确恢复的资源,比如:- 打开的特殊文件(如/dev/下的设备文件、匿名管道、socket连接)
- 与其他进程的IPC关联(如共享内存、信号量)
- 动态加载的库文件路径在恢复环境中不存在
可通过criu check --all检查系统是否满足CRIU运行的所有依赖条件,排查是否有缺失的支持项。
Docker环境的额外限制
Docker容器默认启用了一些安全隔离机制(如seccomp、AppArmor),可能阻止CRIU执行恢复操作。需要调整容器的运行参数:- 启动容器时添加
--privileged参数(仅用于测试,不推荐生产环境) - 或精细配置seccomp规则,允许CRIU所需的系统调用
- 确保容器内安装的CRIU版本与宿主机匹配,且同样配置了
cap_checkpoint_restore权限
- 启动容器时添加
内容的提问来源于stack exchange,提问作者Tjester
相关产品推荐
相关产品推荐

