龙之介大人

RPM与YUM管理包程序
19.1 二进制包详解二进制程序包的组成部分:二进制文件,库文件,配置文件,帮助文件程序包管理器:debian: ...
扫描右侧二维码阅读全文
13
2019/11

RPM与YUM管理包程序

19.1 二进制包详解

  • 二进制程序包的组成部分:二进制文件,库文件,配置文件,帮助文件
  • 程序包管理器:

    • debian: deb,dpt
    • redhat: rpm

      • rpm: Redhat Package Manager
    • Gentoo
    • Acrhlinux
  • 源代码:name-VERSION.tar.gz

    • VERSION: major.minor.release
  • rpm包命名方式:

    • VERSION: major.minor.release
    • Arch: release.os.arch
zlib-1.2.7-13.e17.i686.rpm
  • 包与包之前会存在依赖关系!
  • testapp:

    • testapp-VERSION-ARCH.rpm:主包
    • testapp-devel-VERSION-ARCH.rpm:支包
    • testapp-testing-VERSION-ARCH.rpm
yum: rpm包在线管理器的前端工具
rpm: rpm包管理器的前端工具
apt-get: deb包在线管理器的前端工具
dpkg: deb包管理器的前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 22+ rpm包管理器前端管理工具

查看二进制程序所依赖的库

[root@study ~]# ldd [OPTION]... FILE...
选项与参数:
--version:打印指令版本号;
-v:详细信息模式,打印所有相关信息;
-u:打印未使用的直接依赖;
-d:执行重定位和报告任何丢失的对象;
-r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数;
--help:显示帮助信息。


[root@study ~]# ldd /bin/ls
        linux-vdso.so.1 =>  (0x00007ffc11d3f000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2dd8e0a000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007f2dd8c05000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007f2dd89fb000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f2dd863a000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2dd83d8000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f2dd81d3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2dd9046000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007f2dd7fce000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2dd7db2000)

管理本机安装装载的库文件

ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。

#打印系统装载的苦文件
[root@study ~]# ldconfig -p |more
在缓冲区“/etc/ld.so.cache”中找到 1032 个库
        p11-kit-trust.so (libc6,x86-64) => /lib64/p11-kit-trust.so
        libzapojit-0.0.so.0 (libc6,x86-64) => /lib64/libzapojit-0.0.so.0
        libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
        libz.so (libc6,x86-64) => /lib64/libz.so
        libyelp.so.0 (libc6,x86-64) => /lib64/libyelp.so.0
        libyaml-0.so.2 (libc6,x86-64) => /lib64/libyaml-0.so.2
        libyajl.so.2 (libc6,x86-64) => /lib64/libyajl.so.2
....

的配置文件为:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf
缓存文件为:/etc/ld.so.cache

程序包管理:

功能:将编译好的应用程序的各组成文件打包一个或好几个程序包,从而方便快捷的实现程序包的安装,卸载,查询,升级和校验等管理操作.

  1. 程序包的组成清单(每个包独有)
    文件清单
    安装或卸载时运行的脚本
  2. 数据库(公共)
    程序包名称及版本
    依赖关系
    功能说明
    安装生成的各文件路径及校验码信息
rpm包搜索平台:http://www.rpmfind.net

19.2 RPM包管理器

  • RPM包的优点:

    • 包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
    • 安装速度比源码包安装快的多
  • PM包的缺点:

    • 经过编译, 不再可以看到源代码
    • 功能选择不如源码包灵活
    • 依赖性。有时我们会发现需要安装软件包a时需要先安装b和c,而安装b时需要安装d和e。这是需要先安装d和e,再安装b和c,最后才能安装a包。
树形依赖:a->b->c
环形依赖:a->b->c->a
函数库依赖:mysql-conhector-odbc-xxxx.rpm->libodbc.so->libodbcinst.so
  • RPM包默认安装目录
目录文件类型
/etc/配置文件安装目录
/usr/bin/可执行文件安装目录
/usr/lib程序所使用的函数库保存目录
/usr/share/doc/基本的软件使用手册保存位置
/usr/share/man/帮助文件保存位置

19.2 RPM安装程序包

[root@study ~]# rpm -ivh package_name
参数与选项:
-i :install 的意思
-v :察看更细部的安装信息画面
-h :以安装信息列显示安装进度


#范例一:安装原版光盘上的 rp-pppoe 软件
[root@study ~]# 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%]


#范例二、一次安装两个以上的软件时:
[root@study ~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm
#后面直接接上许多的软件文件!


#范例三、直接由网络上面的某个文件安装,以网址来安装:
[root@study ~]# rpm -ivh http://website.name/path/pkgname.rpm

另外,如果我们在安装的过程当中发现问题,或者已经知道会发生的问题,而还是『执意』要安装 这个软件时,可以使用如下的参数『强制』安装上去:

RPM安装时常用的选项与参数说明

参数名参数意义
--nodeps使用时机:当发生软件属性相依问题而无法安装,但你执意安装时
危险性:软件会有相依性的原因是因为彼此会使用到对方的机制或功能,如果强制安装而不 考虑软件的属性相依,则可能会造成该软件的无法正常使用!
--replacefiles使用时机:如果在安装的过程当中出现了『某个文件已经被安装在你的系统上面』的信息,又或许出现版本不合的讯息 (confilcting files)时,可以使用这个参数来直接覆盖文件。
危险性: 覆盖的动作是无法复原的!所以,你必须要很清楚的知道被覆盖的文件是真的可以被覆盖!否则会欲哭无泪!
--replacepkgs使用时机:重新安装某个已经安装过的软件!如果你要安装一堆 RPM 软件文件时,可以使用 rpm -ivh *.rpm,但若某些软件已经安装过了,此时系统会出现『某软件已安装』的信息,导致无法继续安装。此时可使用这个选项来重复安装!
--force使用时机:这个参数其实就是--replacefiles 与 --replacepkgs的综合体!(强制升级安装)
--test使用时机:想要测试一下该软件是否可以被安装到使用者的 Linux 环境当中,可找出是否有属性相依的问题。范例为:rpm -ivh pkgname.i386.rpm --test
--justdb使用时机:由于 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来更新软件在数据库内的相关信息。
--nosignature使用时机:想要略过数字签名的检查时,可以使用这个选项。
--prefix 路径使用时机:要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录,就可以使用『 --prefix /usr/local 』来处理了。
--noscript使用时机:不想让该软件在安装过程中自行执行某些系统指令。说明:RPM 的优点除了可以将文件放置到定位之外,还可以自动执行一些前置作业的指令,例如数据库的初始化。如果你不想要让 RPM 帮你自动执行这一类型的指令,就加上他吧!

一般来说,rpm 的安装选项与参数大约就是这些了。通常建议直接使用 -ivh 就好了, 如果安装的过程中发现问题,一个一个去将问题找出来,尽量不要使用『 暴力安装法 』,就是透过 --force 去强制安装! 因为可能会发生很多不可预期的问题呢!除非你很清楚的知道使用上面的参数后,安装的结果是你预期的!

RPM升级与更新程序包

使用 RPM 来升级真是太简单了!就以 -Uvh 或 -Fvh 来升级即可,而 -Uvh 与 -Fvh 可以用的选项与参数,跟 install 是一样的。不过,-U 与 -F 的意义还是不太一样的,基本的差别是这样的:

参数说明
-Uvh后面接的软件即使没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统自动更新至新版;
-Fvh如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你 Linux 系统内的软件会被『升级』!

由上面的说明来看,如果你想要大量的升级系统旧版本的软件时,使用 -Fvh 则是比较好的作法,因为没有安装的软件才不会被不小心安装进系统中。但是需要注意的是,如果你使用的是 -Fvh ,偏偏你的机器上尚无这一个软件,那么很抱歉,该软件并不会被安装在你的 Linux 主机上面,所以请重新以 ivh 来安装!

早期没有 yum 的环境底下,同时网络带宽也很糟糕的状况下,通常有的朋友在进行整个操作系统的旧版软件修补时,喜欢这么进行:

  1. 先到各开发提供商的 errata 网站或者是国内的 FTP 镜像站下载最新的 RPM 文件;
  2. 使用 -Fvh 来将你的系统内曾安装过的软件进行修补与升级!

所以,在不晓得 yum 功能的情况下,你依旧可以到 CentOS 的镜像站下载 updates 数据,然后利用上述的方法来一口气升级! 当然,升级也是可以利用 --nodeps/--force 等等的参数! 不过,现在既然有 yum 的机制在,这个笨方法当然也就不再需要了!

RPM查询程序包

RPM 在查询的时候,其实查询的地方是在 /var/lib/rpm/ 这个目录下的数据库文件啦!另外, RPM 也可以查询未安装的 RPM 文件内的信息!那如何去查询呢? 我们先来谈谈可用的选项有哪些?

[root@study ~]#rpm -qa  <--已安装的文件
[root@study ~]#rpm -q[licdR] 已安装的软件名称   <--已安装的文件
[root@study ~]#rpm -qf 存在于系统上面的某个文件名 <--已安装的文件
[root@study ~]#rpm -qb[licdR] 未安装的某个文件名 <--查询RPM文件
选项与参数:
查询已安装软件的信息:
-q :仅查询,后面接的软件名称是否有安装;
-qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
-qi :列出该软件的详细信息 (information),包含开发商、版本与说明等; 
-ql :列出该软件所有的文件与目录所在完整文件名 (list);
-qc :列出该软件的所有配置文件 (找出在 /etc/ 底下的檔名而已)
-qd :列出该软件的所有说明文件 (找出与 man 有关的文件而已)
-qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)
-qf :由后面接的文件名,找出该文件属于哪一个已安装的软件;
-q --scripts:列出是否含有安装后需要执行的脚本档,可用以 debug 喔!
查询某个 RPM 文件内含有的信息:
-qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在于找出某个 RPM 文件内的信息,而非已安装的软件信息!注意!

