仅运行 dpkg --get-selections 不足以实现异地容灾级环境复现,必须组合包状态、apt 源与密钥、系统元数据三类信息,并按校验匹配性→替换源→导入密钥→更新索引→设置选择→执行安装顺序还原。

用 dpkg --get-selections 导出软件列表只是第一步,它只记录已安装包的「状态」(如 install 或 deinstall),不包含版本号、依赖关系或 APT 源配置。要真正实现异地容灾级的一站式复现,需配合其他关键信息,否则在新服务器上直接导入可能因源不同、版本冲突或缺少依赖而失败。
导出完整可复现的软件快照
仅运行 dpkg --get-selections 不够。应组合以下三类信息:
-
已安装包及其选择状态:执行
dpkg --get-selections > pkg-selections.list -
APT 源列表与签名密钥:备份
/etc/apt/sources.list和/etc/apt/sources.list.d/全部文件;用apt-key exportall > apt-keys.asc(Debian 10 及更早)或apt-key exportall > apt-keys.asc 2>/dev/null;新版 Debian/Ubuntu(11+)改用sudo apt install -y apt-transport-https && sudo cp -r /etc/apt/trusted.gpg.d/ ./gpg-backup/ -
系统基础元数据:记录发行版代号(
lsb_release -sc)、架构(dpkg --print-architecture)、内核(uname -r),并保存为system-info.txt
在容灾服务器上安全还原环境
还原不是简单导入 selection 列表,必须按顺序执行:
- 先确认目标系统与原系统发行版代号、架构一致(例如都是
jammy+amd64),否则dpkg --set-selections会静默跳过不匹配包 - 替换
/etc/apt/sources.list及sources.list.d/内容,并导入对应 GPG 密钥(新版用sudo cp ./gpg-backup/* /etc/apt/trusted.gpg.d/) - 运行
sudo apt update确保源可用;若报 GPG 错误,检查密钥是否完整、时间是否同步 - 加载 selection 列表:
sudo dpkg --set-selections ,再执行 <code>sudo apt-get dselect-upgrade -y—— 这步才是真正触发安装/卸载,且自动处理依赖
规避常见失效场景
以下情况会导致复现失败,需提前干预:
-
第三方或本地安装的 deb 包:
dpkg --get-selections会列出它们,但新服务器无对应 .deb 文件或源,dselect-upgrade将报错「Package not found」。解决方法:导出时用dpkg -l | awk '$1 ~ /^ii$/ {print $2}' | xargs apt download 2>/dev/null批量下载 deb(需提前配置好源),或改用apt list --installed > pkg-list-full.txt辅助人工核查 -
被标记为 hold 的包:这些包不会被
dselect-upgrade升级或重装。检查命令:dpkg --get-selections | grep hold,还原前建议取消(echo "package install" | sudo dpkg --set-selections)或记录策略 -
配置文件差异:
dpkg --get-selections不备份/etc下配置。若需完整容灾,应额外使用etckeeper或rsync -aHAX /etc/ /backup/etc/
进阶建议:封装为可重复脚本
把上述流程写成脚本可提升可靠性:
- 导出脚本(
snapshot-export.sh)自动打包pkg-selections.list、sources/、gpg-backup/、system-info.txt为debian-snapshot-$(date +%F).tar.zst - 还原脚本(
restore-remote.sh)校验目标系统匹配性,提示缺失源或密钥,分步执行并记录日志(apt-get dselect-upgrade -y 2>&1 | tee restore.log) - 对关键业务服务器,建议在 CI 环境中用
debootstrap拉起临时 chroot,测试 snapshot 脚本能否成功构建等效环境











