22.1 软件管理员简介

22.1.1 Linux 界的两大主流: RPM 与 DPKG

发行版软件管理机制管理指令线上升级
Red Hat / Fedora / CentOSRPMrpm, rpmbuildYUM (yum)
Debian / UbuntuDPKGdpkgAPT (apt-get)

CentOS = RPM 机制 + YUM 线上升级。

22.1.2 什么是 RPM 与 SRPM

RPM (RedHat Package Manager):预先编译好的二进制包 + 元数据数据库。

安装时 RPM 会:

  1. 检查硬盘容量、操作系统版本
  2. 检查依赖属性(需要的前置软件是否已安装)
  3. 若满足则安装,并将信息写入 /var/lib/rpm/ 数据库
特性RPMSRPM
文件格式xxx.rpmxxx.src.rpm
内含程序已编译的 binary未编译的源代码
可直接安装❌ 需先编译成 RPM
可修改编译参数

💡 CentOS 就是社群将 RHEL 释出的 SRPM 重新编译而来的——SRPM 让不同环境也能重新打包。

22.1.3 什么是 i386, i586, i686, noarch, x86_64

RPM 文件名解析:rp-pppoe - 3.11 - 5 .el7.x86_64 .rpm

软件名称 - 版本 - 释出次数 . 硬件平台 . 扩展名
平台说明
i386所有 x86 CPU 通用(最底层兼容),已少见
i686Pentium II / K7 以后,目前 32 位主流
x86_6464 位 CPU(Core 2 / Athlon64 以上),CentOS 7 唯一提供
noarch无硬件限制(通常是 shell script 类)

硬件向下相容:x86_64 的机器可以装 i686 包,但反过来不行。选择匹配平台性能最优。

22.1.4 RPM 的优点

  1. 已编译——免除重新编译的困扰
  2. 安装前检查——硬盘容量、OS 版本等
  3. 内含元数据——版本、依赖、用途、文件列表
  4. 数据库记录——方便升级、移除、查询、验证

22.1.5 RPM 属性相依的克服方式:YUM 线上升级

YUM 的工作原理:

  1. CentOS 将软件放到 YUM 服务器,分析依赖生成清单列表
  2. 清单放入软件库 (repository),记录每个软件的依赖和下载 URL
  3. 用户端执行 yum install 时 → 下载清单到 /var/cache/yum/ → 与本机 RPM 数据库比对 → 一起下载所有需要的依赖 → 通过 RPM 机制安装

不同软件库提供不同类别的软件:原版 (base)、更新 (updates)、第三方 (EPEL) 等。

22.2 RPM 软件管理程序:rpm

RPM 数据库位于 /var/lib/rpm/,这个目录很重要,不要删除!

22.2.1 RPM 默认安装的路径

目录内容
/etc/配置文件
/usr/bin/可执行文件
/usr/lib/动态函数库
/usr/share/doc/使用手册与说明文档
/usr/share/man/man page

22.2.2 RPM 安装 (install)

rpm -ivh package.rpm                           # 标准安装(显示进度条)
rpm -ivh a.rpm b.rpm *.rpm                     # 批量安装
rpm -ivh http://website.name/pkgname.rpm       # 从网络 URL 安装

强制安装选项

选项用途风险
--nodeps忽略依赖问题强制安装软件可能无法正常使用
--replacefiles覆盖已存在的文件覆盖不可逆!
--replacepkgs重新安装已安装的软件
--force= --replacefiles + --replacepkgs
--test仅测试能否安装,不实际安装安全!先测试再正式装
--prefix /path安装到非默认目录
--noscripts不自动执行安装前后脚本

⚠️ 尽量用 -ivh,遇到问题逐项排查,不要直接 --force 暴力安装。

22.2.3 RPM 升级与更新 (upgrade/freshen)

选项说明
-Uvh没装过就安装,装过旧版就升级
-Fvh只升级已安装的软件,未安装的跳过(更适合批量更新)
rpm -Fvh *.rpm   # 批量升级:只升级本机已安装的包

22.2.4 RPM 查询 (query)

rpm -qa                          # 列出所有已安装的软件
rpm -q[licdR] 软件名             # 查询已安装软件信息
rpm -qf /path/to/file            # 反查:此文件属于哪个软件
rpm -qp[licdR] 包文件名.rpm      # 查询未安装的 RPM 包信息
参数含义示例
-q查询软件是否已安装rpm -q logrotate
-qa列出所有已安装软件rpm -qa | grep ^c
-qi详细信息(版本、开发商、描述等)rpm -qi logrotate
-ql列出软件提供的所有文件rpm -ql logrotate
-qc只列配置文件(/etc/ 下的)rpm -qc httpd
-qd只列文档文件(man page 等)rpm -qd logrotate
-qR列出依赖的软件/文件rpm -qR logrotate
-qf反查:文件属于哪个包rpm -qf /bin/sh → bash
-qp[licdR]查询未安装.rpm 文件rpm -qpR xxx.rpm

查询本机已安装软件时不需版本号(从数据库查);查询 .rpm 文件时必须完整文件名。

22.2.5 RPM 验证与数码签章 (Verify/signature)