在查询的部分,所有的参数之前都需要加上 -q 才是所谓的查询!查询主要分为两部分,一个是查已安装到系统上面的的软件信息,这部份的信息都是由 /var/lib/rpm/ 所提供。另一个则是查某个 rpm 文件内容,等于是由 RPM 文件内找出一些要写入数据库内的信息就是了,这部份就得要使用 -qp (p 是 package 的意思)。那就来看看几个简单的范例!

#范例一:找出你的 Linux 是否有安装 logrotate 这个软件?
[root@xiaoqi src]# rpm -q logrotate
logrotate-3.8.6-17.el7.x86_64


[root@study ~]# rpm -q logrotating
未安装软件包 logrotating 
#注意到,系统会去找是否有安装后面接的软件名称。注意,不必要加上版本喔!
#至于显示的结果,一看就知道有没有安装啦!


#范例二:列出上题当中,属于该软件所提供的所有目录与文件
[root@study ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
#可以看出该软件到底提供了多少的文件与目录,也可以追踪软件的数据。


#范例三:列出 logrotate 这个软件的相关说明数据:
[root@study ~]# rpm -qi logrotate
Name        : logrotate     <--软件名称
Version     : 3.8.6         <--软件的版本
Release     : 6.el7         <--释放的版本
Architecture: x86_64        <--编译时所针对的硬件等级
Install Date: 2019年08月09日 星期五 03时43分29秒    <--这个软件安装到本系统的时间
Group       : System Environment/Base           <--软件是放在那一个软件群组中
Size        : 102645        <--软件的大小
License     : GPL+          <--释放出的授权方式
Signature   : RSA/SHA256, 2015年11月25日 星期三 23时15分13秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : logrotate-3.8.6-6.el7.src.rpm     <--SRPM的文件名
Build Date  : 2015年11月20日 星期五 15时24分04秒   <--软件编译打包的时间
Build Host  : worker1.bsys.centos.org           <--在哪一部主机上编译的
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : https://fedorahosted.org/logrotate/
Summary     : Rotates, compresses, removes and mails system log files
Description :   <--软件的详细描述
The logrotate utility is designed to simplify the administration of
log files on a system which generates a lot of log files.  Logrotate
allows for the automatic rotation compression, removal and mailing of
log files.  Logrotate can be set to handle a log file daily, weekly,
monthly or when the log file gets to a certain size.  Normally,
logrotate runs as a daily cron job.

Install the logrotate package if you need a utility to deal with the
log files on your system.
#出该软件的 information (信息),里面的信息可多着呢,包括了软件名称、
#版本、开发商、SRPM 文件名、打包次数、简单说明信息、软件打包者、
#安装日期等等!如果想要详细的知道该软件的数据,用这个参数来了解一下


#范例四:分别仅找出 logrotate 的配置文件与说明档
[root@study ~]# rpm -qc logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/var/lib/logrotate.status
[root@study ~]# rpm -qd logrotate
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz


#范例五:若要成功安装 logrotate ,他还需要什么文件的帮忙?
[root@study ~]# rpm -qR logrotate
/bin/sh
config(logrotate) = 3.8.6-6.el7
coreutils >= 5.92
libacl.so.1()(64bit)
libacl.so.1(ACL_1.0)(64bit)
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libc.so.6(GLIBC_2.8)(64bit)
libpopt.so.0()(64bit)
libpopt.so.0(LIBPOPT_0)(64bit)
libselinux.so.1()(64bit)
popt
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1


#范例六:由上面的范例五,找出 /bin/sh 是那个软件提供的?
[root@study ~]# rpm -qf /bin/sh
bash-4.2.46-19.el7.x86_64
#这个参数后面接的可是『文件』!不像前面都是接软件喔! 
#这个功能在查询系统的某个文件属于哪一个软件所有的。


#范例七:假设我有下载一个 RPM 文件,想要知道该文件的需求文件,该如何?
[root@study ~]# rpm -qpR filename.i386.rpm
#加上 -qpR ,找出该文件需求的数据

常见的查询就是这些了!要特别说明的是,在查询本机上面的 RPM 软件相关信息时,不需要加上版本的名称,只要加上软件名称即可!因为他会由 /var/lib/rpm 这个数据库里面去查询,所以我们可以不需要加上版本名称。但是查询某个 RPM 文件就不同了,我们必须要列出整个文件的完整档名才行,这一点朋友们常常会搞错。底下我们就来做几个简单的练习吧!

  • 例题:

    1. 我想要知道我的系统当中,以 c 开头的软件有几个,如何实做?
    2. 我的 WWW 服务器为 Apache ,我知道他使用的 RPM 软件文件名为 httpd 。现在,我想要知道这

个软件的所有配置文件放置在何处,可以怎么作?

3. 承上题,如果查出来的配置文件案已经被我改过,但是我忘记了曾经修改过哪些地方,所以想要直

接重新安装一次该软件,该如何作?

4. 如果我误砍了某个重要文件,例如 /etc/crontab,偏偏不晓得他属于哪一个软件,该怎么办?
  • 答:

    [root@study ~]# rpm -qa | grep ^c | wc -l
    [root@study ~]# rpm -qc httpd
    
    #假设该软件在网络上的网址为:
    #http://web.site.name/path/httpd-x.x.xx.i386.rpm
    #则我可以这样做:
    [root@study ~]# rpm -ivh http://web.site.name/path/httpd-x.x.xx.i386.rpm --replacepkgs
    
    #虽然已经没有这个文件了,不过没有关系,因为 RPM 有记录在 /var/lib/rpm 当中的数据库啊!所以直接下达:
    [root@study ~]# rpm -qf /etc/crontab
    

RPM验证与数字签名

验证 (Verify) 的功能主要在于提供系统管理员一个有用的管理机制!作用的方式是『使用 /var/lib/rpm 底下的数据库内容来比对目前 Linux 系统的环境下的所有软件文件 』也就是说,当你有数据不小心遗失,或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容,就用这个简单的方法来验证一下原本的文件系统吧!好让你了解这一阵子到底是修改到哪些文件数据了! 验证的方式很简单:

[root@study ~]# rpm -Va
[root@study ~]# rpm -V 已安装的软件名称
[root@study ~]# rpm -Vp 某个 RPM 文件的档名
[root@study ~]# rpm -Vf 在系统上面的某个文件
选项与参数:
-V :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来; 
-Va :列出目前系统上面所有可能被更动过的文件;
-Vp :后面加的是文件名,列出该软件内可能被更动过的文件;
-Vf :列出某个文件是否被更动过~


#范例一:列出你的 Linux 内的 logrotate 这个软件是否被更动过?
[root@study ~]# rpm -V logrotate
#如果没有出现任何讯息,恭喜你,该软件所提供的文件没有被更动过。 
#如果有出现任何讯息,才是有出现状况啊!

#范例二:查询一下,你的 /etc/crontab 是否有被更动过?
[root@study ~]# rpm -Vf /etc/crontab
.......T. c /etc/crontab
#因为有被更动过,所以会列出被更动过的信息类型!

好了,那么我怎么知道到底我的文件被更动过的内容是什么?例如上面的范例二。简单的说明一下吧! 例如,我们检查一下 logrotate 这个软件:

[root@study Packages]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
#共有 10 个文件!请修改 /etc/logrotate.conf 内的 rotate 变成 5


[root@study Packages]# rpm -V logrotate 
S.5....T.  c /etc/logrotate.conf

你会发现在档名之前有个 c ,然后就是一堆奇怪的文字了。那个 c 代表的是 configuration , 就是配置文件的意思。至于最前面的几个信息是:

  • S :(file Size differs) 文件的容量大小是否被改变
  • M :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可执行等参数已被改变
  • 5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同
  • D :(Device major/minor number mis-match) 装置的主/次代码已经改变
  • L :(readLink(2) path mis-match) Link 路径已被改变
  • U :(User ownership differs) 文件的所属人已被改变
  • G :(Group ownership differs) 文件的所属群组已被改变
  • T :(mTime differs) 文件的建立时间已被改变
  • P :(caPabilities differ) 功能已经被改变

所以,如果当一个配置文件所有的信息都被更动过,那么他的显示就会是:

SM5DLUGTP c filename

至于那个 c 代表的是『 Config file 』的意思,也就是文件的类型,文件类型有底下这几类:

  • c :配置文件 (config file)
  • d :文件数据文件 (documentation)
  • g :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)
  • l :许可证文件 (license file)
  • r :自述文件 (read me)

经过验证的功能,你就可以知道那个文件被更动过。那么如果该文件的变更是『预期中的』,那么就没有什么大问题,但是如果该文件是『非预期的』,那么是否被入侵了呢?一般来说,配置文件 (configure) 被更动过是很正常的,万一你的 binary program 被更动过呢? 那就得要特别特别小心了!

数字签名 (digital signature)

谈完了软件的验证后,不知道你有没有发现一个问题,那就是,验证只能验证软件内的信息与 /var/lib/rpm/ 里面的数据库信息而已,如果该软件文件所提供的数据本身就有问题,那你使用验证的手段也无法确定该软件的正确性啊! 那如何解决呢?在 Tarball 与文件的验证方面,我们可以使用前一章谈到的 md5 指纹码来检查,不过,连指纹码也可能会被窜改的!那怎办?没关系,我们可以透过数字签名来检验软件的来源的!

就像你自己的签名一样,我们的软件开发商原厂所推出的软件也会有一个厂商自己的签章系统! 只是这个签章被数字化了而已。厂商可以数字签名系统产生一个专属于该软件的签章,并将该签章的公钥 (public key) 释出。 当你要安装一个 RPM 文件时:

  1. 首先你必须要先安装原厂释出的公钥文件;
  2. 实际安装原厂的 RPM 软件时,rpm 指令会去读取 RPM 文件的签章信息,与本机系统内的签章信息比对,
  3. 若签章相同则予以安装,若找不到相关的签章信息时,则给予警告并且停止安装。

