Linux rpm 包安装与升级方法

1次阅读

rpm -i 仅安装新包,已存在同名包会报错;rpm -u 自动卸载旧版再安装新版,支持依赖更新、文件覆盖及配置保留。

Linux rpm 包安装与升级方法

rpm -i 和 rpm -U 有什么区别?

安装新包用 rpm -i,升级已有包必须用 rpm -U。用 -i 装已存在同名包会直接报错:package xxx is already installed;而 -U 会自动卸载旧版再装新版,还能处理依赖变更和文件覆盖逻辑。

常见错误:看到“安装失败”就反复试 rpm -i,其实只是包已存在。别硬刚,换 -U 就行。

  • rpm -i 适合首次部署、离线环境批量装基础工具(如 jqhtop
  • rpm -U 是运维日常升级的主力命令,哪怕只改了一个配置文件或补丁版本也该用它
  • 如果旧包被其他包依赖,-U 仍能完成升级,但可能触发依赖冲突警告,得配合 --force--nodeps(慎用)

升级时提示 signature not found 怎么办?

这是 GPG 签名校验失败,不是包损坏。RHEL/centos 默认启用签名验证,遇到自建包、第三方源(比如 mysql 官方 RPM)或内网私有仓库的包时最常见。

解决方式不是关全局校验,而是按需绕过:

  • 临时跳过:加 --nosignature(只跳签名)或 --nodigest(跳摘要),例如 rpm -Uvh --nosignature mysql-community-server-8.0.33-1.el7.x86_64.rpm
  • 导入公钥更稳妥:比如 MySQL 提供了 RPM-GPG-KEY-mysql,用 rpm --import RPM-GPG-KEY-mysql 后就能正常 -U
  • 别用 --force 代替校验绕过——它不解决签名问题,还可能掩盖真实冲突

rpm -Uvh 中的 v 和 h 参数到底要不要加?

v(verbose)和 h(hash)只是输出控制开关,不影响安装逻辑,但对排查很有用。

实际使用中建议始终带上 -vh

  • -v 显示详细过程,比如哪些文件被覆盖、配置文件是否保留(标 ~)、脚本执行顺序(%pre/%post)
  • -h 用 # 进度条反馈,尤其在装大包(如 kerneldocker-ce)时能判断卡在哪——没进度条你根本不知道是慢还是假死
  • 省略它们不是错,但出问题时你会少一半线索。CI/CD 脚本里可以去掉,人工操作别省

升级后服务没重启?别以为 rpm 搞定了

RPM 包里的 %post 脚本理论上会处理服务启停,但现实很骨感:很多包(尤其是第三方)根本不写重启逻辑,或者只在全新安装时启动,升级时静默跳过。

必须手动确认:

  • 查服务状态:systemctl status <code>包名对应的 service 名(比如 httpdnginx
  • 看 rpm 自带的触发器:rpm -q --scripts <code>包名,重点找 %posttrans 或 %post 里有没有 systemctl try-restart
  • 安全做法:升级完立刻 systemctl daemon-reload && systemctl restart <code>服务名,别等用户报故障

最容易被忽略的是配置文件变更——rpm 升级不会自动合并你的自定义配置,老配置保留在 .rpmnew.rpmsave 文件里,得人肉比对。

text=ZqhQzanResources