Linux操作系统-软件包管理
Linux 软件包管理实战:RPM、YUM 与源码编译
引言
“怎么装个软件这么麻烦?”
这大概是很多 Linux 新手最头疼的问题。在 Windows 上,双击 .exe 一路 Next 就完事了;在 macOS 上,拖进 Applications 文件夹就行。但到了 Linux 世界,你可能会遇到 .rpm 文件、yum install、./configure && make && make install……一套组合拳下来,人都懵了。
其实,Linux 的软件安装方式虽然多样,但背后有一套清晰的逻辑。今天我们就来彻底搞懂 Linux 软件包管理的三大流派:RPM(底层包管理)、YUM/DNF(依赖自动解决) 和 源码编译(高度定制)。掌握了这些,你就能在 Linux 上“想装什么就装什么”,不再被安装问题卡住。
一、软件包管理的基本概念
在深入了解具体工具之前,先搞清楚几个基本概念:
什么是软件包? 软件包是预先编译好的二进制程序、配置文件和元数据(如软件名、版本、依赖关系)的归档文件。它让你不用自己编译源码,直接安装即可使用。
Linux 软件包管理的发展脉络:
- 手工安装时代:下载源码,手动
./configure && make && make install。问题是依赖关系需要自己解决,安装和卸载都很痛苦。 - RPM/DPKG 时代:有了包管理工具,能记录已安装文件、版本信息,支持查询和卸载。但依赖地狱(安装 A 需要 B,B 需要 C……)依然存在。
- YUM/APT 时代:引入了仓库和自动依赖解析,一条命令安装,所有依赖自动搞定。
- 容器时代(Snap/Flatpak 等):进一步隔离环境,但不在本文讨论范围。
我们今天重点讲 RPM(Red Hat 系,包括 RHEL/CentOS/Fedora)、YUM(RPM 的前端)、以及 源码编译。Debian/Ubuntu 系的 APT 和本文的 YUM 是平行概念,原理相通。
二、RPM:Linux 软件包的“地基”
RPM(Red Hat Package Manager)是 Red Hat 系 Linux 发行版的核心包管理工具。它直接操作 .rpm 文件,能安装、升级、卸载、查询软件包。
2.1 RPM 包命名规范
一个典型的 RPM 包文件名如下:
nginx-1.20.1-10.el7.x86_64.rpm
│ │ │ │ │
│ │ │ │ └── 架构(x86_64、noarch等)
│ │ │ └────── 发布号(表示第几次打包)
│ │ └─────────── 操作系统版本(el7=CentOS/RHEL 7)
│ └─────────────────── 软件版本
└───────────────────────── 软件名称
2.2 常用 RPM 命令
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 安装 | rpm -ivh nginx.rpm |
i=install, v=verbose, h=显示进度 |
| 升级 | rpm -Uvh nginx.rpm |
U=upgrade(若已安装则升级,未装则安装) |
| 卸载 | rpm -e nginx |
注意后面跟的是包名,不是文件名 |
| 查询已安装 | rpm -q nginx |
q=query |
| 查询所有已装包 | rpm -qa |
a=all |
| 查询文件归属 | rpm -qf /usr/bin/nginx |
哪个包提供了这个文件 |
| 查询包信息 | rpm -qi nginx |
显示详细描述 |
| 查询包的文件列表 | rpm -ql nginx |
l=list 所有安装的文件 |
| 校验包完整性 | rpm -V nginx |
检查文件是否被篡改 |
实战示例:
# 安装本地 RPM 包(前提是已解决依赖)
rpm -ivh /tmp/mysql-8.0.32-1.el7.x86_64.rpm
# 卸载一个包
rpm -e mysql-8.0
# 查看 nginx 包安装了哪些文件
rpm -ql nginx
# 输出:
# /etc/nginx/nginx.conf
# /usr/sbin/nginx
# /usr/share/nginx/html/index.html
# ...
# 查看 /etc/passwd 属于哪个包
rpm -qf /etc/passwd
# 输出:setup-2.8.71-10.el7.noarch
2.3 RPM 的痛点:依赖地狱
RPM 虽然解决了文件记录和管理的问题,但它有一个致命弱点:不会自动解决依赖。
比如你安装 mysql.rpm,它告诉你“需要 libssl.so.10”,你得手动去找到提供这个库的包(通常是 openssl-libs),先装上它,然后回头再装 MySQL。如果那个包又依赖别的,你就得一层层往下挖——这就是著名的“依赖地狱”。
为了逃离这个地狱,YUM 应运而生。
三、YUM:依赖自动解决的“包管家”
YUM(Yellowdog Updater Modified)是 RPM 的前端工具,它最大的贡献是自动处理依赖关系。你只需告诉 YUM“我要装什么”,它会从软件仓库中下载所需的包及其所有依赖,一并安装。
在 CentOS/RHEL 8+ 中,YUM 已经被 DNF(Dandified YUM)取代,但命令和用法几乎完全兼容,大多数情况下你仍然可以使用 yum 命令(它实际上是 DNF 的软链接)。
3.1 软件仓库(Repository)
YUM 从软件仓库(repo)中获取包。仓库是一个服务器,里面存放了大量的 RPM 包和元数据(依赖关系、文件列表等)。系统默认配置了官方仓库,你也可以添加第三方仓库(如 EPEL、Nginx 官方源)。
仓库配置文件位于 /etc/yum.repos.d/ 目录下,以 .repo 结尾。典型的仓库文件内容:
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/$releasever/Everything/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-$releasever
3.2 YUM 常用命令
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 安装 | yum install nginx |
从仓库安装包及其依赖 |
| 安装本地包 | yum localinstall ./nginx.rpm |
安装本地 RPM,同时解析远程依赖 |
| 升级 | yum update nginx |
升级单个包 |
| 全系统升级 | yum update |
升级所有可升级的包 |
| 卸载 | yum remove nginx |
卸载包及其依赖(慎用) |
| 搜索 | yum search nginx |
在仓库中搜索包名或描述 |
| 查询包信息 | yum info nginx |
查看版本、仓库、大小等 |
| 查看依赖 | yum deplist nginx |
列出该包所需的所有依赖 |
| 查看提供者 | yum provides /usr/bin/nginx |
哪个包提供了某个文件 |
| 清理缓存 | yum clean all |
清除下载的包和元数据缓存 |
| 列出所有可用包 | yum list available |
查看仓库中所有可安装的包 |
| 列出已安装包 | yum list installed |
查看已安装的包 |
| 查看历史 | yum history |
显示安装/卸载历史 |
实战示例:
# 安装 Nginx(自动解决依赖)
yum install -y nginx
# 搜索 nginx 相关包
yum search nginx
# 查看一个包的信息
yum info nginx
# 卸载一个包(连带依赖,需谨慎)
yum remove nginx
# 只下载包不安装(用于离线环境)
yum install --downloadonly --downloaddir=/tmp/ nginx
3.3 YUM 缓存机制与加速
YUM 会将下载的包缓存在 /var/cache/yum/ 目录中。定期清理可以释放空间:
# 清理所有缓存
yum clean all
# 仅清理包文件(保留元数据)
yum clean packages
# 生成软件包缓存
yum makecache
3.4 添加第三方仓库(以 EPEL 为例)
EPEL(Extra Packages for Enterprise Linux)是 Fedora 项目维护的第三方仓库,提供了大量 CentOS/RHEL 官方不包含的软件包。
# CentOS/RHEL 7
yum install epel-release -y
# CentOS/RHEL 8
dnf install epel-release -y
# 之后就可以安装 EPEL 仓库中的包
yum install htop -y
四、源码编译安装:终极定制
虽然 YUM 很方便,但有时你仍然需要源码编译安装。比如:
- 官方仓库版本太旧,想要最新版本
- 软件漏洞修复,官方提供的RPM包版本过低,需要手工编译安装最新版以便修复漏洞
- yum安装的包缺少某些模块,需要开启某些编译选项添加某些模块(如 Nginx 的
--with-http_v2_module) - 软件对性能敏感,需要针对当前 CPU 微架构优化
源码编译的通用三步骤是:
./configure # 检查环境、生成 Makefile
make # 编译源码
make install # 安装到系统目录
4.1 准备工作:安装编译工具链
编译源码通常需要 gcc、make、autoconf、automake 等开发工具。在 Red Hat 系系统中,可以用 YUM 一次性安装:
yum groupinstall "Development Tools" -y
# 或者安装基础编译环境
yum install gcc make autoconf automake libtool -y
很多软件还需要特定的开发库(-devel 包),例如编译 Nginx 需要 PCRE、OpenSSL、Zlib 的开发库:
yum install pcre-devel openssl-devel zlib-devel -y
4.2 源码编译实战:以 Nginx 为例
# 1. 下载源码(从官网或 GitHub)
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
# 2. 查看帮助,了解可选参数
./configure --help
# 3. 配置(指定安装路径、启用模块等)
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--user=nginx \
--group=nginx
# 4. 编译(-j 指定并行任务数,加快速度)
make -j $(nproc)
# 5. 安装(需要 root 权限)
sudo make install
4.3 源码编译的关键配置参数
| 参数 | 含义 | 示例 |
|---|---|---|
--prefix=PREFIX |
安装目录 | --prefix=/usr/local/nginx |
--exec-prefix=EPREFIX |
可执行文件目录 | 通常默认 |
--with-xxx |
启用某个模块 | --with-http_ssl_module |
--without-xxx |
禁用某个模块 | --without-http_geo_module |
--with-xxx=/path |
指定外部依赖路径 | --with-pcre=/usr/local/pcre |
--enable-xxx |
通用启用选项(不同软件不同) | |
--disable-xxx |
通用禁用选项 |
4.4 源码编译的优缺点
| 优点 | 缺点 |
|---|---|
| 可定制性极高,按需裁剪功能 | 编译时间长(尤其大型软件如 MySQL) |
| 可指定最新版本(不受仓库限制) | 升级困难,需手动重新编译 |
可针对 CPU 优化(-march=native) |
依赖关系需手动解决(configure 会检查) |
| 深入理解软件内部结构 | 卸载不干净,需手动删除文件(无 uninstall 目标) |
4.5 编译后的管理小技巧
- 建议将源码编译的软件安装在
/usr/local/或/opt/下,与系统包管理区分。 - 在
/etc/profile.d/中添加 PATH 变量,方便使用自定义安装的命令。 - 编写简单的 systemd service 文件来管理服务(参考《Linux操作系统-服务管理》一节)。
示例:添加自定义 PATH:
echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
source /etc/profile.d/nginx.sh
五、RPM vs YUM vs 源码:一张表看懂怎么选
| 对比维度 | RPM | YUM/DNF | 源码编译 |
|---|---|---|---|
| 依赖处理 | ❌ 手动解决 | ✅ 自动解决 | ❌ 手动解决 |
| 易用性 | ⭐⭐ 需处理依赖地狱 | ⭐⭐⭐⭐⭐ 一条命令搞定 | ⭐⭐ 需要阅读文档 |
| 版本更新 | 手工下载新 RPM | 随时 yum update |
手工下载源码重新编译 |
| 定制性 | 固定编译选项 | 固定编译选项 | 高度可定制 |
| 性能优化 | 通用编译,平台无关 | 通用编译 | 可针对 CPU 优化 |
| 卸载管理 | 通过 rpm -e 干净卸载 |
通过 yum remove |
需手动删除或使用 make uninstall(不保证) |
| 适用场景 | 离线环境、测试单个包 | 日常生产环境 | 需要特定功能、最新版本或性能调优 |
选型建议:
- 日常生产环境 → YUM,省心省力,安全可靠
- 离线环境或测试单个包 → RPM,配合
yum localinstall处理依赖 - 需要最新功能、定制编译选项、或性能要求极高 → 源码编译
六、常见问题与排错指南
Q1:YUM 安装失败,报“没有可用软件包”?
可能原因:
- 包名拼写错误
- 需要先启用特定仓库(如 EPEL)
- 仓库缓存过期
解决方法:
# 清理缓存
yum clean all
# 更新缓存
yum makecache
# 搜索正确包名
yum search keyword
# 安装 EPEL 等第三方仓库
Q2:YUM 安装时提示 GPG key 错误?
原因:仓库的 GPG 签名验证失败(可能源不正确或 key 过期)。
解决方法:
# 临时跳过 GPG 检查(不推荐生产环境)
yum install --nogpgcheck package
# 正确做法:导入对应仓库的公钥
rpm --import https://some-repo.com/RPM-GPG-KEY
Q3:源码编译时 ./configure 报错“xxx not found”?
原因:缺少依赖的开发库(-devel 包)。
解决方法:
# 使用 yum provides 查找缺失的头文件或库属于哪个包
yum provides */libssl.so
# 安装对应的 -devel 包
yum install openssl-devel -y
Q4:make install 后程序找不到库文件(error while loading shared libraries)?
原因:动态链接器未找到新安装的共享库路径。
解决方法:
# 方法1:设置 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
# 方法2(永久):更新 ldconfig 缓存
echo "/usr/local/lib" > /etc/ld.so.conf.d/custom.conf
ldconfig
Q5:RPM 安装冲突,提示“file conflicts with package xxx”?
原因:两个包试图安装同一文件。
解决方法:
- 使用
--replacefiles强制覆盖(慎用) - 或先卸载冲突的包再安装
七、生产环境最佳实践
7.1 优先使用 YUM 安装
只要仓库中有你需要的版本,优先使用 YUM。这样方便后续的安全更新、依赖管理,卸载也干净。
7.2 源码编译时务必保留编译参数
把 ./configure 的参数记录在文档或脚本中,方便日后重新编译或升级。
# 推荐保存配置
./configure --prefix=/usr/local/nginx --with-http_ssl_module ...
# 将上述命令写入 /root/nginx_build.sh
7.3 定期清理 YUM 缓存
yum clean all
7.4 使用 yum history 追踪变更
yum history
# 查看某次操作详情
yum history info 42
# 撤销某次操作
yum history undo 42
7.5 混合使用的注意事项
如果同时用 YUM 和源码编译安装同一个软件,可能出现版本冲突。建议:
- 系统关键软件用 YUM
- 自定义软件用源码,安装在
/usr/local/或/opt/,并调整 PATH 优先级
总结
从 RPM 的“底层包管理”到 YUM 的“自动依赖解析”,再到源码编译的“高度定制”,Linux 软件包管理工具覆盖了从“简单安装”到“深度调优”的全场景。
记住三句话:
- RPM 是“地基”:直接操作 RPM 包,但依赖要自己搞定。
- YUM 是“管家”:自动解决依赖,日常首选,省心省力。
- 源码编译是“高级定制”:满足特殊需求,但复杂度高,需谨慎使用。
掌握了这三种方式,你就能在 Linux 上灵活应对各种软件安装需求——无论是快速部署生产服务,还是追求极致性能的自定义编译。希望这篇文章能帮你理清思路,下次安装软件时不再纠结!
如果你有任何问题或经验分享,欢迎在评论区留言讨论!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)