Linux更新软件时保留自定义配置的关键在于理解各包管理器对配置文件的识别与处理机制:APT生成.dpkg-dist、DNF/YUM生成.rpmnew/.rpmsave、Pacman生成.pacnew,需结合etckeeper或Ansible等工具实现可审计的配置管理。

Linux 更新软件时保留自定义配置文件,关键不是“跳过覆盖”,而是理解包管理器如何识别、对比和处理配置变更,并在合适环节介入。不同发行系行为差异大,不能一概而论。
APT 系(Debian/Ubuntu):用选项控制升级行为
APT 默认不覆盖已修改的配置文件,但会提示冲突并生成 .dpkg-dist 文件。真正需要干预的是自动升级场景(如无人值守运维):
- 升级时始终保留当前配置:
sudo apt -o Dpkg::Options::="--force-confold" upgrade - 升级时强制使用新配置(慎用):
sudo apt -o Dpkg::Options::="--force-confnew" upgrade - 批量确认所有配置选择(避免交互卡住):
echo 'Dpkg::Options {"--force-confold"};' | sudo tee -a /etc/apt/apt.conf.d/local - 查看某包是否含配置:
dpkg -L nginx | grep /etc;还原旧版可从.dpkg-old复制
DNF/YUM 系(RHEL/CentOS/Fedora):靠 .rpmnew/.rpmsave 自动留痕
RPM 包通过 %config 显式声明配置文件,DNF/YUM 升级时自动检测本地修改并生成备份:
- 升级后查找新增配置:
find /etc -name "*.rpmnew",手动比对合并 - 确认某文件是否由 RPM 管理:
rpm -qf /etc/ssh/sshd_config - 升级时不弹提示、自动保留旧版(仍生成 .rpmnew):
sudo dnf upgrade --assumeno,再人工处理 - 禁用某包升级(长期锁定版本):在
/etc/yum.conf中加exclude=nginx*,或用dnf versionlock插件
Pacman 系(Arch Linux):.pacnew 需主动检查
Pacman 不自动覆盖有改动的配置,但也不会自动提醒——它只在日志中标注“needs attention”,并生成 .pacnew 文件:
- 升级后立即扫描:
find /etc -name "*.pacnew" - 查看某包安装了哪些配置:
pacman -Ql openssh | grep /etc - 结合
diff快速比对:diff -u /etc/pam.d/sshd{,.pacnew} - 建议将
pacman -Syu后自动检查 .pacnew 的逻辑纳入部署脚本或 CI 流程
生产环境加固:配置不可靠,必须外挂追踪机制
仅靠包管理器无法满足审计、回滚、协同变更等要求:
-
etckeeper:把
/etc当 Git 仓库,每次 apt/dnf/pacman 操作前自动 commit,支持 diff、revert、blame -
Ansible:用
copy或template模块统一推送配置,配合checksum校验和backup: yes选项 - 配置即代码(GitOps):所有配置变更走 PR 流程,经 CI 验证后自动部署,避免手工编辑散落各处


















