apt-clone仅备份已安装软件包状态(含手动/自动标记、版本锁定及dpkg --get-selections级信息),不备份系统文件或配置,适用于同构Ubuntu/Debian系统间快速复现环境,非系统级克隆工具。

apt-clone 不备份系统文件或配置,只精确导出已安装软件包状态(含手动/自动标记、版本锁定、dpkg --get-selections 级别信息),适合跨同构 Ubuntu/Debian 系统快速复现环境。它不替代 dd 或 rsync,也不是“一键重装系统”工具——这点必须先划清边界。
怎么用 apt-clone 生成可迁移的软件包快照
执行 sudo apt-clone clone 时,它实际做了三件事:读取 dpkg --get-selections、抓取 /etc/apt/sources.list 及 /etc/apt/sources.list.d/ 下所有源配置、记录当前发行版 codename(如 focal)和架构(amd64)。备份路径必须是**目录名**,不是文件名:
-
sudo apt-clone clone /backup→ 正确,会在/backup/下生成apt-clone-state-*.tar.gz -
sudo apt-clone clone /backup/state.tar.gz→ 错误,会报No such file or directory,因为clone命令只接受目录路径 - 目标目录需有写入权限;若用普通用户路径(如
~/backup),sudo后仍可能因权限问题导致 tar 写入失败,建议直接用/tmp或/root/backup
为什么 restore 会覆盖 sources.list 且不能跳过
apt-clone restore 的设计逻辑是“重建一致环境”,所以它会强制用备份里的 sources.list 替换当前系统的。这不是 bug,是行为契约:
- 如果当前系统源已被修改(比如加了第三方 PPA),restore 过程中 apt 会按备份里的源列表重新索引,可能导致包版本冲突或
404 Not Found错误 - 没有
--skip-sources或--dry-run参数;想保留现有源,只能先手动备份/etc/apt/sources.list*,restore 完再拷回去(但注意:源不匹配时apt install可能降级或无法满足依赖) - restore 前务必确认目标系统架构和发行版代号(
lsb_release -sc)与备份一致,否则会卡在apt update阶段并报错Invalid release
apt-clone restore 实际做了什么(不止是 apt install)
它不是简单调用 apt install 列表,而是分步执行:
- 解压 tar 包,提取
sources.list并覆盖原文件 - 运行
apt update(严格按备份时的源) - 用
dpkg --set-selections加载包状态,再调用apt-get dselect-upgrade执行安装/卸载 - 自动处理
auto标记:备份里标记为 automatic 的包,在 restore 后仍保持 automatic,避免变成 orphaned - 如果你备份时有 hold 状态的包(
sudo apt-mark hold package-name),restore 后该 hold 依然生效
常见错误现象和绕过方法
最常卡在 E: Unable to locate package xxx 或 dpkg: error processing archive:
-
apt-clone info backup.tar.gz输出里的Distro:和目标机lsb_release -sc不一致 → 比如备份自bionic,却在focal上 restore → 必须换同版本系统,或手动编辑 tar 包内state.json(不推荐) - 备份里含第三方源(如 docker-ce、google-chrome),但目标机网络无法访问对应域名 → 先在目标机
curl -I https://download.docker.com测试连通性,不通就提前配置代理或换镜像源 - restore 中断后残留部分安装 → 不要直接重试,先
sudo apt autoremove && sudo dpkg --configure -a清理状态,再重新 restore
真正麻烦的从来不是命令敲几下,而是源一致性、网络可达性和发行版生命周期匹配——这些没法靠工具自动兜底。


