我们 CentOS 使用的数字签名系统为 GNU 计划的 GnuPG (GNU Privacy Guard, GPG)。 GPG 可以透过哈希运算,算出独一无二的专属密钥系统或者是数字签名系统,有兴趣的朋友可以参考文WIKI, 去了解一下 GPG 加密的机制!这里我们仅简单的说明数字签名在 RPM 文件上的应用而已。而根据上面的说明,我们也会知道首先必须要安装原厂释出的 GPG 数字签名的公钥文件啊!CentOS 的数字签名位于:

[root@study Packages]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-rw-r--r--. 1 root root 1690 12月  9 2015 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[root@study Packages]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)

mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9
Yw/vBIF8scm6T/vPN5fopsKiW9UsAhGKg0epC6y5ed+NAUHTEa6pSOdo7CyFDwtn
4HF61Esyb4gzPT6QiSr0zvdTtgYBRZjAEPFVu3Dio0oZ5UQZ7fzdZfeixMQ8VMTQ
4y4x5vik9B+cqmGiq9AW71ixlDYVWasgR093fXiD9NLT4DTtK+KLGYNjJ8eMRqfZ
Ws7g7C+9aEGHfsGZ/SxLOumx/GfiTloal0dnq8TC7XQ/JuNdB9qjoXzRF+faDUsj
WuvNSQEqUXW1dzJjBvroEvgTdfCJfRpIgOrc256qvDMp1SxchMFltPlo5mbSMKu1
x1p4UkAzx543meMlRXOgx2/hnBm6H6L0FsSyDS6P224yF+30eeODD4Ju4BCyQ0jO
IpUxmUnApo/m0eRelI6TRl7jK6aGqSYUNhFBuFxSPKgKYBpFhVzRM63Jsvib82rY
438q3sIOUdxZY6pvMOWRkdUVoz7WBExTdx5NtGX4kdW5QtcQHM+2kht6sBnJsvcB
JYcYIwAUeA5vdRfwLKuZn6SgAUKdgeOtuf+cPR3/E68LZr784SlokiHLtQkfk98j
NXm6fJjXwJvwiM2IiFyg8aUwEEDX5U+QOCA0wYrgUQ/h8iathvBJKSc9jQARAQAB
tEJDZW50T1MtNyBLZXkgKENlbnRPUyA3IE9mZmljaWFsIFNpZ25pbmcgS2V5KSA8
c2VjdXJpdHlAY2VudG9zLm9yZz6JAjUEEwECAB8FAlOn/0sCGwMGCwkIBwMCBBUC
CAMDFgIBAh4BAheAAAoJECTGqKf0qA61TN0P/2730Th8cM+d1pEON7n0F1YiyxqG
QzwpC2Fhr2UIsXpi/lWTXIG6AlRvrajjFhw9HktYjlF4oMG032SnI0XPdmrN29lL
F+ee1ANdyvtkw4mMu2yQweVxU7Ku4oATPBvWRv+6pCQPTOMe5xPG0ZPjPGNiJ0xw
4Ns+f5Q6Gqm927oHXpylUQEmuHKsCp3dK/kZaxJOXsmq6syY1gbrLj2Anq0iWWP4
Tq8WMktUrTcc+zQ2pFR7ovEihK0Rvhmk6/N4+4JwAGijfhejxwNX8T6PCuYs5Jiv
hQvsI9FdIIlTP4XhFZ4N9ndnEwA4AH7tNBsmB3HEbLqUSmu2Rr8hGiT2Plc4Y9AO
aliW1kOMsZFYrX39krfRk2n2NXvieQJ/lw318gSGR67uckkz2ZekbCEpj/0mnHWD
3R6V7m95R6UYqjcw++Q5CtZ2tzmxomZTf42IGIKBbSVmIS75WY+cBULUx3PcZYHD
ZqAbB0Dl4MbdEH61kOI8EbN/TLl1i077r+9LXR1mOnlC3GLD03+XfY8eEBQf7137
YSMiW5r/5xwQk7xEcKlbZdmUJp3ZDTQBXT06vavvp3jlkqqH9QOE8ViZZ6aKQLqv
pL+4bs52jzuGwTMT7gOR5MzD+vT0fVS7Xm8MjOxvZgbHsAgzyFGlI1ggUQmU7lu3
uPNL0eRx4S1G4Jn5
=OGYX
-----END PGP PUBLIC KEY BLOCK-----

从上面的输出,你会知道该数字签名码其实仅是一个随机数而已,这个随机数对于数字签名有意义而已, 我们看不懂啦!那么这个文件如何安装呢?透过底下的方式来安装即可喔!

[root@study Packages]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 

由于不同版本 GPG 密钥文件放置的位置可能不同,不过档名大多是以 GPG-KEY 来说明的,因此你可以简单的使用 locate 或 find 来找寻,如以下的方式来搜寻即可:

[root@study Packages]# locate GPG-KEY
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[root@study Packages]# find /etc/ -name '*GPG-KEY*'
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

那安装完成之后,这个密钥的内容会以什么方式呈现呢?基本上都是使用 pubkey 作为软件的名称的! 那我们先列出密钥软件名称后,再以 -qi 的方式来查询看看该软件的信息为何:

[root@study Packages]# rpm -qa | grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
gpg-pubkey-7bd9bf62-5762b5f8

