本节摘要:CRIU(Checkpoint/Restore In Userspace)让 Podman 把运行中的容器整棵进程树冻结成磁盘快照、稍后在同机或异机复活——冷迁移、调试存档、快速预热的底层能力。本节实操完整一轮检查点与恢复,讲清它对运行时与内核的要求,最后沿对比方法看三条演进线:Wasm 集成、供应链安全深化、工具家族的继续组合。
容器快照这个词常被滥用——镜像保存的是文件系统状态,检查点保存的是执行状态:进程树的内存、寄存器、打开的文件、TCP 连接进度。恢复后进程从被冻结的那一刻继续,不是重启。这是它与"commit 成镜像再 run"的本质差别,也是它在容器引擎里最稀缺的能力(Docker 至今没有一等公民级的集成,Podman 是集成最深的):
# 前提:内核支持与 CRIU 工具就位(多数发行版需要装 criu 包, # 且 rootless 检查点要求较新的内核) sudo dnf install -y criu # 或 apt install criu # 容器:一个正在累积状态的长任务 podman run -d --name counter alpine:3.19 \ sh -c 'i=0; while true; do i=$((i+1)); echo $i; sleep 1; done' podman exec counter tail -1 # 37(当前计数值——这就是"活状态") # 打检查点(rootful 演示;rootless 需较新内核) sudo podman container checkpoint counter -e /tmp/counter-checkpoint # -e 导出检查点目录,容器被冻结并停止 # 恢复——在同一台机器上 sudo podman container restore -i /tmp/counter-checkpoint podman exec counter tail -1 # 38(从 37 之后继续,计数没有从零开始——执行状态被完整复活)
两处容易踩的坑记录如下:其一,恢复对镜像与配置的一致性有要求(异机恢复时目标机要有同一镜像),文件系统差异过大会在恢复时校验失败;其二,TCP 连接的状态恢复涉及网络栈配合,跨机恢复长连接场景要在同网段或做地址规划,纯计算型负载(批处理、仿真)则是检查点的甜区。第三处坑更隐蔽,值得单独点名:检查点导出的目录里含着进程内存的完整镜像——里面的数据是什么敏感级别,取决于容器里跑的是什么。数据库容器打检查点,等于把内存中的缓存、连接凭据、会话数据整体落盘;这类归档要按敏感数据的等级对待(加密存储、限定访问、用完即删),别把它当成普通的技术工件随手 scp。安全属性跟着数据走,不跟着文件后缀走。
用法一,冷迁移:把开发机上调试到一半的容器(装了一堆临态依赖、跑到某个中间状态)整体搬到服务器继续——传统做法要"重启加重放",检查点直接搬"正在跑的现场"。用法二,调试存档:复现型 bug 的现场(内存里正是出错前一刻的状态)打成检查点存档,开发者反复恢复同一个现场调试——比"重新触发 bug"可靠得多。用法三,快速预热:JVM 类应用启动预热几分钟才到高性能状态,可以在预热完成后打检查点,之后每个新实例从检查点恢复而非冷启动——冷启动优化的另一条思路(第 9.2 节的补充牌)。

全册的方法论最后一次亮相——每条演进线都先问"它回应什么痛点"。
Wasm 集成。痛点坐标:Linux 容器的隔离粒度绑定内核机制,启动开销以进程计,镜像以十兆计;Wasm 的隔离在字节码层面,模块以千字节计、启动以毫秒计。Podman 家族的态度是并轨不替换:wasm 工件可以像容器一样被 podman run(依托 runwasi 类运行时把 Wasm 当另一种 OCI 负载),第 8 章的 Pod 与 systemd 机制照用。适合盯的场景:函数式短任务、插件化扩展;不适合指望它替换 Linux 容器跑有状态服务。
供应链安全深化。痛点坐标:第 6.3 节的签名体系覆盖"镜像层完整",但"镜像内容里的漏洞与 SBOM(软件物料清单)"要靠链路上的更多环节。趋势是签名、扫描、清单生成进一步进家族工具链的默认路径(skopeo 与 buildah 的输出里越来越多携带元数据的钩子)。给读者的动作建议:现在就把 digest 锁定与签名验证落进 CI(第 4.1 与 6.3 节的方案),后续增强都是在这块地基上加层。
工具家族的继续组合。痛点坐标:单体引擎的历史证明"一个进程包办一切"的运维代价;家族化拆分的代价是"认知成本前置"(第 3 章的转折点)。可预期的方向是把组合做得更顺——Quadlet 族文件继续吸收新负载类型、compose 兼容层向 Compose Spec 对齐、play kube 跟进 K8s 字段覆盖。对使用者的含义:按家族思维投资学习(每件工具一个心智模型),比押注某个单一工具的版本特性更抗变。
背景:一台共享 GPU 服务器上的强化学习训练要跑两周,期间机器必须腾给一个更高优先级的任务三天。操作:训练容器打检查点(注意设备直通场景的检查点要求——GPU 状态的完整冻结依赖较新内核与运行时配合,此案例为纯 CPU 训练避开了这一点);容器停止、资源让出;三天后从检查点恢复,训练从断点继续。结果:训练任务无重跑损失,总完成时间只多了三天暂停。解读:这类"可暂停的计算负载"是检查点的教科书场景——状态全部在进程内存里,没有外部交互依赖。变式:若是 GPU 负载,退回"应用层断点"方案(训练框架自身的 checkpoint 机制),容器层检查点对设备直通的支持仍在成熟中——知道边界,两条路都留着。