准确备份+精准还原需按发行版选工具:Debian/Ubuntu用dpkg+apt-mark双轨导出或apt-clone全量快照,RHEL/CentOS用dnf --userinstalled;务必同步源配置、服务状态及第三方包。

导出当前系统已安装的软件包清单并在新机器上复刻,核心是“准确备份 + 精准还原”,不同发行版方法不同,不能混用。关键不在于命令多,而在于选对工具、避开状态陷阱(比如只装依赖没装主包)、保留手动安装痕迹。
Debian/Ubuntu 系统:用 dpkg + apt-mark 组合最稳妥
dpkg --get-selections 只记录包的“安装选择状态”,但不区分是用户主动装的还是作为依赖自动装的。所以推荐双轨备份:
- 导出全部已安装包(含依赖):dpkg --get-selections | awk '$2 == "install" {print $1}' > all_packages.txt
- 单独导出用户明确安装的包(跳过依赖):apt-mark showmanual > manual_packages.txt
- 额外保存源列表和关键配置:cp /etc/apt/sources.list* ./ && dpkg -l | grep '^ii' > package_status_full.txt
在新机还原时:
- 先导入选择状态:sudo dpkg --set-selections
- 再执行安装:sudo apt-get dselect-upgrade -y
- 如只想恢复手动装的包(更干净):xargs -a manual_packages.txt sudo apt install -y
RHEL/CentOS/Fedora 系统:优先用 rpm -qa,辅以 dnf list
rpm -qa 是底层查询,结果稳定、不依赖仓库元数据;dnf list installed 更友好但可能因缓存陈旧漏项。建议以 rpm 为主:
- 导出所有已安装 RPM 包:rpm -qa --queryformat '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' > rpm_packages.txt
- 导出显式安装(非依赖)的包:dnf list installed --userinstalled > user_installed.txt
- 还原时批量安装:xargs -a rpm_packages.txt sudo dnf install -y
注意:dnf reinstall 对单个包有效,但不适用于整表还原;直接 install 能自动处理依赖和版本适配。
跨系统通用建议:别只靠包名,补上关键信息
仅导出包名容易在迁移后出问题,比如:
- 同名包在不同发行版版本差异大(如 nginx 在 Ubuntu 22.04 和 RHEL 9 中来源、模块完全不同)
- 手动 dpkg -i 安装的 .deb 或 rpm -ivh 安装的本地包不会出现在 apt/dnf 记录里
- /etc/apt/sources.list 或 /etc/yum.repos.d/ 缺失会导致 apt-get 或 dnf 找不到包
所以务必同步备份:
- 源配置文件(/etc/apt/sources.list* 或 /etc/yum.repos.d/)
- 关键服务状态(systemctl list-unit-files --state=enabled > enabled_services.txt)
- 第三方语言包(pip3 freeze > requirements.txt、npm list -g --depth=0 > npm_global.txt)
省心方案:用 apt-clone(Debian/Ubuntu 专用)
它不只是导出包名,还会打包 sources.list、APT 首选项、已标记为 hold 的包、甚至部分配置逻辑:
- 安装并备份:sudo apt install apt-clone && sudo apt-clone clone ~/backup
- 生成一个 apt-clone-state-*.tar.gz 文件,含完整环境快照
- 在新机运行:sudo apt-clone restore apt-clone-state-*.tar.gz
注意:它会重写 /etc/apt/sources.list,适合全新系统;若已有配置,建议先备份原文件再操作。


















