K3s导入大型镜像时因服务器崩溃导致提取快照准备失败的问题求助
问题描述
我在使用k3s ctr images import my_image.tar导入大型tar镜像时,服务器突然崩溃了。重启服务器后尝试重新导入,却遇到了如下错误:
unpacking docker.io/library/my_image (sha256:b69c6d6ebdb9517f7a93deede3ccf6380aebbc6a8fa68da14ab06bc1be131423)...ctr: failed to prepare extraction snapshot "extract-774071004-6PJT sha256:6e98c2a3f1228e003bc43b054a526b4bf36783f2ff04b8b6ce12b0beb64055d": failed to stat parent: stat /var/lib/rancher/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/327/fs: no such file or directory: unknown
检查发现/var/lib/rancher/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/327目录确实不存在。运行k3s ctr snapshots tree查看快照树,显示如下结构:
... \_ sha256:594fd317ce6c40c5675454df43ad62b3a50115eb90ab7c9a15f1a4cb6f1115ed \_ sha256:89d2814f8e8a9fb32c126c93e86bc86984ef3483a65d5a53141d56f80bcc12fe \_ extract-662974335-9mi3 sha256:6e98c2a3f1228e003bc43b054a526b4bf36783f2ff04b8b6ce12b0beb64055d
我尝试删除最后两个快照:
k3s ctr snapshots delete sha256:6e98c2a3f1228e003bc43b054a526b4bf36783f2ff04b8b6ce12b0beb64055d k3s ctr snapshots delete sha256:89d2814f8e8a9fb32c126c93e86bc86984ef3483a65d5a53141d56f80bcc12fe
但问题依然存在,有没有大佬能帮忙解决这个问题?
可能的解决方案
根据containerd快照损坏的常见处理逻辑,你可以尝试以下步骤:
清理残留的损坏快照元数据:
先停止k3s服务,避免操作时出现资源占用冲突:systemctl stop k3s进入snapshots存储目录:
cd /var/lib/rancher/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots找到和报错中
sha256:6e98c2a3f1228e003bc43b054a526b4bf36783f2ff04b8b6ce12b0beb64055d相关的快照目录(如果还有残留),以及对应的metadata.json文件,直接删除这些内容。注意别误删其他正常快照的文件。重置containerd快照存储:
如果手动清理无效,可以尝试彻底重置快照存储。操作前记得备份重要的镜像或容器数据,然后执行:systemctl stop k3s rm -rf /var/lib/rancher/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots systemctl start k3s重启服务后重新导入镜像,应该就能正常进行了。
检查overlayfs支持状态:
有时候overlayfs的挂载异常也会引发快照问题,先确认系统是否支持overlayfs:grep overlay /proc/filesystems如果输出显示
nodev overlay说明系统支持。另外可以查看containerd配置文件/var/lib/rancher/k3s/agent/etc/containerd/config.toml中,overlayfs相关的配置项是否正常。
注意事项
- 操作前务必备份
/var/lib/rancher/k3s/agent/containerd目录,避免误操作导致重要数据丢失。 - 重置快照存储后,之前已导入的镜像需要重新导入,确保你有镜像tar包的备份。
备注:内容来源于stack exchange,提问作者Viktor

