22.1 软件管理员简介
22.1.1 Linux 界的两大主流: RPM 与 DPKG
| 发行版 | 软件管理机制 | 管理指令 | 线上升级 |
|---|---|---|---|
| Red Hat / Fedora / CentOS | RPM | rpm, rpmbuild | YUM (yum) |
| Debian / Ubuntu | DPKG | dpkg | APT (apt-get) |
CentOS = RPM 机制 + YUM 线上升级。
22.1.2 什么是 RPM 与 SRPM
RPM (RedHat Package Manager):预先编译好的二进制包 + 元数据数据库。
安装时 RPM 会:
- 检查硬盘容量、操作系统版本
- 检查依赖属性(需要的前置软件是否已安装)
- 若满足则安装,并将信息写入
/var/lib/rpm/数据库
| 特性 | RPM | SRPM |
|---|---|---|
| 文件格式 | xxx.rpm | xxx.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 通用(最底层兼容),已少见 |
| i686 | Pentium II / K7 以后,目前 32 位主流 |
| x86_64 | 64 位 CPU(Core 2 / Athlon64 以上),CentOS 7 唯一提供 |
| noarch | 无硬件限制(通常是 shell script 类) |
硬件向下相容:
x86_64的机器可以装i686包,但反过来不行。选择匹配平台性能最优。
22.1.4 RPM 的优点
- 已编译——免除重新编译的困扰
- 安装前检查——硬盘容量、OS 版本等
- 内含元数据——版本、依赖、用途、文件列表
- 数据库记录——方便升级、移除、查询、验证
22.1.5 RPM 属性相依的克服方式:YUM 线上升级
YUM 的工作原理:
- CentOS 将软件放到 YUM 服务器,分析依赖生成清单列表
- 清单放入软件库 (repository),记录每个软件的依赖和下载 URL
- 用户端执行
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 | 文件大小变了 | L | Link 路径变了 | |
| M | 权限/类型变了 | U | 文件所属人变了 | |
| 5 | MD5 指纹变了 | 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_name22.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) |
| 3 | Tarball 安装 | 特殊/冷门软件,单机使用 |
| 4 | Tarball 测试新版 | 想尝试新版但保留旧版(装到 /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 # 只生成 RPM22.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 |