18.1 RPM
18.1.1 软件包的安装方式
普通安装方式
Linux 开发商先在固定的硬件平台与操作系统平台上,把需要安装或升级的软件编译好,然后将相关文件打包成为一个特殊格式的文件,其中还包含了检测系统和所需软件的脚本,并记录该软件提供的所有文件信息。最终发布。
用户下载文件后,使用特定的命令安装,该软件先 按检测安装环境 是否满足,满足则安装。
安装完成后会 把该软件的信息写入软件管理机制 中,以备将来升级、卸载。
当前在 Linux 业内最常见的安装方式为:
- dpkg:Debian Package,Debian 开发,安装包为
.deb
格式。dpkg 是比较底层的工具。 - RPM:Red Hat Package Manager,由 Red Hat 开发,后被很多发行版采用,包括 Fedora,CentOS,SuSE 等。安装包为
.rpm
格式。
dpkg 和 rpm 都无法解决安装环境对其它软件的 依赖 的问题,即如果系统中没有安装特定的软件,该软件就无法正常运行。
在线安装方式
因此,为了解决这个问题,各家开发了 在线安装机制,在安装某一软件时,如果该软件所依赖的其它软件在系统中不存在,则会先在线自动安装它们,待所有这些软件安装完毕之后,再安装目标软件。
在 dpkg 基础上开发了 APT(Advanced Packaging Tool) ,在 RPM 基础上开发了 yum(Yellowdog Updater, Modified),这两种在线安装机制。
📕 dpkg 和 RPM 均是底层的机制,对应发展出来的 APT 和 yum 机制为更高层的机制。
发行版 | 软件管理机制 | 命令 | 在线安装命令 |
---|---|---|---|
Red Hat/Fedora | RPM | rpm,rpmbuild | yum |
Debian/Ubuntu | DPKG | dpkg | apt-get |
CentOS 使用的软件管理机制为 RPM 机制,在线安装使用 yum 命令。
18.1.2 RPM 机制
RPM 是以一种记录数据库的方式将软件安装到 Linux 系统的管理机制,其 RPM 数据库 保存在 /var/lib/rpm/
目录中。
安装软件时,RPM 先检查该软件所需要的其它软件是否有安装,满足则安装,不满足则不安装。安装时把该软件的信息完整地写入 RPM 的数据库中,以便将来的查询、验证和卸载。
RPM 优点
- RPM 已经编译过,打包后更利于传输和安装
- RPM 使用数据库记录 RPM 文件的相关参数,便于升级、移除、查询与验证
- RPM 在被安装之前,先检查系统的磁盘空间、操作系统版本等,可避免文件被错误安装
- RPM 文件包含软件版本信息、依赖软件、软件用途、包含文件等信息,易于了解软件安装时会把这些信息保存到 RPM 数据库中
- RPM 使用数据库记录 RPM 文件的相关参数,便于升级、移除、查询与验证
RPM 缺点
- 软件安装环境必须与打包时的环境一致
- 所依赖的其它软件必须已经安装
- 卸载时,如果先卸载底层软件容易出问题
BRPM / SRPM
一个 RPM 软件包可以包含任意多组文件,最常见的 RPM 文件是 二进制 RPM,即 BRPM,Binary RPM,包含编译好的软件。
另外还有一种 RPM 叫 SRPM,Source RPM,文件中包含 源代码,用来生成软件包。这类的文件在其文件头中含有适当的标签,用来与普通的 RPM 区分开,这样在安装时,其中的文件在安装过程中就会被解压到 /usr/src
目录。SRPM 其扩展名通常为 .src.rpm
。
SRPM 同样含有该软件的依赖说明、以及其它 RPM 该有的文件。与 BRPM 不同的是,其中包含了参数配置文件 configure
和 makefile
。
格式 | 文件名 | 允许直接安装 | 内含程序类型 | 允许修改参数来编译 |
---|---|---|---|---|
BRPM | xxx.rpm | 是 | 已编译的二进制 | 否 |
SRPM | xxx.src.rpm | 否 | 未编译的源代码 | 是 |
RPM 文件命名
RPM 文件名描述了软件的版本、适用的平台、编译发布的次数。