验证:用 /var/lib/rpm 数据库比对当前文件状态。

rpm -Va               # 验证系统中所有软件
rpm -V 软件名          # 验证特定软件
rpm -Vf /etc/crontab  # 验证某个文件是否被改动
rpm -Vp xxx.rpm       # 验证 RPM 包内的文件

验证输出字符含义

字符含义字符含义
S文件大小变了LLink 路径变了
M权限/类型变了U文件所属人变了
5MD5 指纹变了G文件所属群组变了
D设备代码变了T修改时间变了

文件类型标记c=配置文件、d=文档文件、g=ghost 文件、l=授权文件、r=读我文件。

rpm -Va 发现的 binary program 未预期的变更 → 高度怀疑被入侵!鸟哥曾因此发现 init 被替换。

数码签章 (GPG)

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7   # 安装公钥
rpm -qa | grep pubkey                                  # 查看已安装的公钥
rpm -qi gpg-pubkey-xxx                                 # 查看公钥详情

RPM 安装时自动比对签章,不一致则警告并停止安装。

22.2.6 RPM 反安装与重建数据库 (erase/rebuilddb)

rpm -e 软件名           # 移除(不需要版本号)

⚠️ 由上层往下移除!先移除依赖者,再移除底层库(如先删 rp-pppoe 再删 ppp)。

rpm --rebuilddb         # 重建 RPM 数据库(数据库损坏时使用)

22.3 YUM 线上升级机制

22.3.1 利用 yum 进行查询、安装、升级与移除功能

查询

命令用途
yum search 关键字按关键字搜索软件
yum info 软件名查看软件详细信息
yum list列出所有软件(Installed + Available)
yum list updates列出可升级的软件
yum provides 文件名反查哪个软件提供此文件
yum search raid              # 搜索 RAID 相关软件
yum list pam*                # 列出所有以 pam 开头的软件
yum provides passwd          # 哪个包提供 /usr/bin/passwd

安装/升级/移除

yum install 软件名           # 安装(自动解决依赖!)
yum update 软件名             # 升级特定软件
yum update                   # 升级整个系统
yum remove 软件名             # 移除
yum -y install 软件名         # 跳过确认,直接 yes

yum install 过程:解析依赖 → 列出需要一起安装/升级的包 → [y/d/N] 确认 → 下载 → 安装 → 验证。

22.3.2 yum 的配置文件

配置文件目录/etc/yum.repos.d/*.repo

/etc/yum.repos.d/CentOS-Base.repo 关键字段

[base]                              # 软件库名称(中括号,不可重复)
name=CentOS-$releasever - Base      # 说明文字
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/os/x86_64/   # 软件库实际 URL(最重要!)
mirrorlist=...                      # 映射站台列表(与 baseurl 二选一)
enabled=1                           # 1=启用 0=禁用
gpgcheck=1                          # 是否检查 GPG 签章
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7   # 公钥文件位置

💡 软件库 URL 的关键是下面必须有 repodata/ 目录!

yum repolist all        # 列出所有软件库及启用状态
yum clean all           # 清除所有缓存(修改配置后使用)

22.3.3 yum 的软件群组功能

yum grouplist                        # 列出所有软件群组
yum groupinfo "Scientific Support"   # 查看群组内含哪些软件
yum groupinstall "Development Tools" # 安装整个群组
yum groupremove "Software Group"     # 移除群组

如果 groupinstall 不安装 optional 软件,在 /etc/yum.conf 添加:
group_package_types=default, mandatory, optional

22.3.4 EPEL/ELRepo 外挂软件以及自订配置文件

EPEL (Extra Packages for Enterprise Linux):Fedora 社区维护的第三方软件库。
https://dl.fedoraproject.org/pub/epel/7/x86_64/

ELRepo:专门提供核心/核心模块/虚拟化相关软件(如 NVidia 驱动、最新核心 kernel-ml)。

# 自订 EPEL 配置文件(默认不启用,按需使用)
vim /etc/yum.repos.d/epel.repo
[epel]
name = epel packages
baseurl = https://dl.fedoraproject.org/pub/epel/7/x86_64/
gpgcheck = 0
enabled = 0              # 默认不启用
yum --enablerepo=epel install netcdf R    # 临时启用 EPEL 安装

本机光盘作为软件库

[mycdrom]
name = mycdrom
baseurl = file:///mnt
gpgcheck = 0
enabled = 0
 
yum --enablerepo=mycdrom install software_name

22.3.5 全系统自动升级

echo '10 1 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/cron.d/yumupdate

⚠️ 核心 (kernel) 升级后需重新开机,注意检查登录文件和 root 邮件。

22.3.6 管理的抉择:RPM 还是 Tarball

优先级方式场景
1原厂 RPM + YUM首选!有官方维护期、自动升级、安全可靠
2软件官网 RPM / 软件库原厂不提供但有第三方 RPM(如 EPEL)
3Tarball 安装特殊/冷门软件,单机使用
4Tarball 测试新版想尝试新版但保留旧版(装到 /usr/local)

22.3.7 基础服务管理:以 Apache 为例

江湖口诀——部署一个网络服务的五步骤

1. 安装    → yum install httpd php mariadb-server php-mysql
2. 启动    → systemctl start httpd
3. 开机启动 → systemctl enable httpd
4. 防火墙   → firewall-cmd --add-service="http"; firewall-cmd --permanent --add-service="http"
5. 测试    → 浏览器打开 http://localhost

22.4 SRPM 的使用:rpmbuild (Optional)

22.4.1 利用默认值安装 SRPM 文件 (—rebuild/—recompile)

选项说明
rpmbuild --rebuild xxx.src.rpm编译 + 打包为 RPM → 放在 /root/rpmbuild/RPMS/(不安装)
rpmbuild --recompile xxx.src.rpm编译 + 打包 + 直接安装

22.4.2 SRPM 使用的路径与需要的软件

SRPM 编译过程中的目录(以 root 身份为例):

目录用途
/root/rpmbuild/SPECS/.spec 配置文件(最重要!)
/root/rpmbuild/SOURCES/原始文件(tarball)+ patch + config
/root/rpmbuild/BUILD/编译过程中的暂存档
/root/rpmbuild/RPMS/x86_64/编译完成的 RPM 文件输出位置
/root/rpmbuild/SRPMS/打包好的 SRPM 文件输出位置

22.4.3 配置文件的主要内容 (*.spec)

.spec 文件结构(以 ntp 为例):

# 1. 基本信息
Summary: The NTP daemon and utilities
Name: ntp
Version: 4.2.6p5
Release: 19%{?dist}.1
Source0: http://.../ntp-%{version}.tar.gz     # 源代码下载 URL
Patch1: ntp-4.2.6p1-sleep.patch                # 补丁文件
 
# 2. 依赖需求
Requires: ntpdate = %{version}-%{release}       # 运行时依赖
BuildRequires: libcap-devel openssl-devel ...   # 编译时依赖
 
# 3. 编译流程
%prep                                           # 预处理:解压 + 打补丁
%setup -q
%patch1 -p1
 
%build                                          # 编译:./configure + make
%configure --enable-all-clocks ...
make %{?_smp_mflags}
 
%install                                        # 安装:make install
make DESTDIR=$RPM_BUILD_ROOT install
 
# 4. 文件清单
%files
/usr/sbin/ntpd
%doc /usr/share/doc/ntp-*/COPYRIGHT
 