[root@study Packages]# rpm -qi gpg-pubkey-7bd9bf62-5762b5f8
Name        : gpg-pubkey
Version     : 7bd9bf62
Release     : 5762b5f8
Architecture: (none)
Install Date: 2019年10月23日 星期三 14时49分54秒
Group       : Public Keys
Size        : 0
License     : pubkey
Signature   : (none)
Source RPM  : (none)
Build Date  : 2016年06月16日 星期四 22时21分44秒
Build Host  : localhost
Relocations : (not relocatable)
Packager    : nginx signing key <signing-key@nginx.com>
Summary     : gpg(nginx signing key <signing-key@nginx.com>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.11.3 (NSS-3)

mQENBE5OMmIBCAD+FPYKGriGGf7NqwKfWC83cBV01gabgVWQmZbMcFzeW+hMsgxH
W6iimD0RsfZ9oEbfJCPG0CRSZ7ppq5pKamYs2+EJ8Q2ysOFHHwpGrA2C8zyNAs4I
QxnZZIbETgcSwFtDun0XiqPwPZgyuXVm9PAbLZRbfBzm8wR/3SWygqZBBLdQk5TE
fDR+Eny/M1RVR4xClECONF9UBB2ejFdI1LD45APbP2hsN/piFByU1t7yK2gpFyRt
97WzGHn9MV5/TL7AmRPM4pcr3JacmtCnxXeCZ8nLqedoSuHFuhwyDnlAbu8I16O5
XRrfzhrHRJFM1JnIiGmzZi6zBvH0ItfyX6ttABEBAAG0KW5naW54IHNpZ25pbmcg
a2V5IDxzaWduaW5nLWtleUBuZ2lueC5jb20+iQE+BBMBAgAoAhsDBgsJCAcDAgYV
CAIJCgsEFgIDAQIeAQIXgAUCV2K1+AUJGB4fQQAKCRCr9b2Ce9m/YloaB/9XGrol
kocm7l/tsVjaBQCteXKuwsm4XhCuAQ6YAwA1L1UheGOG/aa2xJvrXE8X32tgcTjr
KoYoXWcdxaFjlXGTt6jV85qRguUzvMOxxSEM2Dn115etN9piPl0Zz+4rkx8+2vJG
F+eMlruPXg/zd88NvyLq5gGHEsFRBMVufYmHtNfcp4okC1klWiRIRSdp4QY1wdrN
1O+/oCTl8Bzy6hcHjLIq3aoumcLxMjtBoclc/5OTioLDwSDfVx7rWyfRhcBzVbwD
oe/PD08AoAA6fxXvWjSxy+dGhEaXoTHjkCbz/l6NxrK3JFyauDgU4K4MytsZ1HDi
MgMW8hZXxszoICTTiQEcBBABAgAGBQJOTkelAAoJEKZP1bF62zmo79oH/1XDb29S
YtWp+MTJTPFEwlWRiyRuDXy3wBd/BpwBRIWfWzMs1gnCjNjk0EVBVGa2grvy9Jtx
JKMd6l/PWXVucSt+U/+GO8rBkw14SdhqxaS2l14v6gyMeUrSbY3XfToGfwHC4sa/
Thn8X4jFaQ2XN5dAIzJGU1s5JA0tjEzUwCnmrKmyMlXZaoQVrmORGjCuH0I0aAFk
RS0UtnB9HPpxhGVbs24xXZQnZDNbUQeulFxS4uP3OLDBAeCHl+v4t/uotIad8v6J
SO93vc1evIje6lguE81HHmJn9noxPItvOvSMb2yPsE8mH4cJHRTFNSEhPW6ghmlf
Wa9ZwiVX5igxcvaIRgQQEQIABgUCTk5b0gAKCRDs8OkLLBcgg1G+AKCnacLb/+W6
cflirUIExgZdUJqoogCeNPVwXiHEIVqithAM1pdY/gcaQZmIRgQQEQIABgUCTk5f
YQAKCRCpN2E5pSTFPnNWAJ9gUozyiS+9jf2rJvqmJSeWuCgVRwCcCUFhXRCpQO2Y
Va3l3WuB+rgKjsQ=
=EWWI
-----END PGP PUBLIC KEY BLOCK-----

重点就是最后面出现的那一串码!那可是作为数字签名非常重要的一环!如果你忘记加上数字签名,很可能很多原版软件就不能让你安装除非你利用 rpm 时选择略过数字签名的选项。

RPM卸载程序包

要注意的是,『解安装的过程一定要由最上层往下解除』,以 rp-pppoe 为例,这一个软件主要是依据 ppp 这个软件来安装的,所以当你要解除 ppp 的时候,就必须要先解除 rp-pppoe 才行!否则就会发生结构上的问题啦!这个可以由建筑物来说明,如果你要拆除五、六楼,那么当然要由六楼拆起,否则先拆的是第五楼时,那么上面的楼层难道会悬空?

移除的选项很简单,就透过 -e 即可移除。不过,经常发生软件属性相依导致无法移除某些软件的问题!我们以底下的例子来说明:

#1.找出与 pam 有关的软件名称,并尝试移除 pam 这个软件:
[root@study Packages]# rpm -qa | grep pam
fprintd-pam-0.5.0-4.0.el7_0.x86_64
pam-devel-1.1.8-12.el7_1.1.x86_64
gnome-keyring-pam-3.14.0-1.el7.x86_64
pam-1.1.8-12.el7_1.1.x86_64

[root@study Packages]# rpm -e pam
错误:依赖检测失败:    <--这里就是上面提到的库依赖问题
        libpam.so.0()(64bit) 被 (已安裝) libpwquality-1.2.3-4.el7.x86_64 需要
        libpam.so.0()(64bit) 被 (已安裝) libuser-0.60-7.el7_1.x86_64 需要
        libpam.so.0()(64bit) 被 (已安裝) passwd-0.79-4.el7.x86_64 需要
        ......


#2.若仅移除 pam-devel 这个之前范例安装上的软件呢?
[root@study Packages]# rpm -e pam-devel  <--不会出现任何信息
[root@study Packages]# rpm -q pam-devel
未安装软件包 pam-devel 

从范例一我们知道 pam 所提供的函式库是让非常多其他软件使用的,因此你不能移除 pam ,除非将其他相依软件一口气也全部移除!你当然也能加 --nodeps 来强制移除,不过,如此一来所有会用到 pam 函式库的软件,都将成为无法运作的程序,我想,你的主机也只好准备停机了吧! 至于范例二中,由于pam-devel 是依附于 pam 的开发工具,你可以单独安装与单独移除!

由于 RPM 文件常常会安装/移除/升级等,某些动作或许可能会导致 RPM 数据库 /var/lib/rpm/ 内的文件破损。果真如此的话,那你该如何是好?别担心,我们可以使用 --rebuilddb 这个选项来重建一下数据库喔! 作法如下:

[root@study Packages]# rpm --rebuilddb 

19.3 YUM在线管理程序包

我们在一开始的地方谈到过 yum 这玩意儿,这个 yum 是透过分析 RPM 的标头资料后,根据各软件的相关性制作出属性相依时的解决方案,然后可以自动处理软件的相依属性问题,以解决软件安装或移除与升级的问题。详细的 yum 服务器与客户端之间的沟通,可以再参考wiki.

由于 distribution 必须要先释出软件,然后将软件放置于 yum 服务器上面,以提供客户端来要求安装与升级之用的。因此我们想要使用 yum 的功能时,必须要先找到适合的 yum server 才行!而每个 yum server 可能都会提供许多不同的软件功能,那就是我们之前谈到的『软件库』!因此,你必须要前往 yum server 查询到相关的软件库网址后,再继续处理后续的设定事宜。

事实上 CentOS 在释出软件时已经制作出多部映像站点 (mirror site) 提供全世界的软件更新之用。 所以,理论上我们不需要处理任何设定值,只要能够连上 Internet ,就可以使用 yum !底下就让我们来玩玩看吧!

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

查询功能:yum [list|info|search|provides|whatprovides]参数

如果想要查询利用 yum 来查询原版 distribution 所提供的软件,或已知某软件的名称,想知道该软件的功能,可以利用 yum 相关的参数为:

[root@study ~]# yum [option] [查询工作项目] [相关参数]
选项与参数:
[option]:主要的选项,包括有:
  -y :当 yum 要等待用户输入时,这个选项可以自动提供 yes 的响应;
  --installroot=/some/path :将该软件安装在 /some/path 而不使用默认路径
[查询工作项目] [相关参数]:这方面的参数有:
  search :搜寻某个软件名称或者是描述 (description) 的重要关键字;
  list :列出目前 yum 所管理的所有的软件名称与版本,有点类似 rpm -qa; 
  info :同上,不过有点类似 rpm -qai 的执行结果; 
  provides:从文件去搜寻软件!类似 rpm -qf 的功能!


#范例一:搜寻磁盘阵列 (raid) 相关的软件有哪些?
[root@study Packages]# yum search raid
已加载插件:fastestmirror, langpacks         <--yum系统自己找出最近的yum server
Loading mirror speeds from cached hostfile <--找出速度最快的哪一步yum server
 * epel: nrt.edge.kernel.org               <--这个来源服务器
=============================================== N/S matched: raid ================================================
dmraid.x86_64 : dmraid (Device-mapper RAID tool and library)
dmraid.i686 : dmraid (Device-mapper RAID tool and library)
dmraid-devel.x86_64 : Development libraries and headers for dmraid.
dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting
libblockdev-mdraid.i686 : The MD RAID plugin for the libblockdev library
libblockdev-mdraid.x86_64 : The MD RAID plugin for the libblockdev library
libblockdev-mdraid-devel.i686 : Development files for the libblockdev-mdraid plugin/library
libblockdev-mdraid-devel.x86_64 : Development files for the libblockdev-mdraid plugin/library
libstoragemgmt-megaraid-plugin.noarch : Files for LSI MegaRAID support for libstoragemgmt
dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO
iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)
snapraid.x86_64 : Disk array backup for many large rarely-changed files
#在冒号 (:) 左边的是软件名称,右边的则是在 RPM 内的 name 设定 (软件名)
#上面的结果,这不就是与 RAID 有关的软件吗?如果想了解 mdadm 的软件内容呢?


#范例二:找出 mdadm 这个软件的功能为何
[root@study Packages]# yum info mdadm
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: nrt.edge.kernel.org
已安装的软件包      <--这说明该软件是已经安装的了
名称    :mdadm    <--软件的名称
架构    :x86_64   <--这个软件编译的架构
版本    :3.3.2    <--此软件的版本
发布    :7.el7    <--此软件释放的版本
大小    :928 k    <--此软件的文件总量
源    :installed  <--这个软件回报说已安装
来自源:anaconda
简介    : The mdadm program controls Linux md devices (software RAID arrays)
网址    :http://www.kernel.org/pub/linux/utils/raid/mdadm/
协议    : GPLv2+
描述    : The mdadm program is used to create, manage, and monitor Linux MD (software
         : RAID) devices.  As such, it provides similar functionality to the raidtools
         : package.  However, mdadm is a single program, and it can perform
         : almost all functions without a configuration file, though a configuration
         : file can be used to help with some common tasks.

可安装的软件包
名称    :mdadm
架构    :x86_64
版本    :4.1
发布    :1.el7
大小    :435 k
源    :base/7/x86_64
简介    : The mdadm program controls Linux md devices (software RAID arrays)
网址    :http://www.kernel.org/pub/linux/utils/raid/mdadm/
协议    : GPLv2+
描述    : The mdadm program is used to create, manage, and monitor Linux MD (software
         : RAID) devices.  As such, it provides similar functionality to the raidtools
         : package.  However, mdadm is a single program, and it can perform
         : almost all functions without a configuration file, though a configuration
         : file can be used to help with some common tasks.


#范例三:列出 yum 服务器上面提供的所有软件名称
[root@study Packages]# yum list | more
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: nrt.edge.kernel.org
已安装的软件包
GConf2.x86_64                           3.2.6-8.el7                    @anaconda
ModemManager.x86_64                     1.1.0-8.git20130913.el7        @anaconda
ModemManager-glib.x86_64                1.1.0-8.git20130913.el7        @anaconda
NetworkManager.x86_64                   1:1.0.6-27.el7                 @anaconda
NetworkManager-adsl.x86_64              1:1.0.6-27.el7                 @anaconda
NetworkManager-glib.x86_64              1:1.0.6-27.el7                 @anaconda
......
#上面提供的意义为:[软件名称 版本    在哪个软件库内]


#范例四:列出目前服务器上可供本机进行升级的软件有哪些?
[root@study Packages]# yum list updates | more
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: nrt.edge.kernel.org
更新的软件包
ModemManager.x86_64                       1.6.10-3.el7_6                 base   
ModemManager-glib.x86_64                  1.6.10-3.el7_6                 base   
NetworkManager.x86_64                     1:1.18.0-5.el7_7.1             updates
NetworkManager-adsl.x86_64                1:1.18.0-5.el7_7.1             updates
NetworkManager-glib.x86_64                1:1.18.0-5.el7_7.1             updates
NetworkManager-libnm.x86_64               1:1.18.0-5.el7_7.1             updates
...
#上面就列出在那个软件库内可以提供升级的软件与版本!


#范例五:列出提供 passwd 这个文件的软件有哪些
[root@study Packages]# yum provides passwd
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: nrt.edge.kernel.org
passwd-0.79-5.el7.x86_64 : An utility for setting or changing passwords using PAM
源    :base
passwd-0.79-4.el7.x86_64 : An utility for setting or changing passwords using PAM
源    :@anaconda
#找到了!就是上面的这个软件提供了 passwd 这个程序!