发布次数通常就是编译的次数。
硬件平台:不同的平台设置的参数有所不同。可以针对比较高级的 CPU 进行参数优化。
平台名称 | 说明 |
---|---|
i386 | 几乎适用于所有 x86 平台,不论是旧的 pentum 还是 Intel Core 2 与 K8 系列的 CPU 等,都可以正常的工作。i 指的是 Intel 兼容的 CPU,386 是 CPU 的等级。 |
i586 | 针对 586 等级的计算机进行最优化编译。pentum 第一代 MMX CPU,AMD K5,K6 系列 CPU(socket 7 插槽) 等 |
i686 | pentun II 以后的 Intel 系列 CPU,及 K7 以后的 CPU |
x86_64 | 针对 64 位的 CPU 进行最优化编译,Intel Core 2 以上,AMD Athlon64 以上 |
noarch | 没有硬件等级的限制。这种 RPM 文件通常不包含二进制文件,一般有脚本文件 |
SRPM 文件名
SRPM 文件名通常是这样:foo-2.3.5-1.mga1.src.rpm
其它元素都与 BRPM 相同,只是硬件平台那部分变成了 src
。
Tarball 文件名
而 Tarball 文件名通常是 foo-2.3.5.tar.bz2
。
RPM 软件包的结构
通常情况下,一个 BRPM 软件包里包含共享库、程序、帮助文档等,如:
/usr/lib64/libfoo.so
/usr/bin/foo
/usr/share/doc/foo/README
/usr/share/man/man1/foo.1
SRPM 一般是一个 Tarball,再加上一个 specfile
,也许会有更新补丁等其他文件(如桌面文件或图标),如:
SPECS/foo.spec
SOURCES/foo-2.3.5.tar.bz2
SOURCES/foo-2.3.5-path-to-fix-specific-bug.patch
SOURCES/foo.desktop
SOURCES/foo.png
RPM 默认安装路径
RPM 软件包安装默认的路径:
目录 | 说明 |
---|---|
/etc/ | 配置文件,如 /etc/crontab |
/usr/bin/ | 可执行文件 |
/usr/lib/ | 动态共享库 |
/usr/share/doc/ | 软件使用手册与说明文档 |
/usr/share/man/ | man page |
RPM 数据库
RPM 文件安装完毕后,该软件的信息会被写入 /var/lib/rpm/
目录下的数据库文件中。
之后在软件需要升级时,依靠该数据库来进行版本之间的比较。
借助该数据库可以查询当前系统已安装的软件。
该目录中还包含当前的 RPM 数字签名信息。
RPM vs Tarball
如何在 RPM 与 Tarball 之间做出选择。
-
首选 CentOS 官方的 RPM
一方面利于保证系统安全,另一方面自动维护也比较方便。
-
软件官网的 RPM 或软件库
原厂 RPM 没有的软件,可以到软件的官网查找 RPM 文件下载,如果官网有软件库,则把该软件库加入 yum 配置文件,这样以后就可以自动安装和更新该软件。
-
Tarball 安装特殊软件
某些特殊用途的软件没有 RPM 包,不建议自已制作 SRPM 来转成 RPM,因为对于仅一台主机来说没有意义,如果要管理相同的 100 台主机,自已制作 RPM 才有价值。单机版的特殊软件,建议用 tarball 安装。
-
用 Tarball 测试新版软件
可以用 tarball 安装 未知风险 的新软件到
/usr/local/
目录中,这样就可以同时安装该软件的两个版本了,不会互相干扰,比较适合测试新软件。
总之,有 RPM 就尽量使用;如果软件的架构差异性太大,或依赖软件很难搞定,则直接用 tarball 安装。
18.1.3 rpm
软件管理程序
rpm
命令在现实中多只用于 查询 与 检验,安装软件通常使用 yum
。
rpm
命令语法
使用 rpm
命令需要 root 身份。
rpm -ivh package_name
-i
install
-v
显示详细安装信息
-h
显示安装进度
范例:安装光盘上的软件
~]# rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:rp-pppoe-3.11-5.el7 ################################# [100%]
范例:同时安装多个软件
~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm
范例:使用网址安装
~]# rpm -ivh http://website.name/path/pkgname.rpm
rpm
常用选项
选项 | 说明 |
---|---|
–nodeps | 缺少依赖软件时强制安装,可能导致该软件无法正常使用 |
–replacefiles | 安装过程中提示“某文件已被安装在系统”,或 “文件冲突”时,覆盖文件。操作无法恢复 |
–replacepkgs | 重新安装已安装过的软件 |
–force | 等同于 --replacefiles 加上 --replacepkgs |
–test | 仅测试安装环境,检查是否存在依赖软件缺失的问题 |
–justdb | RPM 数据库损坏,或其他原因产生错误时,该选项会更新该软件在数据库内的相关信息 |
–nosignature | 跳过数字签名检查 |
–prefix 新路径 | 要将软件安装到其他非正规目录 |
–noscripts | 不希望该软件在安装过程中自动执行某些系统命令(前置操作,如数据库初始化等) |
升级与更新
升级:Upgrade rpm -U
更新:Freshen rpm -F
参数 | 未装过的软件 | 已安装的软件 |
---|---|---|
-Uvh | 安装新软件 | 更新版本 |
-Fvh | 不安装 | 更新版本 |
-Fvh
仅更新已有的软件,而不会安装系统原来没有的软件,常用于 大量升级低版本的软件。
RPM 查询
使用 rpm -q
进行 RPM 查询,返回的结果来自于 /var/lib/rpm/
目录中的 数据库 文件。
RPM 也可以查询 未安装的 RPM 信息。
下表中所指的安装包文件名均不含后缀 .rpm
。
rpm -q
常用参数
参数 | 用途 | 查询依据 | 返回结果 |
---|---|---|---|
——– | 软件包相关的选项 | ——– | ——– |
pkg1 … pkgN | 查询某软件的安装包文件名 | 已安装的软件名称 | 安装包文件名 |
-p |
查询某文件中包含什么软件包,- 用于管道接收 stdin |
文件名或 URL | 安装包文件名 |
-f |
查询某文件来自于哪个软件包 | 文件名 | 安装包文件名 |
-a | 查询已安装的所有包 | 所有安装包文件名列表 | |
–whatprovides |
查询什么软件包提供 特定功能 | 共享库名称或功能名 | 安装包文件名 |
-g |
查询属于某个组的软件包 | 组名 | 安装包文件名 |
–whatrequires |
查询什么软件包需要指定功能 | 共享库名称或功能名 | 安装包文件名 |
——– | 信息相关的选项 | ——– | ——– |
-i | 查看软件详细信息 | 软件名 | 软件名、开发商、版本、安装日期、组、源代码文件名、软件包大小等 |
-l | 查看某软件的所有文件 | 软件名称 | 该软件包安装在系统中的所有文件 |
-c | 查看某软件的所有配置文件 | 软件名称 | 该软件包安装在系统中的所有配置文件 |
-d | 查看某软件的所有说明文档 | 软件名称 | 该软件包安装在系统中的所有说明文档 |
-s | ? | 软件名 | 该软件包安装在系统中的所有文件,及其状态 |
–scripts | 查看软件安装、卸载、验证过程中具体有哪些操作 | 软件名称 | 安装前后、卸载前后、验证时的脚本内容 |
–queryformat | 用各种参数控制查询结果的显示方式 | 各种标签及转义符 | 各种自定义格式 |
–dump | 查义软件简要信息 | 软件名称 | 该软件包安装在系统中的所有文件,每个文件的大小、创建日期、MD5、文件模式、用户、组、是否配置文件、是否说明文档等 |
–provides | 查询软件提供的功能 | 软件名称 | 功能列表,通常为开发者自定义的字符串,与文件名无关 |
–requires / -R | 查询软件需要的功能 | 软件名称 | 该软件正常运行所需要的功能 |
——– | 一般选项 | ——– | ——– |
-v | 让显示结果与 ls 类似,便于查看 |
配合其它参数如 -l |
与 ls 相似的列表 |
-vv | 查看更多 RPM 内部动作的信息 | 配合其它参数 | RPM 内部具体工作信息 |
–root |
告诉 RPM 根目录是哪个,常用于初始化阶段,或用其它介质引导时 | 根目录绝对路径 | |
–rcfile |
切换不同的 RPM 设定 | 包含 RPM 默认设置参数的文件名 | |
–dbpath |
检查来自别处的 RPM 数据库文件 | 陌生的 RPM 数据库文件名 | . |
查询本地 RPM 信息时,只需要软件名称,不需要版本号,因为是从 /var/lib/rpm/
中的数据库查询。
RPM 验证
验证(Verify):rpm -V
rpm -V
用于验证已安装的软件包的完整性。
工作原理
管理员时常要确认一下整个系统是正常运转的,确认已安装的软件是否配置正确,确认没有发生任何未知的修改,确认没有误删任何重要文件。
如果 RPM 安装的文件发生了改变,或是为某软件提供功能的其它依赖软被删除,RPM 都可以发出警告。
每一次安装、更新、卸载软件包时,系统所做出的改变均会记录在 RPM 数据库中,以便 RPM 持续追踪所有信息,只有这样,它才能保证其每一步操作的正确性。这是 RPM 正常运作的保证。
RPM 数据库反应了其依赖生存的整个系统的配置情况,当 RPM 访问其数据库来确认安装、更新、卸载过程中该如何管理各个文件时,实际上它是把数据库做为一个系统配置的镜子来使用的。
反过来,我们也可以把系统配置做为体现 RPM 数据库的一面镜子来使用:
📕 我们用这面镜子来检查系统配置是否准确地反应了 RPM 数据库的内容。如果当前的系统配置与数据库不匹配,有两种可能性:
- RPM 数据库被损坏,系统配置正常
- RPM 数据库正常,系统配置被修改
因为 RPM 数据库损坏的机率要更小,因此它为我们提供了一个免费的、强大的验证工具。
RPM 验证内容
在 RPM 验证过程中,每一个由 RPM 安装过的文件都会被检查,每个文件至少有九种不同的属性可以检查:
文件所有者
User ownership,文件所有者直接影响文件的访问权限,因此文件所有权的任何更改都可能对数据安全性和系统可用性产生深远影响。
文件属组
Group ownership,与所有者类似,该属性主要用于决定文件访问权限,因此文件属组发生变化也应该受到重视。
文件模式
Mode,文件模式(即权限)由一组权限控制位组成,即隐藏属性加三组 rwx 位。SUID 许用户在执行程序期间变成 root,尤其需要留意。
MD5 校验码
MD5 sum,从文件内容中获取的 128 位的数字,对文件做出的任何改动都会导致 MD5 校验码发生变化。RPM 会为每一个它管理的文件生成 MD5 校验码,并保存到数据库中,只要发生变化,RPM 就会发现。
文件大小
Size,RPM 也追踪文件大小的细微变化。
主设备号
Device major number,主设备号用于和设备驱动程序交流信息,如 SCSI 磁盘的主设备号为 8,IDE 磁盘的主设备号为 3。如果主设备号被篡改将会带来灾难性的结果,因此有必要追踪其变化。
次设备号
Device minor number,与主设备号的概念类似,但它和设备驱动程序传递的信息与主设备号是不同的,对于磁盘驱动来说,信息中会包含 UUID,只要次设备号变化,RPM 就会察觉。
符号链接内容
symbolic Link contents,如果文件是符号链接,则会检查链接的文件名是否发生变化。
修改时间
mtime,多数文件系统都会追踪文件的修改日期和时间,RPM 利用这一点把修改时间保存在数据库中。
软件功能
capabilities,功能被修改。
RPM 验证的语法
rpm -V package_name
验证已安装的文件包是否被修改过
~]# rpm -V logrotate
rpm -Va
列出系统中所有被修改过的文件
rpm -Vp package_filename
验证该文件包中是否有文件被修改
rpm -Vf package_owning_file
验证指定文件是否被修改过
~]# rpm -Vf /etc/crontab
.......T. c /etc/crontab
rpm -V
的输出格式
在验证文件包时,只有发现问题 RPM 才会有输出。
输出的格式如下:
SM5DLUGTP c <file>
最前面的是连续 9 位的 状态位,基本上不可能发生所有 9 个状态同时验证失败的情况。每个状态位只有在该属性验证失败时才会用其标签来表示,否则均以点 .
来表示验证正常。
9 个状态位的意义
S
文件大小
M
文件模式
5
MD5 校验码
D
主、次设备号
L
文件的符号链接内容
U
文件所有者
G
文件属组
T
文件修改时间
P
文件功能
c
文件类型位,c
为配置文件
<file>
验证失败的文件,绝对路径
文件类型位
c
config,配置文件
d
documentation,说明文档
g
ghost,不知哪儿来的文件
l
license,授权文件
r
readme,帮助文档
验证结果分析
如果文件的变动是预期就无所谓,如果是非预期的,则要分析是否被入侵。
配置文件被修改是很正常的,但通常二进制文件不应该轻易被修改,需引起警惕。
RPM 数字签名
Digital Signature
RPM 只能依据软件包和 /var/lib/rpm/
数据库中的信息来比较验证,如果软件包中的数据本身就有问题,则无法保证验证过程自身的正确。
软件包中的 md5 指纹也有被篡改的可能,我们可以通过数字签名来校验软件的来源。
软件开发商发布的软件有一个自己的签名系统,该系统为每个软件颁发不同的 签名,同时公开发布该签名的 公钥(public key)。
CentOS 7 原厂发布的 GPG 数字签名的公钥文件为 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
。
基本工作原理
- 用户安装原厂发布的公钥文件。
- 在安装原厂的 RPM 软件包时,rpm 命令读取 RPM 文件的签名信息,与本机系统内的签名信息(公钥)作对比。
- 如果签名相同则安装,如果不同或找不到对应的签名信息时,则给予警告并停止安装。
CentOS 使用的数字签名系统为 GNU 计划的 GnuPG(GNU Privacy Guard, GPG)。GPG 可以通过杂凑运算,算出独一无二的专属公钥系统或者是数字签名系统。
安装公钥
~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
不同版本 GPG 公钥文件保存的位置不同,但文件名中大多包含 GPG-KEY
,因此可以用 locate 或 find 来查找。
公钥安装之后,其软件名多为 gpg-pubkey-****
:
卸载软件包
从各软件的依赖关系来讲,卸载软件时一定要从最上层开始,如很多软件都需要使用 pam ,如果直接卸载了 pam,则很多软件就无法正常工作了。
语法
rpm -e package_name
~]# rpm -e pam
error: Failed dependencies: # 提示会损坏依赖关系
libpam.so.0()(64bit) is needed by (installed) systemd-libs-208-20.el7.x86_64
libpam.so.0()(64bit) is needed by (installed) libpwquality-1.2.3-4.el7.x86_64
# 告知用户具体的依赖关系
~]# rpm -e pam-devel
# 卸载时没有任何反馈表示成功执行
重建 RPM 数据库
如果 /var/lib/rpm/
内的文件发生损坏,可以用 rpm --rebuilddb
来重建数据库。
18.2 YUM
Yum 是 CentOS 中的软件包管理软件,可以用于查询可用安装包信息、从仓库下载软件包、安装或卸载软件包。可以用于更新整个系统到最新可用版本。
Yum 在更新、安装或卸载软件时,会自动解析软件的依赖关系,自动判断、下载、安装所有可用的依赖软件。
为了重复利用既有的软件功能,很多软件用共享库的方式发布部分功能,以方便其他软件的调用,如 PAM 模块的验证功能。
发行版在发布软件时,会分两个版本,分别面对一般用户与开发用户。如 pam-x.x.rpm
和 pam-devel-x.x.rpm
。
yum 并不是 rpm 的替代者,它只是 rpm 包管理器的 前端工具,是 依赖于 rpm 包管理器的。平时使用 yum 来解决安装问题,使用 rpm 来查询软件包。
18.2.1 yum 工作机制
yum 服务器
所有要发行的 rpm 包都放在 yum 服务器上供下载,rpm 包根据内核的版本号、CPU 的版本号分别编译发布。yum 服务器只需提供 ftp 或 httpd 服务以供下载。
yum 服务器会收集每个 rpm 包的 元数据,包括 rpm 包对应的版本号、配置文件、二进制信息、以及软件依赖关系,并把该信息做成一张 xml 格式的 软件包清单,它会记录软件的依赖关系,及所有文件的网址。。
在 yum 服务器上可以使用 createrepo
命令来更新该清单。
客户端在使用 yum 安装程序时,会先把服务器上的清单自动 同步到本地,然后再进行其它操作。
yum 安装流程
- 用户端发起安装、升级 请求
- 本机 yum 向软件库请求 更新本地
/var/cache/yum/
中的 软件包清单 - 用本机清单 对照 本机 RPM 数据库,判断需要下载哪些软件
- yum 从 yum server 下载 所需要软件
- 通过 RPM 机制 安装 软件
yum 通过分析 RPM 的标头数据,根据软件依赖关系制定解决方案,来自动处理软件依赖关系,从而使软件安装、卸载、更新顺利进行。
18.2.2 yum
命令
查询
查询的软件名支持通配符 *
yum list
查看软件包中的软件列表
yum list available
列出所有可用软件包
yum list installed
列出所有已安装的软件包
yum list all
列出已安装及可用的所有软件包
yum list kernel
列出已安装及可用的内核软件包
yum list updates
列出服务器上可供本机更新的软件
yum list web*
列出以 web 开头的软件包
yum info
查询软件包的信息
yum info vsftpd
查看关于 vsftpd 软件包的信息
yum deplist
查看软件包的依赖
yum deplist nfs-untils
查看该软件的依赖
yum provides
查找提供关键字的软件包
yum provides "*bin/top"
查找包含 top 命令的软件包
yum provides "*/README.top"
查找包含该文件的软件包
yum search
根据软件包的名称和描述查找关键字
yum search samba
在软件包的名称或描述中查找含有 samba 的
yum updateinfo
查看可用的软件包更新
yum updateinfo security
查看可用的安全更新
yum grouplist
可看已安装及可用的软件包组
yum groupinfo
查看软件包组的描述及内容
yum groupinfo "Web Server"
查看该组中的软件
yum check-update
查看软件库是否有可用的软件包更新
软件库操作
yum repolist
查看已启用的软件库
yum repoinfo
查看指定的启用的软件库的信息
yum repoinfo rhel-7-server-rpms
yum repo-pkgs
把特定的软件库当做一组软件包来对待。允许用户将其做为一个单独的实体来安装或删除。
yum repo-pkgs my-rmps list
查看 my-repo 软件库中的软件列表
yum repo-pkgs my-rpms install
安装 my-repo 库中所有软件
yum repo-pkgs my-rpms remove
卸载 my-repo 库中所有软件
yum makecache
从服务器下载软件库数据到本地缓存
排错及维护
yum check
检查地本 RPM 数据库是否有错误,运行时间较长
yum history
查看 yum 历史记录
yum history list
查看所有安装、更新、删除的历史动作
yum history info 3
查看 yum 的第 3 号操作
yum history undo 3
撤回 yum 的第 3 号操作
yum history redo 3
重做第 3 号没有完成的操作
yum clean
清除缓存的软件包数据
yum clean packages
删除缓存中的软件包
yum clean all
删除缓存中所有软件包及元数据
安装、卸载软件包
yum install
从软件库安装软件
yum install vsftpd
安装指定软件包
yum update
更新一个或多个软件包
yum update
更新所有可更新的软件包
yum update httpd
更新特定软件包
yum update --security
应用安全相关的更新
yum update-to
把软件包更新到特定的版本
yum localinstall
从本地文件、http、ftp 安装软件包
yum localinstall abc-1-1.i686.rpm
安装本地文件
yum localinstall http://myrepo/abc-1-1.i686.rpm
从网址安装
yum reinstall
重新安装软件包当前版本,以替换被删除的文件
yum reinstall util-linux
yum --installroot=
将该软件安装到指定目录,而非默认路径
yum install vsftpd --installroot=/some/path
yum erase
删除软件包及依赖
yum erase vsftpd
yum remove
与 yum erase
相同
yum groupinstall
安装软件包组中所有软件
yum groupinstall "web server"
其它常用选项
yum -y
对所有问题回答 yes
yum -v
产生更多的调试信息
yum --enablerepo=
在本次命令中临时启用某软件库
yum install docker --enablerepo=rhel-7-server-extras-rpm
yum --disablerepo=
在本次命令中临时禁用某软件库
yum list available --disablerepo=epel
18.2.3 yum 的配置文件
yum 的配置文件为 /etc/yum.conf
,它包含了一个强制的 [main]
区块,在此可以设置全局生效的 yum 选项。虽然允许在该文件中加入其它软件库,但不推荐这样做。建议在 /etc/yum.repos.d/
目录下为不同的软件库 使用各自的配置文件,后缀为 .repo
,即 repository。
使用配置文件原原则
- 如需修改全局选项,应编辑
/etc/yum.conf
的[main]
区块 - 如需修改个别软件库的选项,应编辑
/etc/yum.repos.d/
目录中其对应的.repo
文件 - 应尽可能使用
/etc/yum.conf
及/etc/yum.repos.d/*.repo
中的变量,以保证动态版本和架构的值能被正确使用 - 需要时,在命令行中启用、禁用软件库
- 需要时可以设置自定义软件库
配置文件的结构
~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
......
-
[base]:软件库名称,必须要有 中括号,里面的 软件库名称 则可以任意,但 不能重复, 否则会引起混淆。
name
软件库简要说明mirrorlist=
该软件库可以使用的镜像站点,是由 yum 程序自动捕捉的baseurl=
软件库的真实网址,固定的网址enable=0
禁用该软件库。注意:如果该软件库被启用,会直接删除该条目,并不会有enable=1
gpgcheck=1
是否校验数字签名gpgkey=
数字签名的公钥所在位置
清除 yum 缓存
如果修改了软件库的网址,但没有修改软件库名称,可能会造成本机的清单与 yum 服务器的不同步,会导致无法更新。可通过删除本机旧的数据来解决:yum clean all
。
18.2.4 yum 的软件包组
yum 按用途把众多软件分成了若干个组,允许通过组一次性安装多个软件。
修改组的安装选项
每个软件组中,有一部分软件是 强制 安装的,有一部分是 可选 安装的,这些可选软件默认不会被安装。要想安装这些软件,需要修改配置文件 /etc/yum.conf
:
~]# vim /etc/yum.conf
.....
distroverpkg=centos-release # 此行下面新增一行
group_package_types=default, mandatory, optional
.....
18.2.5 yum 安装第三方软件
针对常用的第三方软件,一些组织建立了软件仓库。
EPEL
EPEL,Extra Packages for Enterprise Linux, 是 Fedora 基金会开发的一个 附加软件计划,主要是针对 Red Hat Enterprise Linux 开发的,同样支持 CentOS。
ELRepo
另一个支持 RHEL 的软件仓库。
该软件库提供的大多是与 内核、内核模块、虚拟化 相关的软件。包括 NVidia 的驱动程序,最新的内核(文件名为 kernel-ml )。
安装第三方软件的流程
通过 EPEL 仓库安装 netcdf 及 R 这两套软件。
增加软件库
方法一:直接用 yum 安装:
$ sudo yum install epel-release
方法二:在 yum 配置文件中增加 EPEL 库:
如果是首次安装第三方软件,在 /etc/yum.repos.d/
目录中新建配置文件 epel.repo
:
~]# 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
修改软件库的 .conf
文件之后,一定要用 sudo yum clean all
来清除缓存数据。
无需启动该软件库,只需在安装时临时启用。
安装软件包
仅使用该软件库来安装 netcdf 和 R
~]# yum --disablerepo="*" --enablerepo="epel" install netcdf R
--disablerepo="*"
在本命令中先禁用所有软件库
--enablerepo="epel"
在本命令中临时启用 epel 软件库
如果确认在加入这个新软件库之前,现有的软件库都没有这个软件包,也可以直接使用:
~]# yum --enablerepo="epel" install netcdf R
用 yum 安装光盘中的软件包
本机的光驱挂载以后,可以使用 yum 来安装软件,新建并编辑新的配置文件 cdrom.repo
:
~]# vim /etc/yum.repos.d/cdrom.repo
[mycdrom]
name = mycdrom
baseurl = file:///mnt # 挂载点
gpgcheck = 0
enabled = 0
~]# yum --enablerepo="mycdrom" install software_name
18.2.6 系统自动更新
yum -y update
系统自动更新,-y
可以对所有问题自动回答 yes,以便无障碍下载安装,再用 crontab 做成计划任务即可。
同时,要分析日志文件,并注意查收 root 的邮件, 因为如果更新了内核,需要重启系统。
18.3 RPM 的创建
虽然有了 Tarball 就可以安装软件,但经常无法卸载,更不便于升级、维护。相比之下,RPM 软件包的形式更利于软件的安装、卸载、更新和维护。
因此,在有的情况下,需要自己从源码来创建 RPM 软件包。
18.3.1 准备相关工具
要想创建 RPM 软件包,建议安装 yum-utils
和 rpm-build
两套工具,其中包含了许多有用的程序。
sudo yum install yum-utils rpm-build
18.3.2 获得源代码
源代码的形式通常为 SRPM 或 Tarball。
SRPM 比 Tarball 多了 spec 文件、更新补丁等。而 spec 文件在生成 rpm 软件包的过程中至关重要。
SRPM
下载 SRPM
如果要下载在线软件库中的 SRPM,可以使用:
yumdownloader --source vsftpd
该命令会直接把 SRPM 如 vsftpd-3.0.2-22.el7.src.rpm
下载到当前目录。
安装 SRPM
下载的 SRPM 文件需要以 普通用户 身份,使用 rpm -i
命令来安装。不能使用 root 来安装,有损坏系统的风险。
其中的源代码压缩包、更新补丁及相关文件将会被安装到一个目录,该目录被称为 topdir
,可以使用 rpm --showrc | grep topdir
来查看该变量的值,通常为 %{getenv:HOME}/rpmbuild
,即用户家目录中的 ~/rpmbuild/
目录。
现在用 rpm
命令来安装:
rpm -ivh ./vsftpd-3.0.2-22.el7.src.rpm
该命令会将 SRPM 解包,把 SPEC 文件放到 SPECS
目录,把其余的文件(源代码压缩包、更新补丁和其它文件)放到 SOURCES
目录。
~]$ tree rpmbuild/
rpmbuild/
├── SOURCES
│ ├── vsftpd-2.0.5-fix_qm.patch
│ ├── vsftpd-2.1.0-build_ssl.patch
│ ├── vsftpd-3.0.2-seccomp.patch
│ ├── vsftpd-3.0.2.tar.gz
│ ├── vsftpd_conf_migrate.sh
│ ├── vsftpd.ftpusers
│ ├── vsftpd-generator
│ ├── vsftpd.init
│ ├── vsftpd.pam
│ ├── vsftpd.service
│ ├── vsftpd@.service
│ ├── vsftpd.target
│ ├── vsftpd.user_list
│ └── vsftpd.xinetd
└── SPECS
└── vsftpd.spec
自定义安装目录
如果要自定义 topdir
的值,可以在家目录新建文件 .rpmmacros
,内容为:
%_topdir %(echo $HOME)/my-rpm-build-dir
该 .rpmmacros
文件会促使 SRPM 安装到 ~/my-rpm-build-dir
目录。
Tarball
没有 rpm
命令的帮助,只能手动创建目录结构、解压源代码。
创建编译的目录结构
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
解压源代码
把源代码下载并解压到 ~/rpmbuild/SOURCES/
目录。如果编译时需要加入一些补丁,同样也将其放到该目录。
cd ~/rpmbuild/SOURCES/
wget http://***.tar.gz
18.3.3 SPEC 文件
SPEC 文件用于 控制 如何构建和安装 RPM 文件包,可以视为是 rpmbuild
的配置文件。
SPEC 文件即软件包描述文件,其中包含了软件包的诸多信息,如软件包的名字、版本、类别、说明摘要,以及构建要执行的指令、安装时要执行的操作、以及软件包所要包含的文件列表等。
SPEC 文件的主要结构
文件头
一般的 SPEC 文件头包含以下几个域:
Summary
用一句话概括该软件包尽量多的信息。
Name
软件包的名字,最终RPM软件包是用该名字与版本号,发布号及体系号来命名软件包的。
Version
软件版本号。仅当软件包比以前有较大改变时才增加版本号。
Release
软件包发布号。一般我们对该软件包做了一些小的补丁的时候就应该把发布号加1。
Vendor
软件开发者的名字。
Copyright
软件包所采用的版权规则。具体有:GPL(自由软件),BSD,MIT,Public Domain(公共域),Distributable(贡献),commercial(商业),Share(共享)等,一般的开发都写GPL。
Group
软件包所属软件包组
Source
源程序软件包的名字。如 stardict-2.0.tar.gz。
%description
软件包详细说明,可写在多个行上。rpm -qi pack_name
返回的结果就是这个说明。
%prep
段
这个段是 预处理 段,解压 源代码,应用补丁,为编译和安装 作准备。功能上类似于 ./configure
。
%prep 和下面的 %build,%install 段一样,除了可以执行 RPM 所定义的宏命令(以%开头)以外,还可以执行 SHELL 命令,命令可以有很多行,如常用的 tar 解包命令。
- 用
%setup
解压源程序的 tar 文件包 - 如果有补丁文件,用
%patch
将其应用到解开的源码中 - 检验软件所需的目录是否存在
- 创建软件所需目录
- 运行需要提前执行的任务
- 如果安装过程中会覆盖某些文件,需提前备份
build
段
定义编译软件包所要执行的命令, 这一节一般由多个 make
命令组成。
%install
段
定义在 安装软件包 时将执行命令,类似于 make install
命令。
将已编译的软件安装到虚拟的目录结构中,从而可以打包成一个 RPM。
有些 SPEC 文件还有 %post-install 段,用于定义在软件安装完成后所需执行的配置工作。
%files
段
用于定义软件包所包含的文件。
分为三类:说明文档、配置文件及可执行程序,还可定义文件存取权限,所有者及组别。
%changelog
段
修改日志段。
可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。
每个修改日志的格式为:
第一行以星号开始:* 星期 月 日 年 修改人 电子信箱
,其中,星期、月份均用英文形式的前 3 个字母,用中文会报错。
其它行以减号 -
开始,记录修改内容,可写多行。
构建依赖软件
构建 RPM 时需要的软件会用 BuildRequires
标签来设定。在构建 RPM 软件包时,如果系统中没有安装这些依赖包,构建就会失败。
BuildRequires: pam-devel
BuildRequires: libcap-devel
BuildRequires: openssl-devel
BuildRequires: systemd
BuildRequires: tcp_wrappers-devel
SRPM / Tarball
SRPM 通常会携带 .spec
文件,并被解包到 SPEC
目录中。如有需要可以修改。
而 Tarball 则通常不会有,必须自己创建。
18.3.4 安装依赖软件包
除了基本的开发工具之外,每个软件在构建 RPM 包时,有时会需要系统中安装特定的其它软件包。正如上面 SPEC 文件中 BuildRequires
标签所设定的。此时,可以使用 yum-builddep
命令来自动安装依赖包,只需要把 SPEC 文件做为参数:
yum-builddep ~/rpmbuild/SPECS/vsftpd.spec
就会自动按照 SPEC 文件所给定的构建依赖来逐项安装或更新软件包了。
18.3.5 构建 RPM
rpmbuild
命令
rpmbuild
用于构建软件包。使用时必须指定基本模式的一种:构建软件包,从 Tarball 构建软件包,重编译软件包,查看配置信息。
基本语法
rpmbuild {-ba|-bb|-bp|-bc|-bi|-bl|-bs} [ rpmbuild-options ] SPECFILE...
rpmbuild {-ta|-tb|-tp|-tc|-ti|-tl|-ts} [ rpmbuild-options ] TARBALL...
rpmbuild {--rebuild|--recompile} SOURCEPKG...
编译、安装 SRPM
rpmbuild --rebuild
编译、打包,生成 RPM 文件,不安装。
rpmbuild --recompile
编译、打包、安装。
这两个选项都是用 SRPM 的 默认设置 进行安装。
如果进行的顺利,编译过程中产生的临时文件会被自动删除。如果发生错误,临时文件将被保留。
编译完成的 RPM 位置:~/rpmbuild/RPMS/x86_64/*.rpm
rpmbuild -b
rpmbuild -b<stage> options file1.spec … fileN.spec
rpmbuild -b
命令会开始一个 构建 软件包的流程,而命令后面所加的其他参数,会决定该流程最终编译的结果,以及该流程要完成 SPEC 文件中的哪些步骤。
使用 -b
选项运行时,有两个信息必须确认:
- 一个或多个 SPEC 文件
- 构建流程需要走到 SPEC 文件中的哪个阶段(stage)
在构建 RPM 的过程中,要经历一定数量的阶段,通过 指定阶段,构建流程会走到该阶段就中止。
rpmbuild -bp
仅执行 %prep
阶段,即解压源代码,应用补丁。
rpmbuild -ba
-ba
选项会引导 RPM 执行构建过程的所有阶段,即执行 %prep
,%build
,%install
,%check
阶段。然后处理所有说明文档,创建 BRPM 文件,清理临时文件,最后一步是创建 SRPM 文件。该 SRPM 文件由 SPEC 文件和源代码文件(Tarball)组成,有时还会包含一个或多个补丁文件。
主要步骤:
- 解包原始代码
- 按需应用补丁
- 编译软件
- 安装软件
- 运行软件的测试套件
- 生成二进制 RPM 文件
- 生成源代码 RPM 文件
rpmbuild -bb
执行 %prep
,%build
,%install
,%check
阶段的命令,编译生成 RPM 文件。
在执行完 %prep
,%build
,%install
,%check
阶段之后,处理所有说明文档,RPM 判断软件包中的可执行文件需要哪些共享库来运行,以此来自动进行依赖关系的检查。之后,RPM 把所有文件打包,添加签名,创建 RPM 文件。
构建目录结构
~/rpmbuild/SPECS/
用于保存 SPEC 文件
~/rpmbuild/SOURCES/
保存源代码 *.tar.gz
及补丁文件等
~/rpmbuild/BUILD/
源代码文件
~/rpmbuild/RPMS/
构建好的 BRPM 文件
~/rpmbuild/SRPMS/
构建好的 SRPM 文件
编译过程中如果发生错误,会在 /tmp/
目录中产生一个对应的错误文件,可以根据该错误文件来排错。
编译成功后,~/rpmbild/{SPECS,SOURCES,BUILD}
目录中的文件都会被删除,只保留 ~/rpmbuild/RPMS/
中的 RPM 文件。
构建命令
SPEC 文件准备好后,就可以开始构建 RPM 了。
直接构建 RPM
如果此时没有什么要修改,可以用 rpmbuild -ba
来执行构建的所有阶段:
cd ~/rpmbuild/SPECS
rpmbuild -ba vsftpd.spec
构建完成后,会在 RPMS
目录中生成 BRPM 软件包,在 SRPMS
目录中生成 SRPM 包。
先修改,再构建 RPM
如果需要先修改源代码,则先使用 rpmbuild -bp
执行 %prep
阶段:
cd ~/rpmbuild/SPECS
rpmbuild -bp vsftpd.spec
源代码会被解压到 BUILD
目录中:
ll rpmbuild/BUILD/
total 12
drwxr-xr-x. 8 neo neo 8192 May 14 07:55 vsftpd-3.0.2
修改完源代码后,再使用 rpmbuild -ba
来执行所有阶段:
cd ~/rpmbuild/SPECS
rpmbuild -ba vsftpd.spec
构建完成后,会在 RPMS
目录中生成 BRPM 软件包,在 SRPMS
目录中生成 SRPM 包。
18.3.6 安装 RPM
安装构建好的 RPM 包,以测试是否一切正常,包括其依赖软件是否也解析正常。
rpm -ivvh ~/rpmbuild/RPMS/x86_64/vsftpd-3.0.2-22.el7.rpm
安装以后,可以再查询一下 RPM 数据库,以再次确认安装正确:
rpm -qa vsftpd