# 5. 变更记录
%changelog
* Wed Sep 09 2015 VBird Tsai <...> - 4.2.6p5-20.vbird
- build this SRPM to RPM
段落作用
Name/Version/Release决定最终 RPM 文件名:{Name}-{Version}-{Release}.{Arch}.rpm
Requires运行时依赖(安装时检查)
BuildRequires编译时依赖(编译 SRPM→RPM 时检查)
%prep预处理:解压源代码 + 应用 patch
%build编译:就是 ./configure + make
%install安装到 buildroot
%files列出本软件包含的所有文件/目录
%changelog版本更新记录

22.4.4 SRPM 的编译指令 (-ba/-bb)

rpmbuild -ba ntp.spec     # 同时生成 RPM + SRPM
rpmbuild -bb ntp.spec     # 只生成 RPM

22.4.5 一个打包自己软件的范例

# 1. 准备源代码和补丁 → SOURCES/
cp main-0.1.tgz main_0.1_to_0.2.patch /root/rpmbuild/SOURCES/
 
# 2. 编写 .spec → SPECS/main.spec
# 3. 编译
cd /root/rpmbuild/SPECS
rpmbuild -ba main.spec
 
# 4. 安装测试
yum install /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
rpm -qi main && rpm -ql main && main

命令速查表

命令用途
rpm -ivh xxx.rpm安装 RPM(显示进度)
rpm -ivh --test xxx.rpm测试能否安装(不实际装)
rpm -Uvh xxx.rpm升级(未装则安装)
rpm -Fvh *.rpm只升级已安装的软件
rpm -e 软件名移除
rpm -qa列出所有已安装软件
rpm -qi 软件名查看软件详细信息
rpm -ql 软件名列出软件包含的所有文件
rpm -qc 软件名只列配置文件
rpm -qd 软件名只列文档文件
rpm -qR 软件名列出依赖
rpm -qf /path/to/file反查文件属于哪个软件
rpm -qpR xxx.rpm查询未安装包的需求
rpm -V 软件名验证软件文件是否被改动
rpm -Va验证整个系统
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7安装 GPG 公钥
rpm --rebuilddb重建 RPM 数据库
yum search 关键字搜索软件
yum install 软件名安装(自动解决依赖)
yum update升级整个系统
yum remove 软件名移除
yum list / yum list updates列出软件/可更新
yum info 软件名查看软件信息
yum provides 文件名反查文件属于哪个包
yum grouplist / yum groupinstall软件群组管理
yum repolist all列出软件库
yum clean all清除所有缓存
yum --enablerepo=epel install xxx临时启用某软件库安装
rpmbuild --rebuild xxx.src.rpm编译 SRPM 为 RPM
rpmbuild -ba xxx.spec从 spec 生成 RPM + SRPM