透过上面的查询,你应该大致知道 yum 如何用在查询上面了吧?那么实际来应用一下:

  • 例题:

    利用 yum 的功能,找出以 pam 为开头的软件名称有哪些?而其中尚未安装的又有哪些?
  • 答:

    [xiaoqi@i7dom ~]$ yum list pam*
    Loaded plugins: fastestmirror, langpacks
    Repository epel is listed more than once in the configuration
    Determining fastest mirrors
    Installed Packages
    pam.x86_64                                               1.1.8-22.el7                                    @anaconda
    Available Packages  <--底下则是『可升级』的或『未安装』的
    pam.i686                                                 1.1.8-22.el7                                    os       
    pam-devel.i686                                           1.1.8-22.el7                                    os       
    pam-devel.x86_64                                         1.1.8-22.el7                                    os       
    pam-kwallet.x86_64                                       5.5.2-1.el7                                     epel     
    pam_2fa.x86_64                                           1.0-1.el7                                       epel     
    pam_afs_session.x86_64                                   2.6-5.el7                                       epel     
    pam_krb5.i686                                            2.4.8-6.el7                                     os       
    pam_krb5.x86_64                                          2.4.8-6.el7                                     os  
    .....
    #如上所示,所以可升级者有 pam 这一个软件,完全没有安装的则是 pam-devel 等其他几个软件!

安装/升级功能:yum [install|update]软件

既然可以查询,那么安装与升级呢?很简单啦!就利用 install 与 update 这两项工作来处理即可!

[root@study ~]# yum [option] [安装与升级的工作项目] [相关参数]
选项与参数:
install :后面接要安装的软件!
update :后面接要升级的软件,若要整个系统都升级,就直接 update 即可


#范例一:将前一个练习找到的未安装的 pam-devel 安装起来
[root@study Packages]# yum install pam-devel
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: nrt.edge.kernel.org
正在解决依赖关系
--> 正在检查事务
---> 软件包 pam-devel.x86_64.0.1.1.8-22.el7 将被 安装
--> 正在处理依赖关系 pam(x86-64) = 1.1.8-22.el7,它被软件包 pam-devel-1.1.8-22.el7.x86_64 需要
--> 正在检查事务
---> 软件包 pam.x86_64.0.1.1.8-12.el7_1.1 将被 升级
---> 软件包 pam.x86_64.0.1.1.8-22.el7 将被 更新
--> 解决依赖关系完成

依赖关系解决
#由上面的检查发现到 pam 这个软件也需要同步升级,这样才能够安装新版 pam-devel! 
#至于底下则是一个总结的表格显示!
==================================================================================================================
 Package                     架构                     版本                           源                      大小
==================================================================================================================
正在安装:
 pam-devel                   x86_64                   1.1.8-22.el7                   base                   184 k
为依赖而更新:
 pam                         x86_64                   1.1.8-22.el7                   base                   720 k

事务概要
==================================================================================================================
安装  1 软件包                   <--要安装的是一个软件
升级           ( 1 依赖软件包)    <--因为相依属性问题,需要额外加装一个软件!

总下载量:904 k                  <--总共需要下载的容量!
Is this ok [y/d/N]:y   <--你得要自己决定是否要下载与安装!当然是 y 啊!
Downloading packages:   <--开始下载
No Presto metadata available for base
(1/2): pam-1.1.8-22.el7.x86_64.rpm                                                         | 720 kB  00:00:00     
(2/2): pam-devel-1.1.8-22.el7.x86_64.rpm                                                   | 184 kB  00:00:00     
------------------------------------------------------------------------------------------------------------------
总计                                                                              2.2 MB/s | 904 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在更新    : pam-1.1.8-22.el7.x86_64                                                                       1/3 
  正在安装    : pam-devel-1.1.8-22.el7.x86_64                                                                 2/3 
  清理        : pam-1.1.8-12.el7_1.1.x86_64                                                                   3/3 
  验证中      : pam-devel-1.1.8-22.el7.x86_64                                                                 1/3 
  验证中      : pam-1.1.8-22.el7.x86_64                                                                       2/3 
  验证中      : pam-1.1.8-12.el7_1.1.x86_64                                                                   3/3 

已安装:
  pam-devel.x86_64 0:1.1.8-22.el7                                                                                 

作为依赖被升级:
  pam.x86_64 0:1.1.8-22.el7                                                                                       

完毕!

移除功能:yum [remove] 软件

那能不能用 yum 移除软件呢?将刚刚的软件移除看看,会出现啥状况啊?

[root@study Packages]# yum remove pam-devel
已加载插件:fastestmirror, langpacks
正在解决依赖关系    <--同样的,先解决属性相依的问题
--> 正在检查事务
---> 软件包 pam-devel.x86_64.0.1.1.8-22.el7 将被 删除
--> 解决依赖关系完成

依赖关系解决

==================================================================================================================
 Package                    架构                    版本                             源                      大小
==================================================================================================================
正在删除:
 pam-devel                  x86_64                  1.1.8-22.el7                     @base                  528 k

事务概要
==================================================================================================================
移除  1 软件包      <--没有相依属性的问题,仅移除一个软件!

安装大小:528 k
是否继续?[y/N]:y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在删除    : pam-devel-1.1.8-22.el7.x86_64                                                                 1/1 
  验证中      : pam-devel-1.1.8-22.el7.x86_64                                                                 1/1 

删除:
  pam-devel.x86_64 0:1.1.8-22.el7                                                                                 

完毕!

连移除也这么简单!看来,似乎不需要 rpm 这个指令也能够快乐的安装所有的软件了! 虽然是如此,但是 yum 毕竟是架构在 rpm 上面所发展起来的,所以,还是得需要了解 rpm 才行! 不要学了 yum 之后就将 rpm 的功能忘记了呢!

19.3.2 yum 的配置文件

虽然 yum 是你的主机能够联机上 Internet 就可以直接使用的,不过,由于 CentOS 的镜像节点可能速度比较慢,因此我们就需要手动修改yum配置文件吧镜像地址换成离我们比较近的节点.例如:

阿里云镜像库:https://opsx.alibaba.com/mirror
清华镜像库:https://mirrors.163.com/
网易镜像库:https://mirrors.tuna.tsinghua.edu.cn/

如果你连接到上述的网址后,就会发现里面有一堆连结,那些连结就是这个 yum 服务器所提供的软件库了! 所以高速网络中心也提供了 centosplus, cloud, extras, fasttrack, os, updates 等软件库,最好认的软件库就是 os (系统默认的软件) 与 updates (软件升级版本) !由于在我的测试用主机是利用 x86_64 的版本,因此那个 os 再点进去就会得到如下的可提供安装的网址:

为什么在上述的网址内呢?有什么特色!最重要的特色就是那个『 repodata 』的目录!该目录就是分析 RPM 软件后所产生的软件属性相依数据放置处!因此,当你要找软件库所在网址时,最重要的就是该网址底下一定要有个名为 repodata 的目录存在!那就是软件库的网址了! 其他的软件库正确网址,就请各位看倌自行寻找一下!现在让我们修改配置文件吧!

[root@study yum.repos.d]# vim 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/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

如上所示,仅列出 base 这个软件库内容而已,其他的软件库内容请自行查阅!上面的数据需要注意的是:

  • name:只是说明一下这个软件库的意义而已,重要性不高!
  • mirrorlist=:列出这个软件库可以使用的映射站台,如果不想使用,可以批注到这行;
  • baseurl=:这个最重要,因为后面接的就是软件库的实际网址! mirrorlist 是由 yum 程序自行去捉映像站 台,baseurl 则是指定固定的一个软件库网址!我们刚刚找到的网址放到这里来啦!
  • enable=1:就是让这个软件库被启动。如果不想启动可以使用 enable=0 喔!
  • gpgcheck=1:还记得 RPM 的数字签名吗?这就是指定是否需要查阅 RPM 文件内的数字签名!
  • gpgkey=:就是数字签名的公钥文件所在位置!使用默认值即可

了解这个配置文件之后,接下来让我们修改整个文件的内容,让我们这部主机可以直接使用高速网络中心的资源吧!修改的方式仅列出 base 这个软件库项目而已,其他的项目请您自行依照上述的作法来处理即可!


[base]
name=CentOS-$releasever - Base
mirrorlist=https://mirrors.aliyun.com/centos/7/os/x86_64/
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=https://mirrors.aliyun.com/centos/7/os/x86_64/
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=https://mirrors.aliyun.com/centos/7/os/x86_64/
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#默认情况下,软件仓库仅有这三个有启用!所以仅修改这三个软件库的 baseurl 而已!

接下来当然就是给它测试一下这些软件库是否正常的运作中!如何测试呢?再次使用 yum 即可~

#范例一:列出目前 yum server 所使用的软件库有哪些?
[root@study yum.repos.d]# yum repolist all
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识                           源名称                                                               状态
C7.0.1406-base/x86_64            CentOS-7.0.1406 - Base                                               禁用
C7.0.1406-centosplus/x86_64      CentOS-7.0.1406 - CentOSPlus                                         禁用
C7.0.1406-extras/x86_64          CentOS-7.0.1406 - Extras                                             禁用
C7.0.1406-fasttrack/x86_64       CentOS-7.0.1406 - CentOSPlus                                         禁用
C7.0.1406-updates/x86_64         CentOS-7.0.1406 - Updates                                            禁用
C7.1.1503-base/x86_64            CentOS-7.1.1503 - Base                                               禁用
C7.1.1503-centosplus/x86_64      CentOS-7.1.1503 - CentOSPlus                                         禁用
C7.1.1503-extras/x86_64          CentOS-7.1.1503 - Extras                                             禁用
C7.1.1503-fasttrack/x86_64       CentOS-7.1.1503 - CentOSPlus                                         禁用
C7.1.1503-updates/x86_64         CentOS-7.1.1503 - Updates                                            禁用
!base                            CentOS-7 - Base                                                      启用: 10,097
base-debuginfo/x86_64            CentOS-7 - Debuginfo                                                 禁用
base-source/7                    CentOS-7 - Base Sources                                              禁用
c7-media                         CentOS-7 - Media                                                     禁用
centosplus-source/7              CentOS-7 - Plus Sources                                              禁用
cr/7/x86_64                      CentOS-7 - cr                                                        禁用
!epel/x86_64                     Extra Packages for Enterprise Linux 7 - x86_64                       启用: 13,455
epel-debuginfo/x86_64            Extra Packages for Enterprise Linux 7 - x86_64 - Debug               禁用
epel-source/x86_64               Extra Packages for Enterprise Linux 7 - x86_64 - Source              禁用
epel-testing/x86_64              Extra Packages for Enterprise Linux 7 - Testing - x86_64             禁用
epel-testing-debuginfo/x86_64    Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Debug     禁用
epel-testing-source/x86_64       Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Source    禁用
!extras                          CentOS-7 - Extras                                                    启用:    305
extras-source/7                  CentOS-7 - Extras Sources                                            禁用
fasttrack/7/x86_64               CentOS-7 - fasttrack                                                 禁用
!nginx-mainline/7/x86_64         nginx mainline repo                                                  启用:    611
!nginx-stable/7/x86_64           nginx stable repo                                                    启用:    168
!updates                         CentOS-7 - Updates                                                   启用:    711
updates-source/7                 CentOS-7 - Updates Sources                                           禁用
repolist: 25,347
#上面最右边有写 enabled(启用) 才是有激活的!由于 /etc/yum.repos.d/
#有多个配置文件,所以你会发现还有其他的软件库存在。
  • 修改软件库产生的问题与解决之道

