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

rpm -i 和 rpm -U 有什么区别?
安装新包用 rpm -i,升级已有包必须用 rpm -U。用 -i 装已存在同名包会直接报错:package xxx is already installed;而 -U 会自动卸载旧版再装新版,还能处理依赖变更和文件覆盖逻辑。
常见错误:看到“安装失败”就反复试 rpm -i,其实只是包已存在。别硬刚,换 -U 就行。
-
rpm -i适合首次部署、离线环境批量装基础工具(如jq、htop) -
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用 # 进度条反馈,尤其在装大包(如kernel、docker-ce)时能判断卡在哪——没进度条你根本不知道是慢还是假死 - 省略它们不是错,但出问题时你会少一半线索。CI/CD 脚本里可以去掉,人工操作别省
升级后服务没重启?别以为 rpm 搞定了
RPM 包里的 %post 脚本理论上会处理服务启停,但现实很骨感:很多包(尤其是第三方)根本不写重启逻辑,或者只在全新安装时启动,升级时静默跳过。
必须手动确认:
- 查服务状态:
systemctl status <code>包名对应的 service 名(比如httpd、nginx) - 看 rpm 自带的触发器:
rpm -q --scripts <code>包名,重点找 %posttrans 或 %post 里有没有systemctl try-restart - 安全做法:升级完立刻
systemctl daemon-reload && systemctl restart <code>服务名,别等用户报故障
最容易被忽略的是配置文件变更——rpm 升级不会自动合并你的自定义配置,老配置保留在 .rpmnew 或 .rpmsave 文件里,得人肉比对。