Linux 软件包管理实战:RPM、YUM 与源码编译

引言

“怎么装个软件这么麻烦?”

这大概是很多 Linux 新手最头疼的问题。在 Windows 上,双击 .exe 一路 Next 就完事了;在 macOS 上,拖进 Applications 文件夹就行。但到了 Linux 世界,你可能会遇到 .rpm 文件、yum install./configure && make && make install……一套组合拳下来,人都懵了。

其实,Linux 的软件安装方式虽然多样,但背后有一套清晰的逻辑。今天我们就来彻底搞懂 Linux 软件包管理的三大流派:RPM(底层包管理)YUM/DNF(依赖自动解决)源码编译(高度定制)。掌握了这些,你就能在 Linux 上“想装什么就装什么”,不再被安装问题卡住。

一、软件包管理的基本概念

在深入了解具体工具之前,先搞清楚几个基本概念:

什么是软件包? 软件包是预先编译好的二进制程序、配置文件和元数据(如软件名、版本、依赖关系)的归档文件。它让你不用自己编译源码,直接安装即可使用。

Linux 软件包管理的发展脉络

  1. 手工安装时代:下载源码,手动 ./configure && make && make install。问题是依赖关系需要自己解决,安装和卸载都很痛苦。
  2. RPM/DPKG 时代:有了包管理工具,能记录已安装文件、版本信息,支持查询和卸载。但依赖地狱(安装 A 需要 B,B 需要 C……)依然存在。
  3. YUM/APT 时代:引入了仓库和自动依赖解析,一条命令安装,所有依赖自动搞定。
  4. 容器时代(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 准备工作:安装编译工具链

编译源码通常需要 gccmakeautoconfautomake 等开发工具。在 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 安装失败,报“没有可用软件包”?

可能原因

  1. 包名拼写错误
  2. 需要先启用特定仓库(如 EPEL)
  3. 仓库缓存过期

解决方法

# 清理缓存
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 软件包管理工具覆盖了从“简单安装”到“深度调优”的全场景。

记住三句话

  1. RPM 是“地基”:直接操作 RPM 包,但依赖要自己搞定。
  2. YUM 是“管家”:自动解决依赖,日常首选,省心省力。
  3. 源码编译是“高级定制”:满足特殊需求,但复杂度高,需谨慎使用。

掌握了这三种方式,你就能在 Linux 上灵活应对各种软件安装需求——无论是快速部署生产服务,还是追求极致性能的自定义编译。希望这篇文章能帮你理清思路,下次安装软件时不再纠结!

如果你有任何问题或经验分享,欢迎在评论区留言讨论!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