由于我们是修改系统默认的配置文件,事实上,我们应该要在 /etc/yum.repos.d/ 底下新建一个文件,该扩展名必须是 .repo 才行!但因为我们使用的是指定特定的镜像库站点,而不是其他软件开发商提供的软件库,因此才修改系统默认配置文件。但是可能由于使用的软件库版本有新旧之分,你得要知道, yum 会先下载软件库的清单到本机的 /var/cache/yum 里面去!那我们修改了网址却没有修改软件库名称(中括号内的文字),可能就会造成本机的列表与 yum 服务器的列表不同步,此时就会出 现无法更新的问题了!

那怎么办啊?很简单,就清除掉本机上面的旧数据即可!需要手动处理吗?不需要的,透过 yum 的 clean 项目来处理即可!

[root@study ~]# yum clean [packages|headers|all]
选项与参数: 
packages:将已下载的软件文件删除 
headers :将下载的软件文件头删除 
all :将所有软件库数据都删除!


#范例一:删除已下载过的所有软件库的相关数据 (含软件本身与列表)
[root@study yum.repos.d]# yum clean all

yum 19.3.3 的软件群组功能

透过 yum 来在线安装一个软件是非常的简单,但是,如果要安装的是一个大型项目呢? 举例来说,使用预设安装的方式安装了测试机,这部主机就只有 GNOME 这个窗口管理员,那我如果 要安装 KDE 呢?难道需要重新安装?当然不需要,透过 yum 的软件群组功能即可!来看看指令先:

[root@study ~]# yum [群组功能] [软件群组]
选项与参数:
grouplist :列出所有可使用的『软件群组组』,例如 Development Tools 之类的; 
groupinfo :后面接 group_name,则可了解该 group 内含的所有软件名; 
groupinstall:这个好用!可以安装一整组的软件群组,相当的不错用!
groupremove :移除某个软件群组;


#范例一:查阅目前软件库与本机上面的可用与安装过的软件群组有哪些?
[xiaoqi@i7dom ~]$ yum grouplist
Loaded plugins: fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
Available Environment Groups:   <--还可以安装的系统环境软件群组
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   Cinnamon Desktop
   MATE Desktop
   Basic Web Server
   Virtualization Host
   Server with GUI
   GNOME Desktop
   KDE Plasma Workspaces
   Development and Creative Workstation
Installed Groups:   <--已经安装的软件群组!
   Development tools
Available Groups:   <--还能额外安装的软件群组!
   Backup Client
   Base
   Cinnamon
   Compatibility Libraries
   Console internet tools
   E-mail server
   Educational Software
   Electronic Lab
   Fedora Packager
   Fonts
   General Purpose Desktop
   Graphical Administration Tools
   Graphics Creation Tools
   Hardware monitoring utilities
   Haskell
   Input Methods
   Internet Applications
   KDE Desktop
   LXQt Desktop
   Legacy UNIX Compatibility
   MATE
   Milkymist
   Network Infrastructure Server
   Networking Tools
   Office Suite and Productivity
   Performance Tools
   Scientific support
   Security Tools
   Smart card support
   System Management
   System administration tools
   Technical Writing
   TurboGears application framework
   Web Server
   Web Servlet Engine
   Xfce
Done

你会发现系统上面的软件大多是群组的方式一口气来提供安装的!还记全新安装 CentOS 时,不是可以选择所需要的软件吗?而那些软件不是利用 GNOME/KDE/X Window ... 之类的名称存在吗? 其实那就是软件群组!如果你执行上述的指令后,在『Available Groups』底下应该会看到一个『Scientific Support』的软件群组,想知道那是啥吗?就这样做:

[root@study yum.repos.d]# yum groupinfo "Scientific Support"
已加载插件:fastestmirror, langpacks
没有安装组信息文件
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
 * epel: mirrors.aliyun.com

组:科学记数法支持
 组编号:scientific
 描述:用于数学和科学计算以及平行计算的工具。
 可选的软件包:
   Macaulay2
   atlas
   fftw
   fftw-devel
   fftw-static
   gnuplot
   gromacs
   gromacs-mpi
   gsl-devel
   hdf
   hdf5
   .....

你会发现那就是一个科学运算、平行运算会用到的各种工具就是了!而下方则列出许多应该会在该群组安装时被下载与安装的软件们! 让我们直接来安装看看!

[root@study ~]# yum groupinstall "Scientific Support"

正常情况下系统是会帮你安装好各项软件的。只是伤脑筋的是,刚刚好 Scientific Support 里面的软件都是『可选择的』!而不是『主要的 (mandatory)』, 因此预设情况下,上面这些软件通通不会帮你安装!!如果你想要安装上述的软件,可以使用 yum install atlas fftw .. 一个一个写进去安装~ 如 果想要让 groupinstall 预设安装好所有的 optional 软件呢?那就得要修改配置文件!更改选 groupinstall 选择的软件项目即可!如下所示:

[root@study yum.repos.d]# vim /etc/yum.conf 
......
distroverpkg=centos-release  #找到这一行,底下新增一行
group_package_types=default, mandatory, optional
......

[root@study ~]# yum groupinstall "Scientific Support"

你就会发现系统开始进行了一大堆软件的安装!这个 group 功能真是非常的方便!这个功能请一定要记下来,对你未来安装软件是非常有帮助的喔!

EPEL/ELRepo外挂软件以及自定义配置文件

因为工作的关系,在 Linux 上面经常需要安装第三方协助软件,这包括 NetCDF 以及 MPICH 等等的软件。现在由于平行处理的函式库需求大增,所以 MPICH 已经纳入预设的 CentOS 7 软件库中。但是 NetCDF 这个软件就没有包含在里头了~同时,Linux 上面还有个很棒的统计软件,这个软件名称为『 R 』! 预设也是不在 CentOS 的软件库内.那怎办?要使用源码去编译与安装吗?这倒不需要因为有很多网友提供预先编译版本了!

在 Fedora 基金会里面发展了一个外加软件计划 (Extra Packages for Enterprise Linux, EPEL),这个计划主要是针对 Red Hat Enterprise Linux 的版本来开发的,刚刚好 CentOS 也是针对 RHEL 的版本来处理的!所以也就能够支持该软件库的相关软件相依环境了。这个计划的主网站在底下网页:

而我们的 CentOS 7 主要可以使用的软件仓库网址为:

除了上述的 Fedora 计划所提供的额外软件库之外,其实社群里面也有朋友针对 CentOS 与 EPEL 的不足而提供的许多软件仓库喔! 底下只是列出当初为了要处理 PCIpassthrough 虚拟化而使用到的 ELRepo 这个软件仓库,若有其他的需求,你就得要自己搜寻了! 这个 ELRepo 软件仓库与提供给 CentOS 7.x 的网址如下:

这个 ELRepo 的软件库跟其他软件库比较不同的地方在于这个软件库提供的数据大多是与核心、核心模块与虚拟化相关软件有关,例如 NVidia 的驱动程序也在里面! 尤其提供了最新的核心 (取名为 kernel-ml 的软件名称,其实就是最新的 Linux 核心!),如果你的系统像某些开发服务器一样,那就有可能会使用到这个软件库喔!

  • 根据上面的说明,来玩一玩底下这个模拟案例看看:
我的系统上面想要透过上述的 CentOS 7 的 EPEL 计划来安装 netcdf 以及 R 这两套软件,该如何处理?

首先,你的系统应该要针对 epel 进行 yum 的配置文件处理,处理方式如下:

[root@study yum.repos.d]# vim /etc/yum.repos.d/epel.repo
[epel]
name = epel packages
baseurl = https://dl.fedoraproject.org/pub/epel/7/x86_64/
gpgcheek = 0
enable = 0
#故意不要启动这个软件仓库,只是未来有需要的时候才进行安装,预设不要去找这个软件库!

接下来使用这个软件库来进行安装 netcdf 与 R 的过程!

[root@study yum.repos.d]# yum --enablerepo epel install netcdf R
#这样就可以安装起来了!未来你没有加上 --enablerepo=epel 时,这个 EPEL 的软件并不会更新喔!

yum配置本地源

[root@study yum.repos.d]# vim /etc/yum.repos.d/cdrom.repo 
[mycdrom]
name = mycdrom
baseurl = file:///mnt/cdrom
gpgcheck = 0
enable = 0


[root@study yum.repos.d]# yum --enablerepo=mycdrom software_name

这个设定功能在你没有网络但是却需要解决很多软件相依性的状况时,相当好用啊!

全系统自动升级

我们可以手动选择是否需要升级,那能不能让系统自动升级,让我们的系统随时保持在最新的状态呢? 当然可以啊!透过『 yum -y update 』来自动升级,那个 -y 很重要,因为可以自动回答 yes 来开始下载与安装! 然后再透过 crontab 的功能来处理即可!假设我每天在凌晨 3:00 网络带宽比较轻松的时候进行升级,你可以这样做的:

[root@study yum.repos.d]# echo '00 03 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/cron.d/yumupdate
[root@study yum.repos.d]# vim /etc/crontab 

从此你的系统就会自动升级啦!此外,你还是得要分析登录档与收集 root 的信件的,因为如果升级的是核心软件 (kernel),那么你还是得要重新启动才会让安装的软件顺利运作的!所以还是得分析登录日志,若有新核心安装,就重新启动,否则就让系统自动维持在最新较安全的环境!

19.4 SRPM的使用:(rpmbuild)

谈完了 RPM 类型的软件之后,再来我们谈一谈包含了 Source code 的 SRPM 该如何使用呢?假如今天我们由网络上面下载了一个 SRPM 的文件,该如何安装他?又,如果我想要修改这个 SRPM 里面原始码的相关设定值,又该如何订正与重新编译呢? 此外,最需要注意的是,新版的 rpm 已经将 RPM 与 SRPM 的指令分开了,SRPM 使用的是 rpmbuild 这个指令,而不是 rpm 喔!

19.4.1 利用默认值安装 SRPM 文件(--rebuid/--recompile)

假设我下载了一个 SRPM 的文件,又不想要修订这个文件内的原始码与相关的设定值,那么我可以直接编译并安装吗?当然可以!利用 rpmbuild 配合选项即可。选项主要有底下两个:

optionattention
--rebuild这个选项会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的文件,但是产生的 RPM 文件并没有安装到系统上。当你使用 --rebuild 的时候,最后通常会发现一行字体:
Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm
这个就是编译完成的 RPM 文件!这个文件就可以用来安装!安装的时候请加绝对路径来安装即可!
--recompile这个动作会直接的『编译』『打包』并且『安装』!请注意,rebuild 仅『编译并打包』而已,而 recompile 不但进行编译跟打包,还同时进行『安装』了!

不过,要注意的是,这两个选项都没有修改过 SRPM 内的设定值,仅是透过再次编译来产生 RPM 可安装软件文件而已。一般来说,如果编译的动作顺利的话,那么编译过程所产生的中间暂存盘都会被自动删除,如果发生任何错误,则该中间文件会被保留在系统上,等待用户的除错动作!


  • 问:

请由 http://vault.centos.org/ 下载正确的 CentOS 版本中,在 updates 软件库当中的 ntp 软件 SRPM,请下载最新的那个版本即可,然后进行编译的行为。

  • 答:

目前最新的版本为ntp-4.2.6p5-22.el7.centos.src.rpm这一个,所以安装步骤如下:

#1.下载文件
[root@study ~]# wget http://vault.centos.org/7.2.1511/os/Source/SPackages/ntp-4.2.6p5-22.el7.centos.src.rpm

#2.尝试直接编译
[root@study ~]# rpmbuild --rebuild ntp-4.2.6p5-22.el7.centos.src.rpm 

#3.提示所需依赖没有安装,安装依赖后再试试
[root@study ~]# yum install -y libcap-devel libedit-devel  pps-tools-devel autogen autogen-libopts-devel

4.再次编译试试
[root@study ~]# rpmbuild --rebuild ntp-4.2.6p5-22.el7.centos.src.rpm

#5.编译好的软件会被放置到:
[root@study ~]# ll /root/rpmbuild/RPMS/x86_64/
总用量 2428
-rw-r--r--. 1 root root  554916 11月 13 08:54 ntp-4.2.6p5-22.el7.centos.x86_64.rpm
-rw-r--r--. 1 root root   84548 11月 13 08:54 ntpdate-4.2.6p5-22.el7.centos.x86_64.rpm
-rw-r--r--. 1 root root 1762144 11月 13 08:54 ntp-debuginfo-4.2.6p5-22.el7.centos.x86_64.rpm
-rw-r--r--. 1 root root   77028 11月 13 08:54 sntp-4.2.6p5-22.el7.centos.x86_64.rpm

上面的测试案例是将一个 SRPM 文件抓下来之后,依据你的系统重新进行编译。一般来说,因为该编译可能会依据你的系统硬件而优化,所以可能效能会好一些些,但是...人类根本感受不到那种效能优化的效果所以并不建议你这么作。此外,这种情况也很能发生在你从不同的 Linuxdistribution 所下载的 SRPM 拿来想要安装在你的系统上,这样作才算是有点意义。

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

SRPM 既然含有 source code ,那么其中必定有配置文件啰,所以首先我们必需要知道,这个 SRPM 在进行编译的时候会使用到哪些目录呢?这样一来才能够来修改!不过从 CentOS6.x 开始 (当然包含我们的 CentOS 7.x),因为每个用户应该都有能力自己安装自己的软件,因此 SRPM 安装、设定、编译、最终结果所使用的目录都与操作者的家目录有关~假设你用 root 的身份来进行 SRPM 的操作,那么你应该就会使用到下列的目录喔:

目录解释
/root/rpmbuild/SPECS这个目录当中放置的是该软件的配置文件,例如这个软件的信息参数、设定项目等等都放置在这里;
/root/rpmbuild/SOURCES这个目录当中放置的是该软件的原始文件 (*.tar.gz 的文件) 以及 config 这个配置文件;
/root/rpmbuild/BUILD在编译的过程中,有些暂存的数据都会放置在这个目录当中;
/root/rpmbuild/RPMS经过编译之后,并且顺利的编译成功之后,将打包完成的文件放置在这个目录当中。里头有包含了 x86_64, noarch.... 等等的次目录。
/root/rpmbuild/SRPMS与 RPMS 内相似的,这里放置的就是 SRPM 封装的文件!有时候你想要将你的软件用 SRPM 的方式释出时,你的 SRPM 文件就会放置在这个目录中了。

此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下产生一个相对应的错误档,你可以根据该错误档进行除错的工作! 等到所有的问题都解决之后,也编译成功了,那么刚刚解压缩之后的文件,就是在 /root/rpmbild/{SPECS, SOURCES, BUILD} 等等的文件都会被杀掉,而只剩下放置在 /root/rpmbuild/RPMS 底下的文件了!

由于 SRPM 需要重新编译,而编译的过程当中,我们至少需要有 make 与其相关的程序,及 gcc, c, c++ 等其他的编译用的程序语言来进行编译。所以,如果你在安装的过程当中没有选取软件开发工具之类的软件,这时就得要使用上一小节介绍的 yum 来安装就是了! 当然,那个 "Development Tools" 的软件群组请不要忘记安装了!


尝试将上个练习下载的 ntp 的 SRPM 软件直接安装到系统中 (不要编译),然后查阅一下所有用到的目录为何?
#假设你用 root 的身份来进行安装的行为喔!
[root@study x86_64]# rpm -ivh ntp-4.2.6p5-22.el7.centos.x86_64.rpm 

#查阅一下 /root/rpmbuild 目录的内容!
[root@study x86_64]# tree /root/rpmbuild/
/root/rpmbuild/
|-- BUILD
|-- BUILDROOT
|-- RPMS
|   |-- noarch
|   |   |-- ntp-doc-4.2.6p5-22.el7.centos.noarch.rpm
|   |   `-- ntp-perl-4.2.6p5-22.el7.centos.noarch.rpm
|   `-- x86_64
|       |-- ntp-4.2.6p5-22.el7.centos.x86_64.rpm
|       |-- ntpdate-4.2.6p5-22.el7.centos.x86_64.rpm
|       |-- ntp-debuginfo-4.2.6p5-22.el7.centos.x86_64.rpm
|       `-- sntp-4.2.6p5-22.el7.centos.x86_64.rpm
|-- SOURCES
|-- SPECS
`-- SRPMS
    |-- ntp.spec

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

如前一个小节的练习,我们知道在 /root/rpmbuild/SOURCES 里面会放置原始文件 (tarball) 以及相关的补丁文件 (patch file), 而我们也知道编译需要的步骤大抵就是 ./configure, make, make check, make install 等,那这些动作写入在哪里呢? 就在 SPECS 目录中!让我们来瞧一瞧 SPECS 里面的文件说些什么吧!

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim ntp.spec
# 1. 首先,这个部分在介绍整个软件的基本相关信息!不论是版本还是释出次数等。
Summary: The NTP daemon and utilities       # 简易的说明这个软件的功能 
Name: ntp                                   # 软件的名称
Version: 4.2.6p5                            # 软件的版本
Release: 19%{?dist}.1                       # 软件的释出版次
# primary license (COPYRIGHT) : MIT         # 底下有很多 # 的批注说明!
.....(中间省略).....
License: (MIT and BSD and BSD with advertising) and GPLv2
Group: System Environment/Daemons
Source0: http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{version}.tar.gz
Source1: ntp.conf                           # 写 SourceN 的就是原始码!
Source2: ntp.keys                           # 原始码可以有很多个!
.....(中间省略).....
Patch1: ntp-4.2.6p1-sleep.patch             # 接下来则是补丁文件,就是 PatchN 的目的!
Patch2: ntp-4.2.6p4-droproot.patch
.....(中间省略).....


# 2. 这部分则是在设定相依属性需求的地方!
URL: http://www.ntp.org                     # 底下则是说明这个软件的相依性,
Requires(post): systemd-units               # 还有编译过程需要的软件有哪些等等!
Requires(preun): systemd-units
Requires(postun): systemd-units
Requires: ntpdate = %{version}-%{release}
BuildRequires: libcap-devel openssl-devel libedit-devel perl-HTML-Parser BuildRequires: pps-tools-devel autogen autogen-libopts-devel systemd-units
.....(中间省略).....
%package -n ntpdate                         # 其实这个软件包含有很多次软件喔! 
Summary: Utility to set the date and time via NTP
Group: Applications/System
Requires(pre): shadow-utils
Requires(post): systemd-units
Requires(preun): systemd-units Requires(postun): systemd-units
.....(中间省略).....


#3.编译前的预处理,以及编译过程当中所需要进行的指令,都写在这里
%prep                                       # 这部分大多在处理补丁的动作
%setup -q -a 5                
%patch1 -p1 -b .sleep                       # 这些patch当然与前面的patchN有关
%patch2 -p1 -b .droproot
.....(中间省略).....
%build                                      # 其实就是./configure make等动作
sed -i 's|$CFLAGS -Wstrict-overflow|$CFLAGS|' configure sntp/configure
export CFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing -fno-strict-overflow" 
export LDFLAGS="-pie -Wl,-z,relro,-z,now"
%configure \                                # 不就是 ./configure 的意思吗!
        --sysconfdir=%{_sysconfdir}/ntp/crypto \
        --with-openssl-libdir=%{_libdir} \
        --without-ntpsnmpd \
        --enable-all-clocks --enable-parse-clocks \ 
        --enable-ntp-signd=%{_localstatedir}/run/ntp_signd \ 
        --disable-local-libopts
echo '#define KEYFILE "%{_sysconfdir}/ntp/keys"' >> ntpdate/ntpdate.h 
echo '#define NTP_VAR "%{_localstatedir}/log/ntpstats/"' >> config.h

make %{?_smp_mflags}                        # make编译
.....(中间省略).....

%install                                    # 就是安装过程所进行的各项动作了! 
make DESTDIR=$RPM_BUILD_ROOT bindir=%{_sbindir} install

mkdir -p $RPM_BUILD_ROOT%{_mandir}/man{5,8}
sed -i 's/sntp\.1/sntp\.8/' $RPM_BUILD_ROOT%{_mandir}/man1/sntp.1
mv $RPM_BUILD_ROOT%{_mandir}/man{1/sntp.1,8/sntp.8} 
rm -rf $RPM_BUILD_ROOT%{_mandir}/man1
.....(中间省略).....


#4.这里列出,这个软件释出的文件有哪些的意思!
%files                                      # 这软件所属的文件有哪些的意思! %dir %{ntpdocdir}
%{ntpdocdir}/COPYRIGHT
%{ntpdocdir}/ChangeLog
.....(中间省略).....

# 5. 列出这个软件的更改历史纪录文件!
%changelog
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1 
- rebrand vendorzone

* Thu Apr 23 2015 Miroslav Lichvar <mlichvar@redhat.com> 4.2.6p5-19.el7_1.1 
- don't step clock for leap second with -x option (#1191122)
.....(后面省略).....

要注意到的是 ntp.sepc 这个文件,这是主要的将 SRPM 编译成 RPM 的配置文件,他的基本规则可以这样看:

  1. 整个文件的开头以 Summary 为开始,这部份的设定都是最基础的说明内容;
  2. 然后每个不同的段落之间,都以 % 来做为开头,例如 %prep 与 %install 等;

几个常见的 SRPM 设定段落:


系统整体信息方面:
参数参数意义
Summary本软件的主要说明,例如上表中说明了本软件是针对 NTP 的软件功能与工具等!
Name本软件的软件名称 (最终会是 RPM 文件的档名构成之一)
Version本软件的版本 (也会是 RPM 档名的构成之一)
Release这个是该版本打包的次数说明(也会是 RPM 档名的构成之一)。由于我们想要动点手脚,所以请将『 19%{?dist}.1 』修改为『 20.bac 』看看
License这个软件的授权模式,看起来涵盖了所有知名的 Open source 授权!!
Group这个软件在安装的时候,主要是放置于哪一个软件群组当中 (yum grouplist 的特点!);
URL这个原始码的主要官方网站;
SourceN这个软件的来源,如果是网络上下载的软件,通常一定会有这个信息来告诉大家这个原始档的来源! 此外,如果有多个软件来源,就会以 Source0, Source1... 来处理原始码喔!
PatchN就是作为补丁的 patch file 啰!也是可以有好多个!
BuildRoot设定作为编译时,该使用哪个目录来暂存中间文件 (如编译过程的目标文件/链接文件等档)。
上述为必须要存在的项目,底下为可使用的额外设定值
Requires如果你这个软件还需要其他的软件的支持,那么这里就必需写上来,则当你制作成 RPM 之后,系统 就会自动的去检查啦!这就是『相依属性』的主要来源啰!
BuildRequires编译过程中所需要的软件。Requires 指的是『安装时需要检查』的,因为与实际运作有关,这个 BuildRequires 指的是『编译时』所需要的软件,只有在 SRPM 编译成为 RPM 时才会检查的项目。

上面几个资料通常都必需要写!但是如果你的软件没有相依属性的关系时,那么就可以不需要那个 Requires! 根据上面的设定,最终的档名就会是『{Name}-{Version}-{Release}.{Arch}.rpm』的样式,以我们上面的设定来说,档名应该会是『ntp-4.2.6p5-20.abc.x86_64.rpm』的样子!

%description:

将你的软件做一个简短的说明!这个也是必需要的。还记得使用『 rpm -qi 软件名称 』会出现一些基础的说明吗? 上面这些东西包括 Description 就是在显示这些重要信息的啦!所以,这里记得要详加解释!

%prep:

pre 这个关键词原本就有『在...之前』的意思,因此这个项目在这里指的就是『尚未进行设定或安装之前,你要编译完成的 RPM 帮你事先做的事情』,就是 prepare 的简写!那么他的工作事项主要有:

  1. 进行软件的补丁 (patch) 等相关工作;
  2. 寻找软件所需要的目录是否已经存在?确认用的!
  3. 事先建立你的软件所需要的目录,或者事先需要进行的任务;
  4. 如果待安装的 Linux 系统内已经有安装的时候可能会被覆盖掉的文件时,那么就必需要进行备份(backup)的工作了!

在本案例中,你会发现程序会使用 patch 去进行补丁的动作!所以程序的原始码才会更新到最新!

%build:

build 就是建立!所以这个段落就是在谈怎么 make 编译成为可执行的程序! 你会发现在此部分的程序代码方面,就是 ./configure, make 等项目!一般来说,如果你会使用 SRPM 来进行重新编译的行为,通常就是要重新 ./configure 并给予新的参数设定!于是这部份就可能会修改到!

%install:

编译完成 (build) 之后,就是要安装!安装就是写在这里,也就是类似 Tarball 里面的 make install 的意思!

%files:

这个软件安装的文件都需要写到这里来,当然包括了『目录』!所以连同目录请一起写到这个段落当中!以备查验!此外,你也可以指定每个文件的类型,包括文件档 (%doc 后面接的) 与配置文件 (%config 后面接的) 等等。

%changelog:

这个项目主要则是在记录这个软件曾经的更新纪录!星号 (*) 后面应该要以时间,修改者,email 与软件版本来作为说明,减号 (-) 后面则是你要作的详细说明!在这部份新增了两行测试一下,内容如下:

%changelog
* Tue Nov 11 2019 xiaoqi Tsai <root@mail.root.local.com>- 4.2.6p5-20.xiaoqi 
- only rbuild this SRPM to RPM

修改到这里也差不多了,您也应该要了解到这个 ntp.spec 有多么重要!我们用 rpm -q 去查询一堆信息时,其实都是在这里写入的!

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

要将在 /root/rpmbuild 底下的数据编译或者是单纯的打包成为 RPM 或 SRPM 时,就需要 rpmbuild 指令与相关选项的帮忙了!我们只介绍两个常用的选项了解一下:

[root@study ~]# rpmbuild -ba ntp.spec <==编译并同时产生 RPM 与 SRPM 文件 
[root@study ~]# rpmbuild -bb ntp.spec <==仅编译成 RPM 文件

这个时候系统就会这样做:

  1. 先进入到 BUILD 这个目录中,亦即是: /root/rpmbuild/BUILD 这个目录;
  2. 依照 *.spec 文件内的 Name 与 Version 定义出工作的目录名称,以我们上面的例子为例,那么系统就会 在 BUILD 目录中先删除 ntp-4.2.6p5 的目录,再重新建立一个 ntp-4.2.6p5 的目录,并进入该目录;
  3. 在新建的目录里面,针对 SOURCES 目录下的来源文件,也就是 .spec 里面的 Source 设定的那个文件, 以 tar 进行解压缩,以我们这个例子来说,则会在 /root/rpmbuild/BUILD/ntp-4.2.6p5 当中,将 /root/rpmbuild/SOURCES/ntp- 等等多个原始码文件进行解压缩!
  4. 再来开始 %build 及 %install 的设定与编译!
  5. 最后将完成打包的文件给他放置到该放置的地方去,如果你的系统是 x86_64 的话,那么最后编译成功的 *.x86_64.rpm 文件就会被放置在 /root/rpmbuild/RPMS/x86_64 里面!如果是 noarch 那么自然就是 /root/rpmbuild/RPMS/noarch 目录下!

整个步骤大概就是这样子!最后的结果数据会放置在 RPMS 那个目录底下!我们这个案例中想要同时打包 RPM 与 SRPM ,因此自行处理一下『 rpmbuild -ba ntp.spec 』吧!

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# rpmbuild -ba ntp.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.abc.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.abc.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.abc.noarch.rpm 
Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.abc.x86_64.rpm 
Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-20.abc.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.abc.noarch.rpm 
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.abc.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xZh6yz
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd ntp-4.2.6p5
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-20.vbird.x86_64 
+ exit 0

[root@study SPECS]# find /root/rpmbuild -name 'ntp*rpm' 
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.abc.x86_64.rpm 
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.abc.x86_64.rpm 
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.abc.x86_64.rpm 
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.abc.noarch.rpm 
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.abc.noarch.rpm 
/root/rpmbuild/SRPMS/ntp-4.2.6p5-20.abc.src.rpm
# 上面分别是 RPM 与 SRPM 的文件档名!
最后修改:2020 年 01 月 21 日 04 : 37 PM

发表评论