CentOS 7上的程序管理:rpm、yum和源码编译安装
<h1>简介</h1><p>在Linux的早期时代(也许吧?我猜的。也可能是Unix。),想要在系统上安装一款应用程序,是比较复杂的。需要专业的人员自行获取程序的源代码,并且编译安装,这是非常的复杂且需要一定的专业功底的,这种方式叫做<span style="color: rgba(255, 0, 0, 1)"><strong>源码编译安装</strong></span>(后面会描述)。</p>
<p>再后来就有人/组织将这个过程简化了,他们将事先已经编译好的软件打包后,放到互联网上供用户下载。用户下载适用于自己的操作系统和硬件平台的软件包之后,只需要将其“解压”,那么该软件包所包含的各种文件(二进制程序文件、文档文件、库文件和配置文件等)就会基于包作者事先定义好的位置进入各自对应的目录下了。在CentOS上,这种打包工具就叫做rpm,即<span style="color: rgba(255, 0, 0, 1)"><strong>rpm安装</strong><span style="color: rgba(0, 0, 0, 1)">。</span></span></p>
<p>但是这种工具又存在一个缺陷,那就是它无法自动解决RPM包之间的依赖性。</p>
<p>假设安装A包需要依赖于B包,安装B包又要依赖于C包。</p>
<p>A --> B --> C</p>
<p>当你安装A包的时候提示你要安装B包,你安装B包的时候又提示你要安装C包,它无法自动去解决这个依赖关系。并且你还要自己去下载被依赖的B包和C包。</p>
<p>因此诞生了一种更高级的包管理器,用于解决上述的RPM的问题,在CentOS上,这种包管理器就叫做yum,即<span style="color: rgba(255, 0, 0, 1)"><strong>yum安装</strong></span>。不过,在未来,可能是CentOS 8的时候,yum会被dnf工具所取代,在Fedora系统上,已经有dnf工具了。</p>
<p>在不同的Linux发行版中,这种软件包的组织形式有点不同,见下表:</p>
<table style="height: 117px; width: 559px" border="0">
<tbody>
<tr>
<td>发行版</td>
<td>初级包管理器</td>
<td>高级包管理器</td>
<td>包名称</td>
</tr>
<tr>
<td>RHEL系列:Red Hat、CentOS、Fedora</td>
<td>rpm</td>
<td>yum、dnf</td>
<td>*.rpm</td>
</tr>
<tr>
<td>Debian、Ubuntu</td>
<td>dpkg</td>
<td>apt-get</td>
<td>*.deb</td>
</tr>
<tr>
<td>S.u.S.E</td>
<td>rpm</td>
<td>zypper</td>
<td>*.rpm</td>
</tr>
</tbody>
</table>
<p>本文的讲解顺序是先讲rpm安装,再讲yum安装,最后说最复杂的源码编译安装。</p>
<p> </p>
<h1>RPM</h1>
<p>在当前的运维环境下,一般我们安装某款软件,会直接使用yum命令,而不会单独去下载rpm包通过rpm命令来完成。</p>
<p>更多的是使用rpm命令去执行一下对程序包的查询操作。</p>
<h2>程序包的获取</h2>
<p>推荐从软件的官方站点获取,或者可以在一些比较大型的受信任的镜像站点获取。</p>
<ol>
<li>系统发行版的光盘。</li>
<li>项目的官方站点。
<ul>
<li>www.zabbix.com</li>
<li>www.mysq.com</li>
<li>等等。</li>
</ul>
</li>
<li>开源镜像站点及一些rpm包提供站点。
<ul>
<li>阿里云</li>
<li>网易</li>
<li>EPEL</li>
<li>https://pkgs.org/</li>
<li>http://rpmfind.net/</li>
<li>http://rpm.pbone.net/</li>
</ul>
</li>
<li>自己动手制作rpm包。</li>
</ol>
<h2>程序包的名称</h2>
<p>程序包(rpm包)名称的大概格式如下。</p>
<div class="cnblogs_code">
<pre>NAME-VERSION-RELEASE.OS.ARCH.rpm</pre>
</div>
<p>示例</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">perl</span>-<span style="color: rgba(128, 0, 128, 1)">5.16</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">293</span>.el7.x86_64.rpm</pre>
</div>
<p>NAME:软件的名称,例如“perl”。</p>
<p>VERSION:软件的版本,一般格式为“major.minor.release”,即主版本.次版本.发行版本,例如“5.16.3”。</p>
<p>RELEASE:程序包的发行版,发行版可以理解为发行的次数,依次往上叠加,区别于VERSION中的release,这里的RELEASE指的是程序包的发行版本,而不是软件的。可能软件的版本没改变但是程序包再次制作发行了。例如“293”。</p>
<p>OS:Linux系统的大版本,CentOS 6为el6,CentOS 7为el7,el表示Enterprise Linux。</p>
<p>ARCH:硬件平台。例如i386,x86_64,amd64,ppc,noarch。noarch表示该程序包不受硬件平台的限制,可能该包均通过库调用之类来实现自身功能。</p>
<h2>主包与支包</h2>
<p>程序除了以自身名称命名的包以外,可能还存在一些其他的包用于提供与该程序相关的功能或者用于扩展该程序。</p>
<p>以PHP来举例。</p>
<p>PHP的主包</p>
<div class="cnblogs_code">
<pre>php-<span style="color: rgba(128, 0, 128, 1)">5.4</span>.<span style="color: rgba(128, 0, 128, 1)">16</span>-<span style="color: rgba(128, 0, 128, 1)">46</span>.el7.x86_64.rpm</pre>
</div>
<p>PHP的支包</p>
<div class="cnblogs_code">
<pre>php-bcmath-<span style="color: rgba(128, 0, 128, 1)">5.4</span>.<span style="color: rgba(128, 0, 128, 1)">16</span>-<span style="color: rgba(128, 0, 128, 1)">46</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64.rpm# 提供了数学计算相关的PHP扩展库。
php</span>-cli-<span style="color: rgba(128, 0, 128, 1)">5.4</span>.<span style="color: rgba(128, 0, 128, 1)">16</span>-<span style="color: rgba(128, 0, 128, 1)">46</span>.el7.x86_64.rpm# 提供了PHP命令行程序/usr/bin/php。</pre>
</div>
<h2>安装</h2>
<p>基本语法如下。</p>
<div class="cnblogs_code">
<pre>rpm {-i|--<span style="color: rgba(0, 0, 255, 1)">install</span>} [<span style="color: rgba(0, 0, 255, 1)">install</span>-options] PACKAGE_FILE ...</pre>
</div>
<p>-v:输出详细信息。</p>
<p>-vv:输出更详细的信息。</p>
<p>-h,--hash:hash marks输出进度条,每个#表示2%的进度。</p>
<p>--test:测试安装,检查并报告依赖关系及冲突消息等,类似于干跑(--dry-run)。</p>
<p>--nodeps:忽略依赖关系,忽略依赖关系之后安装的程序包,可能可以正常运行(比如依赖的只是一个文档类的程序包),不建议这么做。</p>
<p>--replacepkgs:重新安装,一般用于修改了程序包的某个文件无法复原的时候选择的选项,如果重新安装依然无法恢复修改的文件,可以事先删除该文件再重新安装。</p>
<p>--noscripts:禁用rpm包的相关脚本(scriptlet)。该选项等同于“--nopre --nopost --nopreun --nopostun”。</p>
<p>rpm包可以包含四种脚本:</p>
<ul>
<li>preinstall:安装过程开始之前运行的脚本,%pre,--nopre</li>
<li>postinstall:安装过程完成之后运行的脚本,%post,--nopost</li>
<li>preuninstall:卸载过程开始之前运行的脚本,%preun,--nopreun</li>
<li>postuninstall:卸载过程完成之后运行的脚本,%postun,--nopostun</li>
</ul>
<p>可以思考一下,比如我们安装nginx或者php-fpm或者MySQL的时候,在系统中会产生与之对应的用于运行服务的用户,那么这个创建用户的操作,应该就是rpm包的脚本所实现的了。</p>
<p>--nosignature:不检查包签名信息,即不检查包来源的合法性。</p>
<p>--nodigest:不检查包摘要信息,即不检查包完整性信息。</p>
<p>包来源合法性和包完整性是什么,在后面会描述,先知道该选项即可。</p>
<p>最常用的选项如下。</p>
<div class="cnblogs_code">
<pre>rpm -ivh PACKAGE_FILE ...</pre>
</div>
<div class="cnblogs_code">
<pre># rpm -ivh zsh-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64.rpm
Preparing... ################################# [</span><span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">]
Updating </span>/<span style="color: rgba(0, 0, 0, 1)"> installing...
</span><span style="color: rgba(128, 0, 128, 1)">1</span>:zsh-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span>.el7 ################################# [<span style="color: rgba(128, 0, 128, 1)">100</span>%]</pre>
</div>
<p>--test选项,也可能会用到。其他选项基本不会使用到。</p>
<div class="cnblogs_code">
<pre># rpm -ivh --test zsh-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64.rpm
Preparing... ################################# [</span><span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">]
package zsh</span>-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span>.el7.x86_64 is already installed</pre>
</div>
<p>因为此前已经安装过,所以我们通过测试运行,就可以看到会有已安装的提示。</p>
<h2>升级</h2>
<div class="cnblogs_code">
<pre>rpm {-U|--upgrade} [<span style="color: rgba(0, 0, 255, 1)">install</span>-<span style="color: rgba(0, 0, 0, 1)">options] PACKAGE_FILE ...
rpm {</span>-F|--freshen} [<span style="color: rgba(0, 0, 255, 1)">install</span>-options] PACKAGE_FILE ...</pre>
</div>
<p>-U:表示升级或者安装,即如果软件此前未安装,则可以直接安装。</p>
<p>-F:明确表示只能升级,即如果软件此前未安装,则不会直接安装。</p>
<p>一般也会结合-vh选项来使用。</p>
<div class="cnblogs_code">
<pre>rpm -<span style="color: rgba(0, 0, 0, 1)">Uvh PACKAGE_FILE ...
rpm </span>-Fvh PACKAGE_FILE ...</pre>
</div>
<p>--oldpackage:默认情况下,升级操作只可以升级到新版本,使用该选项的话,可执行降级操作。</p>
<p>--replacefiles:即便安装操作会覆盖其他程序包所安装的文件,仍然安装程序包。</p>
<p>--replacepkgs:即便程序包的某些文件已经安装在系统上,仍然安装程序包。</p>
<p>--force:等同于--replacepkgs、--replacefiles和--oldpackage。</p>
<p>从网上下载了zsh 5.1.1版本的,进行升级实验。</p>
<div class="cnblogs_code">
<pre># rpm -Uvh --test zsh-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.gf.el7.x86_64.rpm
warning: zsh</span>-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>.gf.el7.x86_64.rpm: Header V4 RSA/<span style="color: rgba(0, 0, 0, 1)">SHA1 Signature, key ID da8b7718: NOKEY
Preparing... ################################# [</span><span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">]
# rpm -Uvh zsh-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.gf.el7.x86_64.rpm
warning: zsh</span>-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>.gf.el7.x86_64.rpm: Header V4 RSA/<span style="color: rgba(0, 0, 0, 1)">SHA1 Signature, key ID da8b7718: NOKEY
Preparing... ################################# [</span><span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">]
Updating </span>/<span style="color: rgba(0, 0, 0, 1)"> installing...
</span><span style="color: rgba(128, 0, 128, 1)">1</span>:zsh-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>.gf.el7 ################################# [ <span style="color: rgba(128, 0, 128, 1)">50</span>%<span style="color: rgba(0, 0, 0, 1)">]
Cleaning up </span>/<span style="color: rgba(0, 0, 0, 1)"> removing...
</span><span style="color: rgba(128, 0, 128, 1)">2</span>:zsh-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span>.el7 ################################# [<span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">]
# rpm -qa | <span style="color: rgba(0, 0, 255, 1)">grep</span> -i <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">zsh</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
zsh</span>-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>.gf.el7.x86_64</pre>
</div>
<p>升级新的包之后,会卸载旧的包。rpm -qa命令用于查看当前系统上安装的程序包,下文会描述。</p>
<p>仔细看的话,可以发现有一行警告。</p>
<div class="cnblogs_code">
<pre>warning: zsh-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>.gf.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID da8b7718: NOKEY</pre>
</div>
<p>这是因为rpm包的来源合法性和包完整性无法得到验证,我们没有提供包提供方的key导致的,后面会描述。</p>
<p>降级操作。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">q zsh
zsh</span>-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.gf.el7.x86_64
# rpm -Uvh --oldpackage zsh-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64.rpm
Preparing... ################################# [</span><span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">]
Updating </span>/<span style="color: rgba(0, 0, 0, 1)"> installing...
</span><span style="color: rgba(128, 0, 128, 1)">1</span>:zsh-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span>.el7 ################################# [ <span style="color: rgba(128, 0, 128, 1)">50</span>%<span style="color: rgba(0, 0, 0, 1)">]
Cleaning up </span>/<span style="color: rgba(0, 0, 0, 1)"> removing...
</span><span style="color: rgba(128, 0, 128, 1)">2</span>:zsh-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>.gf.el7 ################################# [<span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">]
# rpm -<span style="color: rgba(0, 0, 0, 1)">q zsh
zsh</span>-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span>.el7.x86_64</pre>
</div>
<p>注意事项:</p>
<ul>
<li>不要对内核做升级操作;若想要使用新版本的内核,Linux支持多内核版本并存,因此直接安装新版本内核即可。</li>
<li>如果某原程序包的配置文件在安装后曾被修改过,升级时,新版程序包提供的同一个配置文件不会覆盖老版本已修改过的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供。</li>
</ul>
<h2>卸载</h2>
<div class="cnblogs_code">
<pre>rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...</pre>
</div>
<p>注意,在安装和升级的过程中,rpm命令的操作对象都是rpm包文件的名称(PACKAGE_FILE),例如“zsh-5.0.2-31.el7.x86_64.rpm”。</p>
<p>而卸载的时候,只需要rpm包名(PACKAGE_NAME)即可,例如“zsh”。</p>
<p>--allmatches:卸载所有匹配PACKAGE_NAME的所有版本的程序包。</p>
<p>我这里无法测试该选项,例如zsh,无论我升级还是降级,rpm都只会保留一个版本的zsh,因此我不知道如何测试该选项。</p>
<p>不过一般卸载所使用到的选项并不多,和安装一样,使用一些通用的选项即可。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">evh zsh
Preparing... ################################# [</span><span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">]
Cleaning up </span>/<span style="color: rgba(0, 0, 0, 1)"> removing...
</span><span style="color: rgba(128, 0, 128, 1)">1</span>:zsh-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span>.el7 ################################# [<span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">]
# rpm -<span style="color: rgba(0, 0, 0, 1)">q zsh
package zsh is not installed</span></pre>
</div>
<h2>查询</h2>
<p>查询才是rpm使用中最经常用到的操作。因为安装、升级和卸载都可以使用yum命令来完成,而查询我们则基本上是使用rpm命令。</p>
<div class="cnblogs_code">
<pre>rpm {-q|--query} [<span style="color: rgba(0, 0, 255, 1)">select</span>-options] </pre>
</div>
<h3></h3>
<p>PACKAGE_NAME:查询指定的程序包是否已安装,若已安装则会显示其版本。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">q bash
bash</span>-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span>.el7.x86_64</pre>
</div>
<p>-a, --all:查询所有已安装的程序包,可以结合管道+grep命令过滤。</p>
<div class="cnblogs_code">
<pre># rpm -qa | <span style="color: rgba(0, 0, 255, 1)">grep</span> -i <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bash</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
bash</span>-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64
bash</span>-completion-<span style="color: rgba(128, 0, 128, 1)">2.1</span>-<span style="color: rgba(128, 0, 128, 1)">6</span>.el7.noarch</pre>
</div>
<p>-f, --file FILE:查询出指定的FILE是哪个程序包的。</p>
<div class="cnblogs_code">
<pre># rpm -qf /bin/<span style="color: rgba(0, 0, 0, 1)">bash
bash</span>-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span>.el7.x86_64</pre>
</div>
<p>-g, --group GROUP:查询某个程序包组包含哪些程序包。<span style="color: rgba(255, 0, 0, 1)"><strong>注意,这里的GROUP,并不是通过yum grouplist中所看到的程序包组名称,而是通过-i选项所查询到的包详细信息中的GROUP!</strong></span></p>
<p>例如我们常安装的包组为Development Tools,就不是这里所指的GROUP。即便已安装了该包组。</p>
<div class="cnblogs_code">
<pre># rpm -qg <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Development Tools</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
group Development Tools does not contain any packages</span></pre>
</div>
<div class="cnblogs_code">
<pre># rpm -qi bash | <span style="color: rgba(0, 0, 255, 1)">grep</span> -i <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">^group</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Group : System Environment</span>/<span style="color: rgba(0, 0, 0, 1)">Shells
# rpm -qg <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">System Environment/Shells</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
bash</span>-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64
tcsh</span>-<span style="color: rgba(128, 0, 128, 1)">6.18</span>.<span style="color: rgba(128, 0, 128, 1)">01</span>-<span style="color: rgba(128, 0, 128, 1)">15</span>.el7.x86_64</pre>
</div>
<p>-p, --package PACKAGE_FILE:对未安装的程序包执行查询操作,查询的内容与query-options相关。</p>
<p> 在query-options中,许多的选项可以用于查看已安装的程序包的信息;</p>
<p> 但是如果我们拥有一个RPM包文件,但是不打算安装它,想查看此RPM包所包含的文件;</p>
<p> 就可以使用命令“rpm -qpl PACKAGE_FILE”,这就是p选项的用法;</p>
<p>例如,假设我们本机没有安装zsh,那么我们就无法查询其相关信息了。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">qi zsh
package zsh is not installed</span></pre>
</div>
<p>但如果我们有程序包文件的话,就可以借助-p选项来实现查询的功能,只不过这里的命令参数就是PACKAGE_FILE而不是PACKAGE_NAME了。</p>
<div class="cnblogs_code">
<pre># rpm -qpi zsh-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span>.el7.x86_64.rpm</pre>
</div>
<p>--whatprovides CAPABILITY:查询所有包中具备某种能力(capability)的程序包。这里的<span style="color: rgba(255, 0, 0, 1)"><strong>能力</strong></span>指的是什么,就需要看底下的query-options中的--provides和-R选项了。</p>
<p>首先我们基于下文的选项,可以知道bash程序包提供了以下能力。</p>
<div class="cnblogs_code">
<pre># rpm -q --<span style="color: rgba(0, 0, 0, 1)">provides bash
</span>/bin/<span style="color: rgba(0, 0, 0, 1)">bash
</span>/bin/<span style="color: rgba(0, 0, 255, 1)">sh</span><span style="color: rgba(0, 0, 0, 1)">
bash </span>= <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7
bash(x86</span>-<span style="color: rgba(128, 0, 128, 1)">64</span>) = <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7
config(bash) </span>= <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span>.el7</pre>
</div>
<p>以“/bin/bash”这个能力来举例,我们可以查看哪些程序包提供了该能力。</p>
<div class="cnblogs_code">
<pre># rpm -q --whatprovides <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/bin/bash</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
bash</span>-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span>.el7.x86_64</pre>
</div>
<p>而如果能力是那种带有等于号与版本信息的,应该忽略掉等于号和版本信息,只保留能力名称,并且需要使用单引号或者双引号。</p>
<div class="cnblogs_code">
<pre># rpm -q --whatprovides <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bash(x86-64) = 4.2.46-30.el7</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
no package provides bash(x86</span>-<span style="color: rgba(128, 0, 128, 1)">64</span>) = <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7
# rpm -q --whatprovides <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bash(x86-64)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
bash</span>-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64
# rpm -q --whatprovides bash(x86-<span style="color: rgba(128, 0, 128, 1)">64</span><span style="color: rgba(0, 0, 0, 1)">)
</span>-bash: syntax error near unexpected token `(<span style="color: rgba(128, 0, 0, 1)">'
</span># rpm -q --whatprovides <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">bash(x86-64)</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
bash</span>-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span>.el7.x86_64</pre>
</div>
<p>--whatrequires CAPABILITY:查询所有包中需要某种能力(capability)的程序包。</p>
<div class="cnblogs_code">
<pre># rpm -q --whatrequires <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/bin/bash</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
nss</span>-softokn-freebl-<span style="color: rgba(128, 0, 128, 1)">3.34</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64
copy</span>-jdk-configs-<span style="color: rgba(128, 0, 128, 1)">3.3</span>-<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.el7.noarch
iproute</span>-<span style="color: rgba(128, 0, 128, 1)">4.11</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64
xorg</span>-x11-xinit-<span style="color: rgba(128, 0, 128, 1)">1.3</span>.<span style="color: rgba(128, 0, 128, 1)">4</span>-<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64
...</span></pre>
</div>
<p>我猜测,rpm包应该就是基于包的能力(capability)来决定包与包之间的依赖关系的。</p>
<p>能力这块,目前知道即可,我们并不需要手工去查询来解决依赖关系,因为我们有yum工具。</p>
<h3></h3>
<p>--changelog:显示程序包的变更日志(changelog),这里的变更日志指的是RPM程序包的,而非软件源码包的。程序包的changelog和软件的changelog的区别可能在于,比如软件源代码可以不改变,但是程序包的打包方式改变了,例如部分文件的存放位置发生了修改。</p>
<div class="cnblogs_code">
<pre># rpm -q --changelog bash | <span style="color: rgba(0, 0, 255, 1)">head</span>
* Mon Sep <span style="color: rgba(128, 0, 128, 1)">25</span> <span style="color: rgba(128, 0, 128, 1)">2017</span> Siteshwar Vashisht <svashisht@redhat.com> - <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span>
- Check <span style="color: rgba(0, 0, 255, 1)">for</span> multibyte characters <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> commands
Resolves: #</span><span style="color: rgba(128, 0, 128, 1)">1487615</span>
* Thu Aug <span style="color: rgba(128, 0, 128, 1)">03</span> <span style="color: rgba(128, 0, 128, 1)">2017</span> Siteshwar Vashisht <svashisht@redhat.com> - <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">29</span>
- Fix a pipe fd leak <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> process substitution
Resolves: #</span><span style="color: rgba(128, 0, 128, 1)">1473245</span>
* Tue Mar <span style="color: rgba(128, 0, 128, 1)">07</span> <span style="color: rgba(128, 0, 128, 1)">2017</span> Kamil Dudka <kdudka@redhat.com - <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">28</span>
- CVE-<span style="color: rgba(128, 0, 128, 1)">2016</span>-<span style="color: rgba(128, 0, 128, 1)">9401</span> - Fix crash when <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">-</span><span style="color: rgba(128, 0, 0, 1)">'</span> is passed as second sign to popd</pre>
</div>
<p>-l, --list:查询程序包所包含的所有文件(二进制程序文件、文档文件、库文件和配置文件等)。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">ql bash
</span>/etc/skel/<span style="color: rgba(0, 0, 0, 1)">.bash_logout
...
</span>/usr/bin/<span style="color: rgba(0, 0, 0, 1)">alias
</span>/usr/bin/<span style="color: rgba(0, 0, 0, 1)">bash
...
</span>/usr/share/doc/bash-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span><span style="color: rgba(0, 0, 0, 1)">
...
</span>/usr/share/<span style="color: rgba(0, 0, 255, 1)">man</span>/man1/..<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.gz
...</span></pre>
</div>
<p>-c, --configfiles:仅查询程序包所包含的配置文件。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">qc bash
</span>/etc/skel/<span style="color: rgba(0, 0, 0, 1)">.bash_logout
</span>/etc/skel/<span style="color: rgba(0, 0, 0, 1)">.bash_profile
</span>/etc/skel/.bashrc</pre>
</div>
<p>-d, --docfiles:仅查询程序包所包含的文档文件。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">qd bash
</span>/usr/share/doc/bash-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>/<span style="color: rgba(0, 0, 0, 1)">COPYING
...
</span>/usr/share/<span style="color: rgba(0, 0, 255, 1)">man</span>/man1/..<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.gz
...</span></pre>
</div>
<p>-i, --info:查询程序包的详细信息(information)。这个是比较重要的信息!</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">qi bash
Name : bash # 程序包名称。
Version : </span><span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46 # 程序包版本。</span><span style="color: rgba(0, 0, 0, 1)">
Release : </span><span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7 # 程序包发行版,包含了OS。
Architecture: x86_64 # 程序包适用硬件平台。
Install Date: Thu </span><span style="color: rgba(128, 0, 128, 1)">27</span> Sep <span style="color: rgba(128, 0, 128, 1)">2018</span> <span style="color: rgba(128, 0, 128, 1)">03</span>:<span style="color: rgba(128, 0, 128, 1)">50</span>:<span style="color: rgba(128, 0, 128, 1)">45</span><span style="color: rgba(0, 0, 0, 1)"> PM CST # 安装日期。
Group : System Environment</span>/<span style="color: rgba(0, 0, 0, 1)">Shells # 这里的group,就是上面“rpm -qg GROUP”中的group。
Size : </span><span style="color: rgba(128, 0, 128, 1)">3667709</span><span style="color: rgba(0, 0, 0, 1)">
License : GPLv3</span>+<span style="color: rgba(0, 0, 0, 1)">
Signature : RSA</span>/SHA256, Wed <span style="color: rgba(128, 0, 128, 1)">25</span> Apr <span style="color: rgba(128, 0, 128, 1)">2018</span> <span style="color: rgba(128, 0, 128, 1)">06</span>:<span style="color: rgba(128, 0, 128, 1)">54</span>:<span style="color: rgba(128, 0, 128, 1)">19</span><span style="color: rgba(0, 0, 0, 1)"> PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM: bash</span>-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7.src.rpm # RPM源码包,和纯源码包又完全不同,后面会描述。
Build Date: Wed </span><span style="color: rgba(128, 0, 128, 1)">11</span> Apr <span style="color: rgba(128, 0, 128, 1)">2018</span> <span style="color: rgba(128, 0, 128, 1)">08</span>:<span style="color: rgba(128, 0, 128, 1)">55</span>:<span style="color: rgba(128, 0, 128, 1)">22</span><span style="color: rgba(0, 0, 0, 1)"> AM CST
Build Host: x86</span>-<span style="color: rgba(128, 0, 128, 1)">01</span><span style="color: rgba(0, 0, 0, 1)">.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem </span><http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">bugs.centos.org></span>
<span style="color: rgba(0, 0, 0, 1)">Vendor : CentOS # 程序包制作商。
URL : http:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.gnu.org/software/bash # 软件相关的官方站点。</span>
<span style="color: rgba(0, 0, 0, 1)">Summary : The GNU Bourne Again shell <span style="color: rgba(255, 0, 0, 1)"><strong># 软件的简要信息。</strong></span>
Description : <span style="color: rgba(255, 0, 0, 1)"><strong># 软件的详细信息。</strong></span>
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (</span><span style="color: rgba(0, 0, 255, 1)">sh</span><span style="color: rgba(0, 0, 0, 1)">). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most </span><span style="color: rgba(0, 0, 255, 1)">sh</span> scripts can be run by bash without modification.</pre>
</div>
<p>--provides:查询程序包所提供的能力(capability)。</p>
<div class="cnblogs_code">
<pre># rpm -q --<span style="color: rgba(0, 0, 0, 1)">provides bash
</span>/bin/<span style="color: rgba(0, 0, 0, 1)">bash
</span>/bin/<span style="color: rgba(0, 0, 255, 1)">sh</span><span style="color: rgba(0, 0, 0, 1)">
bash </span>= <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7
bash(x86</span>-<span style="color: rgba(128, 0, 128, 1)">64</span>) = <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7
config(bash) </span>= <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span>.el7</pre>
</div>
<p>-R, --requires:查询程序包所依赖的能力(capability)。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">qR bash
</span>/bin/<span style="color: rgba(0, 0, 255, 1)">sh</span><span style="color: rgba(0, 0, 0, 1)">
config(bash) </span>= <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>-<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">.el7
libc.so.</span><span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">()(64bit)
libc.so.</span><span style="color: rgba(128, 0, 128, 1)">6</span>(GLIBC_2.<span style="color: rgba(128, 0, 128, 1)">11</span><span style="color: rgba(0, 0, 0, 1)">)(64bit)
libc.so.</span><span style="color: rgba(128, 0, 128, 1)">6</span>(GLIBC_2.<span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">)(64bit)
libc.so.</span><span style="color: rgba(128, 0, 128, 1)">6</span>(GLIBC_2.<span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">)(64bit)
libc.so.</span><span style="color: rgba(128, 0, 128, 1)">6</span>(GLIBC_2.<span style="color: rgba(128, 0, 128, 1)">2.5</span><span style="color: rgba(0, 0, 0, 1)">)(64bit)
libc.so.</span><span style="color: rgba(128, 0, 128, 1)">6</span>(GLIBC_2.<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">)(64bit)
libc.so.</span><span style="color: rgba(128, 0, 128, 1)">6</span>(GLIBC_2.<span style="color: rgba(128, 0, 128, 1)">3.4</span><span style="color: rgba(0, 0, 0, 1)">)(64bit)
libc.so.</span><span style="color: rgba(128, 0, 128, 1)">6</span>(GLIBC_2.<span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">)(64bit)
libc.so.</span><span style="color: rgba(128, 0, 128, 1)">6</span>(GLIBC_2.<span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">)(64bit)
libdl.so.</span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">()(64bit)
libdl.so.</span><span style="color: rgba(128, 0, 128, 1)">2</span>(GLIBC_2.<span style="color: rgba(128, 0, 128, 1)">2.5</span><span style="color: rgba(0, 0, 0, 1)">)(64bit)
libtinfo.so.</span><span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">()(64bit)
rpmlib(BuiltinLuaScripts) </span><= <span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
rpmlib(CompressedFileNames) </span><= <span style="color: rgba(128, 0, 128, 1)">3.0</span>.<span style="color: rgba(128, 0, 128, 1)">4</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
rpmlib(FileDigests) </span><= <span style="color: rgba(128, 0, 128, 1)">4.6</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
rpmlib(PayloadFilesHavePrefix) </span><= <span style="color: rgba(128, 0, 128, 1)">4.0</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
rtld(GNU_HASH)
rpmlib(PayloadIsXz) </span><= <span style="color: rgba(128, 0, 128, 1)">5.2</span>-<span style="color: rgba(128, 0, 128, 1)">1</span></pre>
</div>
<p>--scripts:查询程序包在安装和卸载过程中使用的特殊脚本程序。我自己查了bash和postfix程序包,发现可使用shell script和lua语言编写。</p>
<div class="cnblogs_code">
<pre># rpm -q --<span style="color: rgba(0, 0, 0, 1)">scripts bash
postinstall scriptlet (using </span><lua><span style="color: rgba(0, 0, 0, 1)">):
...
postuninstall scriptlet (using </span><lua><span style="color: rgba(0, 0, 0, 1)">):
</span>-- Run it only <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> we are uninstalling
...<br></span></pre>
</div>
<h2>包来源合法性与包完整性</h2>
<p>当我们从网上下载了一个rpm包之后,如何确保这个rpm包就是该站点所提供的?如何确保rpm包没有被第三方所篡改呢?</p>
<p>这就需要依赖于rpm包的来源合法性和包完整性验证了。</p>
<p>来源合法性验证依赖于数字签名,包完整性验证依赖于消息摘要算法。</p>
<p>rpm包实现包来源合法性和包完整性检测的原理如下:</p>
<ol>
<li>包制作者使用单向加密算法(比如md5)对包进行加密得到校验码(或者说是消息摘要);</li>
<li>包制作者使用自己的私钥去加密校验码,并将加密后的校验码附加在包的尾部;</li>
<li>包使用者使用包制作者提供的公钥对包尾部的加密后的校验码进行解密,如果解密成功,则证明包的来源是合法的(确实是包制作者本人发出的,这里涉及到非对称加密的概念);</li>
<li>包使用者使用和包制作者相同的单向加密算法(比如md5)对包进行加密得到校验码,如果此校验码和刚才包使用者使用公钥解密后得到的校验码一致,那么就证明了包的完整性(包在传输的过程中未被篡改)。</li>
</ol>
<p>这里涉及到加密与解密的这些理论知识,将来应该会写一篇文章来详细阐述。</p>
<p>如果我们想检测一个rpm,那么我们就需要一个公钥文件,这个文件,一般是包制作方会提供,在系统镜像文件中也会有。</p>
<p>系统安装好之后,在“/etc/pki/rpm-gpg/”目录下会有公钥(密钥有公钥和私钥两种)文件。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">ls</span> -l /etc/pki/rpm-gpg/<span style="color: rgba(0, 0, 0, 1)">
total </span><span style="color: rgba(128, 0, 128, 1)">16</span>
-rw-r--r--. <span style="color: rgba(128, 0, 128, 1)">1</span> root root <span style="color: rgba(128, 0, 128, 1)">1690</span> Apr <span style="color: rgba(128, 0, 128, 1)">29</span><span style="color: rgba(128, 0, 128, 1)">2018</span> RPM-GPG-KEY-CentOS-<span style="color: rgba(128, 0, 128, 1)">7</span>
-rw-r--r--. <span style="color: rgba(128, 0, 128, 1)">1</span> root root <span style="color: rgba(128, 0, 128, 1)">1004</span> Apr <span style="color: rgba(128, 0, 128, 1)">29</span><span style="color: rgba(128, 0, 128, 1)">2018</span> RPM-GPG-KEY-CentOS-Debug-<span style="color: rgba(128, 0, 128, 1)">7</span>
-rw-r--r--. <span style="color: rgba(128, 0, 128, 1)">1</span> root root <span style="color: rgba(128, 0, 128, 1)">1690</span> Apr <span style="color: rgba(128, 0, 128, 1)">29</span><span style="color: rgba(128, 0, 128, 1)">2018</span> RPM-GPG-KEY-CentOS-Testing-<span style="color: rgba(128, 0, 128, 1)">7</span>
-rw-r--r--<span style="color: rgba(128, 0, 128, 1)">1</span> root root <span style="color: rgba(128, 0, 128, 1)">1662</span> Oct<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(128, 0, 128, 1)">2017</span> RPM-GPG-KEY-EPEL-<span style="color: rgba(128, 0, 128, 1)">7</span></pre>
</div>
<p>当我们有了密钥后,就可以将其导入rpm,用作后续的校验操作。</p>
<p>CentOS 6和CentOS 7操作有些许不同,因为6和7默认的rpm版本不一样。6的写法,在7上也可以使用。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">q rpm
rpm</span>-<span style="color: rgba(128, 0, 128, 1)">4.8</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">55</span><span style="color: rgba(0, 0, 0, 1)">.el6.x86_64
# rpm -<span style="color: rgba(0, 0, 0, 1)">q rpm
rpm</span>-<span style="color: rgba(128, 0, 128, 1)">4.11</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">35</span>.el7.x86_64</pre>
</div>
<div class="cnblogs_code">
<pre>CentOS <span style="color: rgba(128, 0, 128, 1)">6</span>:rpm --<span style="color: rgba(0, 0, 0, 1)">import PUBKEY ...
CentOS </span><span style="color: rgba(128, 0, 128, 1)">7</span>:rpmkeys --import PUBKEY ...</pre>
</div>
<p>有了key之后,就可以对程序包进行检测了。</p>
<div class="cnblogs_code">
<pre>CentOS <span style="color: rgba(128, 0, 128, 1)">6</span>:rpm {-K|--checksig} [--nosignature] [--<span style="color: rgba(0, 0, 0, 1)">nodigest] PACKAGE_FILE ...
CentOS </span><span style="color: rgba(128, 0, 128, 1)">7</span>:rpmkeys {-K|--checksig} PACKAGE_FILE ...</pre>
</div>
<p>zsh-5.0.2版本的,此前从阿里云的CentOS 7镜像下载,因为系统自带了key,因此可以检测通过。而zsh-5.1.1则没有key,因此无法检测。</p>
<div class="cnblogs_code">
<pre># rpmkeys -K zsh-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64.rpm
zsh</span>-<span style="color: rgba(128, 0, 128, 1)">5.0</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">31</span><span style="color: rgba(0, 0, 0, 1)">.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
# rpmkeys -K zsh-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.gf.el7.x86_64.rpm
zsh</span>-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>.gf.el7.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#da8b7718)</pre>
</div>
<p>除了主动检查包以外,每次在安装/升级等操作的时候,rpm也会自动去检查的,例如上文我们看到的那个警告信息。</p>
<div class="cnblogs_code">
<pre>warning: zsh-<span style="color: rgba(128, 0, 128, 1)">5.1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>.gf.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID da8b7718: NOKEY</pre>
</div>
<p>相关的帮助。</p>
<div class="cnblogs_code">
<pre>CentOS <span style="color: rgba(128, 0, 128, 1)">6</span>:<span style="color: rgba(0, 0, 255, 1)">man</span><span style="color: rgba(0, 0, 0, 1)"> rpm
CentOS </span><span style="color: rgba(128, 0, 128, 1)">7</span>:<span style="color: rgba(0, 0, 255, 1)">man</span> rpmkeys</pre>
</div>
<h2>校验</h2>
<div class="cnblogs_code">
<pre>rpm {-V|--verify} [<span style="color: rgba(0, 0, 255, 1)">select</span>-options] </pre>
</div>
<p>校验操作会将已安装的文件的信息和rpm数据库的元数据中记录的信息做比较,这些信息包括了文件大小、摘要(digest)、权限、类型、属主和属组等。如果这些信息有改变,那么就会将其显示出来。</p>
<p>如果在安装的时候没有安装该文件的话,则会忽略未安装的文件。例如,在安装的时候使用了--excludedocs选项,那么在校验的时候就会忽略文档类型的文件。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">V bash
#</pre>
</div>
<p>如果程序包中的文件均为改动过,那么就不会有任何的输出。</p>
<p>接下来我们修改某个配置文件,加一行注释;修改了版权文件的时间;修改cd程序文件的属主和属组。</p>
<div class="cnblogs_code">
<pre># vim /etc/skel/<span style="color: rgba(0, 0, 0, 1)">.bash_logout
# <span style="color: rgba(0, 0, 255, 1)">touch</span> /usr/share/doc/bash-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>/COPYING<br># chown zwl:zwl /usr/bin/cd</pre>
</div>
<p>再次校验。</p>
<div class="cnblogs_code">
<pre># rpm -<span style="color: rgba(0, 0, 0, 1)">V bash
S.</span><span style="color: rgba(128, 0, 128, 1)">5</span>....T.c /etc/skel/<span style="color: rgba(0, 0, 0, 1)">.bash_logout
.....UG.. </span>/usr/bin/<span style="color: rgba(0, 0, 0, 1)">cd
.......T.d </span>/usr/share/doc/bash-<span style="color: rgba(128, 0, 128, 1)">4.2</span>.<span style="color: rgba(128, 0, 128, 1)">46</span>/COPYING</pre>
</div>
<p>在输出的内容中,由三个部分构成。</p>
<p>第一个部分由9个字段构成。小数点“.”表示检查没问题。如果出现问号“?”的话,表示无法检查,比如可能因为权限问题导致无法读取文件信息。</p>
<ul>
<li>S:Size,文件大小改变。</li>
<li>M:Mode,权限或者文件类型改变。</li>
<li>5:消息摘要改变,一般是md5算法;消息摘要不同,意味着文件内容发生了改变。</li>
<li>D:Device,设备的设备号不匹配。</li>
<li>L:readLink(2)路径不匹配。</li>
<li>U:User,属主改变。</li>
<li>G:Group,属组改变。</li>
<li>T:mTime,文件修改时间改变。</li>
<li>P:caPabilities,包能力改变。</li>
</ul>
<p>第二个部分是属性标记,可有可无的。</p>
<ul>
<li>c:%config,配置文件。</li>
<li>d:%doc,文档文件。</li>
<li>g:%ghost file (i.e. the file contents are not included in the package payload).</li>
<li>l:%license,许可证文件。</li>
<li>r:%readme,类似文档文件。</li>
</ul>
<h2>RPM数据库</h2>
<p>rpm的数据库位于目录/var/lib/rpm/中,rpm基于这些数据库的内容才可以完成它上述的功能。数据库文件的格式是伯克利DB。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">file</span> /var/lib/rpm<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
/var/lib/rpm/Basenames: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Conflictname: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Dirnames: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Group: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Installtid: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Name: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Obsoletename: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Packages: Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Providename:Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Requirename:Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Sha1header: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Sigmd5: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Triggername:Berkeley DB (Btree, version 9, native byte-order)</span></pre>
</div>
<div class="cnblogs_code">
<pre>rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]</pre>
</div>
<p>--initdb:初始化数据库,即创建一个新的,如果原本已经有的话,就不创建。</p>
<p>--rebuilddb:重建数据库,一般如果数据库损坏了,可使用。它会基于已安装的包头(package header)来重建数据库索引。</p>
<p>--dbpath:指定数据库的位置,默认是/var/lib/rpm/。</p>
<p>--root:指定rpm数据库所基于的根文件系统路径。默认应该是系统根“/”。注:该选项解释不确定。</p>
<div class="cnblogs_code">
<pre># rpm --initdb -v --dbpath=/tmp/<span style="color: rgba(0, 0, 0, 1)">rpm_test
# <span style="color: rgba(0, 0, 255, 1)">ls</span> /tmp/rpm_test/<span style="color: rgba(0, 0, 0, 1)">
BasenamesConflictname__db.</span><span style="color: rgba(128, 0, 128, 1)">001</span>__db.<span style="color: rgba(128, 0, 128, 1)">002</span>__db.<span style="color: rgba(128, 0, 128, 1)">003</span>DirnamesGroupInstalltidNameObsoletenamePackagesProvidenameRequirenameSha1headerSigmd5Triggername</pre>
</div>
<p>有尝试指定了--root选项的值为/usr或者/usr/local,均无法初始化出数据库文件。</p>
<p> </p>
<h1>YUM</h1>
<p>正如文章开头所描述的,yum是一款基于rpm包的包管理器。相对于rpm,它自动帮我们解决了包下载以及包依赖性的问题。</p>
<p>yum是一款C/S架构的工具。客户端即为本地的Linux端,需要安装软件的那一端;服务器端即为远程仓库(repository)端,也叫做yum源。</p>
<p>仓库端除了存放众多的RPM包以外,还存放了相关的元数据(应该是记录包之间的依赖关系等)repodata目录。</p>
<p><img src="https://img2018.cnblogs.com/blog/1417610/201905/1417610-20190510111136836-1864370463.png" alt=""></p>
<p>存放repodata目录的地址,即为yum源地址,例如该示例中的“https://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/”。</p>
<p>yum源的地址及仓库的地址。地址可使用的协议如下。一般最常见的还是http协议,file协议用于指定本地yum源。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">ftp</span>:<span style="color: rgba(0, 128, 0, 1)">//
</span>http:<span style="color: rgba(0, 128, 0, 1)">//
</span>nfs:<span style="color: rgba(0, 128, 0, 1)">//
</span><span style="color: rgba(0, 0, 255, 1)">file</span>:<span style="color: rgba(128, 128, 128, 1)">///</span></pre>
</div>
<h2>YUM配置文件</h2>
<p>在使用yum之前,我们必须正确配置好yum的配置文件,系统安装好之后,默认就已经帮我们启用了一些配置文件。</p>
<p>主配置文件:/etc/yum.conf,这里存放的是仓库相关的通用配置。</p>
<p>仓库配置文件:/etc/yum.repos.d/*.repo,这里才是每一个仓库所对应的配置文件,比如zabbix和MySQL可以存放在不同的配置文件中,zabbix.repo和mysql.repo。</p>
<p>一般来说,主配置文件,我们是不用去改动的,更多的是管理仓库配置文件。</p>
<h3>主配置</h3>
<p>主配置文件中,一般只有一个配置段,它管理的是全局配置。该配置段,也只能有一个。</p>
<p>我们来看下系统默认提供的。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">
cachedir</span>=/var/cache/<span style="color: rgba(0, 0, 255, 1)">yum</span>/$basearch/<span style="color: rgba(0, 0, 0, 1)">$releasever
keepcache</span>=<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
debuglevel</span>=<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
logfile</span>=/var/log/<span style="color: rgba(0, 0, 255, 1)">yum</span><span style="color: rgba(0, 0, 0, 1)">.log
exactarch</span>=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
obsoletes</span>=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
gpgcheck</span>=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
plugins</span>=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
installonly_limit</span>=<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">
bugtracker_url</span>=http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">bugs.centos.org/set_project.php?project_id=23&ref=</span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">http://bugs.centos.org/bug_report_page.php?category=yum</span>
distroverpkg=centos-release</pre>
</div>
<p>在一些表示“是”和“否”的配置中,会使用1(true)或者0(false)来表示。</p>
<p>cachedir:yum的缓存和数据库存储目录。对于当前系统来说就是“/var/cache/yum/x86_64/7/”。</p>
<p>keepcache:在安装成功后,是否保持头和包的缓存。值为1或者0,默认是1(表示保持)。</p>
<p>debuglevel:debug消息输出级别。范围是0~10,默认是2。</p>
<p>logfile:日志文件位置,需要写全路径(含目录名和文件名)。</p>
<p>exactarch:</p>
<p>obsoletes:只在更新/升级程序包时有效,应该是允许包含废弃/陈旧(obsolete)数据包,在发行版升级时(例如CentOS 6 --> CentOS 7),比较有用。默认是1。</p>
<p>gpgcheck:是否执行GPG签名检测,默认是0。如果在配置中设置了,那么它会应用于所有的仓库中。目前还没在man手册中看到明确的说法,不过个人认为,如果和仓库的配置存在相同的配置项的话,那么在中配置的会成为仓库的默认配置;如果两边均配置了,则应该是以仓库配置为准。</p>
<p>plugins:是否启用插件,默认是0。插件用于扩展yum功能,我的系统默认有2个插件。</p>
<p> fastestmirror:用于根据下载速度将yum源排序,然后选择下载最快的yum源来使用。</p>
<p> langpacks:条件式语言支持包,应该是和语言(中英文这类)相关。</p>
<p>installonlypkgs:程序包名称列表。在该列表中的程序包,只可以被安装,不可以被更新。一般都是内核相关的程序包,具体见man手册。</p>
<p>installonly_limit:在installonlypkgs列表中,一次性同时安装的程序包数量,默认是3。这个配置项应该是和“installonlyn”插件比较有关系。</p>
<p>bugtracker_url:应该是bug追踪反馈的一个地址。</p>
<p>distroverpkg:这里配置的是一个rpm包的名字。一般是system-release(releasever)、redhat-release或者centos-release。对于我的系统来说,它是centos-release。这个包用来告诉yum我们所使用的Linux发行版是哪种,并且该包还提供了发行版的GPG密钥、repo文件等。</p>
<h3>仓库配置</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">
name</span>=Some name <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> this repository
baseurl</span>=url:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">path/to/repository/</span></pre>
</div>
<p>repositoryid:仓库的唯一标识符,一般是一个单词。</p>
<p>name:仓库的描述信息。</p>
<p>baseurl:仓库的地址,也叫yum源地址。这个地址下必须有“repodata”目录。URL可以有多个,但是官方不建议。URL也可以带上HTTP的基本验证信息。</p>
<div class="cnblogs_code">
<pre>baseurl=http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">user:passwd@example.com/</span></pre>
</div>
<p>enabled:是否启用该仓库。</p>
<p>gpgcheck:同理配置段。</p>
<p>repo_gpgcheck:是否对仓库的repodata执行GPG 签名检查。</p>
<p>gpgkey:指定GPG密钥,如果此前没有导入过的话,则yum会自动导入。</p>
<p>enablegroups:是否允许yum安装程序包组,即yum groupinstall,默认为1。</p>
<p>failovermethod:当yum源联系不上时,使用的故障转移办法。roundrobin表示随机,注意不是轮询;priority表示按顺序。</p>
<p>username和password:yum源URL的基本验证信息,可写在URL中,或者配置段,或者仓库配置段。</p>
<p>cost:仓库的开销,开销越小越优先。默认是1000。</p>
<h3>变量</h3>
<p>配置文件中是可以包含变量的。</p>
<p>$releasever:如果是CentOS 6的话,则该值为6;同理,CentOS 7的值为7。</p>
<p>$arch:系统的硬件平台(architecture),常见的有i386、i486、i586、x86_64等等。</p>
<p>$basearch:基础硬件平台,例如如果系统是i486、i586之类的,则会显示为i386。</p>
<p>$uuid:根据当前机器生成的唯一标识符,值位于/var/lib/yum/uuid文件中。</p>
<p>$YUM0-$YUM9:会被系统同名环境变量所取代,一般用于用户自定义。</p>
<div class="cnblogs_code">
<pre>baseurl=http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirror.centos.org/centos/$releasever/os/$basearch/</span>
<span style="color: rgba(0, 0, 0, 1)">等同于
baseurl</span>=http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirror.centos.org/centos/7/os/x86_64/</span></pre>
</div>
<h2>YUM的命令</h2>
<p>基本语法。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span> </pre>
</div>
<p>yum的具体功能,通过command来实现。</p>
<h3>仓库相关</h3>
<div class="cnblogs_code">
<pre>repolist </pre>
</div>
<p>用于列出仓库信息,默认只列出已启用的。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span><span style="color: rgba(0, 0, 0, 1)"> repolist
Loaded plugins: fastestmirror, langpacks # 载入yum插件
Loading mirror speeds from cached hostfile # 插件输出信息,这部分输出后面会忽略
</span>*<span style="color: rgba(0, 0, 0, 1)"> base: mirrors.aliyun.com
</span>*<span style="color: rgba(0, 0, 0, 1)"> epel: mirrors.aliyun.com
</span>*<span style="color: rgba(0, 0, 0, 1)"> extras: mirrors.huaweicloud.com
</span>*<span style="color: rgba(0, 0, 0, 1)"> updates: mirrors.aliyun.com
repo </span><span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)"> repo name status # 状态,即程序包个数
</span>!base/<span style="color: rgba(128, 0, 128, 1)">7</span>/x86_64 # repo id前的感叹号表示该仓库的元数据过期了。 CentOS-<span style="color: rgba(128, 0, 128, 1)">7</span> - Base <span style="color: rgba(128, 0, 128, 1)">10</span>,<span style="color: rgba(128, 0, 128, 1)">019</span>
!epel/x86_64 Extra Packages <span style="color: rgba(0, 0, 255, 1)">for</span> Enterprise Linux <span style="color: rgba(128, 0, 128, 1)">7</span> - x86_64 <span style="color: rgba(128, 0, 128, 1)">13</span>,<span style="color: rgba(128, 0, 128, 1)">139</span>
!extras/<span style="color: rgba(128, 0, 128, 1)">7</span>/x86_64 CentOS-<span style="color: rgba(128, 0, 128, 1)">7</span> - Extras <span style="color: rgba(128, 0, 128, 1)">413</span>
!updates/<span style="color: rgba(128, 0, 128, 1)">7</span>/x86_64 CentOS-<span style="color: rgba(128, 0, 128, 1)">7</span> - Updates <span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 128, 1)">840</span></pre>
</div>
<p>可以跟上repo id或者repo name来显示对应的仓库。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span><span style="color: rgba(0, 0, 0, 1)"> repolist REPO_ID
# </span><span style="color: rgba(0, 0, 255, 1)">yum</span> repolist REPO_NAME</pre>
</div>
<p>可以通过-v选项或者repoinfo显示仓库详细信息。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> repolist -<span style="color: rgba(0, 0, 0, 1)">v ...
# </span><span style="color: rgba(0, 0, 255, 1)">yum</span> repoinfo ...</pre>
</div>
<h3>程序包列表</h3>
<div class="cnblogs_code">
<pre>list [...]</pre>
</div>
<p>默认情况下,列出所有的程序包,程序包名称支持globbing风格。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span> list [...]</pre>
</div>
<p>可以列出程序包名称、具体的版本信息以及来自哪个仓库。@REPO_ID(中的@)表示这是一个已安装的包。</p>
<div class="cnblogs_code">
<pre>dwz.x86_64 <span style="color: rgba(128, 0, 128, 1)">0.11</span>-<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">.el7 @base
dyninst.x86_64 </span><span style="color: rgba(128, 0, 128, 1)">9.3</span>.<span style="color: rgba(128, 0, 128, 1)">1</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>.el7 @anaconda # anaconda表示的应该是随系统安装的时候装的。</pre>
</div>
<p>列出未安装但是可安装的包。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span> list available [...]</pre>
</div>
<p>列出所有可更新的包。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">yum</span> list updates [...]</pre>
</div>
<p>更多的相关命令,查看“man yum”中的“LIST OPTIONS”。</p>
<h3>程序包安装</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">install</span> package1 [...]</pre>
</div>
<p>默认情况下,会安装仓库中最新版本的程序包。安装对象,也可以直接是一个本地的rpm文件,当需要依赖其他包时,yum会自动解决。</p>
<h3>程序包重装</h3>
<div class="cnblogs_code">
<pre>reinstall package1 [...]</pre>
</div>
<h3>程序包更新/升级</h3>
<p>更新就是升级的意思。</p>
<div class="cnblogs_code">
<pre>update [...]</pre>
</div>
<p>如果没指明package的话,那么默认情况下,yum会更新所有已安装的程序包。</p>
<p>如果在更新过程中,被依赖的程序包也需要更新,那么yum会更新;如果新增了被依赖的程序包,那么yum也会新安装。</p>
<div class="cnblogs_code">
<pre>upgrade [...]</pre>
</div>
<p>upgrade等同于“update --obsoletes”或者主配置文件的中启用了“obsoletes”。英文原意是“在计算中包含废弃的包”,我猜测可能是保留这些废弃的包吧。</p>
<p>可以在更新之前,查看有哪些程序包可以更新。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> check-update</pre>
</div>
<p>除了升级以外,还可以降级。</p>
<div class="cnblogs_code">
<pre>downgrade package1 [...]</pre>
</div>
<p>一般降级的时候,在包名中会指明版本号,如果没指明的话,则安装最新版的上一版。</p>
<h3>程序包卸载</h3>
<div class="cnblogs_code">
<pre>remove | erase package1 [...]</pre>
</div>
<p>在卸载的同时,会将依赖于该程序包的程序包一并卸载。yum程序包本身位于protected_packages配置中,所以不会被误卸载。</p>
<h3>程序包能力</h3>
<div class="cnblogs_code">
<pre>provides | whatprovides feature1 [...]</pre>
</div>
<p>这里的feature,应该等同于上文所说的包的能力(capability)。</p>
<p>根据能力,来查询哪些包支持这些。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> provides <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bash(x86-64)</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<h3>缓存相关</h3>
<p>清理缓存。</p>
<div class="cnblogs_code">
<pre>clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]</pre>
</div>
<p>这里所清理的缓存,都是那些已启用的仓库,如果想清理所有(含未启用的),请使用“--enablerepo='*'”选项。</p>
<p>我自己都尝试清理了一下,应该都是缓存,所以下次运行的时候,yum还会从源中去获取这些数据的,应该问题不大。</p>
<p>但是不要自己通过rm去删除yum的缓存(“/var/cache/yum/”)。</p>
<p>重新生成缓存。会从服务器端下载并生成元数据。</p>
<div class="cnblogs_code">
<pre>makecache </pre>
</div>
<p>如果传递了fast参数,那么就等同于运行了“yum clean expire-cache”。</p>
<h3>程序包搜索</h3>
<div class="cnblogs_code">
<pre>search string1 [...]</pre>
</div>
<p>当你不知道程序包名称的时候,可以使用该选项。</p>
<p>默认情况下,搜索包的name和summary字段(rpm -qi信息)。如果没找着的话,会尝试description和url字段。可通过传递all作为第一个参数来搜索全部字段。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> search all database</pre>
</div>
<h3>程序包依赖</h3>
<div class="cnblogs_code">
<pre>deplist package1 [...]</pre>
</div>
<p>会显示程序包所依赖的能力,以及可提供该能力的对应的程序包。了解即可,yum可自行解决依赖关系。</p>
<h3>程序包组相关</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">groupinstall group1 [...]
groupupdate group1 [...]
grouplist [...]
groupremove group1 [...]
groupinfo group1 [...]</span></pre>
</div>
<p>注意:上面的语法,是CentOS 6上的yum的,在CenTOS 7上会稍微有点不同。</p>
<p>了解即可,基本上会使用到的也就只有安装而已。常见是安装开发工具。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> group <span style="color: rgba(0, 0, 255, 1)">install</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Development Tools</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>其他的,详见man手册。</p>
<h2>YUM的选项</h2>
<p>--nogpgcheck:禁止进行gpgcheck。</p>
<p>-y, --assumeyes:自动回答yes安装。</p>
<p>-q, --quiet:静默模式。</p>
<p>--disablerepo=repoidglob:本次yum安装禁用某个或某些(使用glob)仓库。</p>
<p>--enablerepo=repoidglob:本次yum安装启用某个或某些(使用glob)仓库。</p>
<p>--noplugins:禁用所有插件。</p>
<p>--disableplugin=plugin:禁用某些插件。</p>
<h2>连接YUM源</h2>
<h3>光盘YUM源</h3>
<p>我自己是在虚拟机上实现。首先就是将光盘插入机器中,对于我来说就是指定光盘ISO镜像文件并且将其配置为“已连接”。</p>
<p><img src="https://img2018.cnblogs.com/blog/1417610/201905/1417610-20190514112202595-1556094755.png" alt=""></p>
<p>在系统中挂载,留意挂载的文件系统类型。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">mount</span> -r -t iso9660 /dev/cdrom /media/cdrom/</pre>
</div>
<p>配置repo文件。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">cat</span> /etc/<span style="color: rgba(0, 0, 255, 1)">yum</span>.repos.d/<span style="color: rgba(0, 0, 0, 1)">cdrom.repo
name</span>=This is a <span style="color: rgba(0, 0, 255, 1)">yum</span><span style="color: rgba(0, 0, 0, 1)"> repo from cdrom.
baseurl</span>=<span style="color: rgba(0, 0, 255, 1)">file</span>:<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)">media/cdrom/</span>
gpgcheck=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
gpgkey</span>=<span style="color: rgba(0, 0, 255, 1)">file</span>:<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)">etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</span>
enabled=<span style="color: rgba(128, 0, 128, 1)">1</span></pre>
</div>
<p>查看仓库信息。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> repolist -<span style="color: rgba(0, 0, 0, 1)">v cdrom
...
pkgsack </span><span style="color: rgba(0, 0, 255, 1)">time</span>: <span style="color: rgba(128, 0, 128, 1)">0.011</span><span style="color: rgba(0, 0, 0, 1)">
Repo</span>-<span style="color: rgba(0, 0, 255, 1)">id</span><span style="color: rgba(0, 0, 0, 1)"> : cdrom
Repo</span>-name : This is a <span style="color: rgba(0, 0, 255, 1)">yum</span><span style="color: rgba(0, 0, 0, 1)"> repo from cdrom.
Repo</span>-<span style="color: rgba(0, 0, 0, 1)">status: enabled
Repo</span>-revision: <span style="color: rgba(128, 0, 128, 1)">1525380860</span><span style="color: rgba(0, 0, 0, 1)">
Repo</span>-updated : Fri May<span style="color: rgba(128, 0, 128, 1)">4</span> <span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">54</span>:<span style="color: rgba(128, 0, 128, 1)">34</span> <span style="color: rgba(128, 0, 128, 1)">2018</span><span style="color: rgba(0, 0, 0, 1)">
Repo</span>-pkgs : <span style="color: rgba(128, 0, 128, 1)">3</span>,<span style="color: rgba(128, 0, 128, 1)">971</span><span style="color: rgba(0, 0, 0, 1)">
Repo</span>-size : <span style="color: rgba(128, 0, 128, 1)">3.6</span><span style="color: rgba(0, 0, 0, 1)"> G
Repo</span>-baseurl : <span style="color: rgba(0, 0, 255, 1)">file</span>:<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)">media/cdrom/</span>
Repo-expire: <span style="color: rgba(128, 0, 128, 1)">21</span>,<span style="color: rgba(128, 0, 128, 1)">600</span> second(s) (<span style="color: rgba(0, 0, 255, 1)">last</span>: Tue May <span style="color: rgba(128, 0, 128, 1)">14</span> <span style="color: rgba(128, 0, 128, 1)">11</span>:<span style="color: rgba(128, 0, 128, 1)">16</span>:<span style="color: rgba(128, 0, 128, 1)">02</span> <span style="color: rgba(128, 0, 128, 1)">2019</span><span style="color: rgba(0, 0, 0, 1)">)
Filter : read</span>-<span style="color: rgba(0, 0, 0, 1)">only:present
Repo</span>-filename: /etc/<span style="color: rgba(0, 0, 255, 1)">yum</span>.repos.d/<span style="color: rgba(0, 0, 0, 1)">cdrom.repo
repolist: </span><span style="color: rgba(128, 0, 128, 1)">3</span>,<span style="color: rgba(128, 0, 128, 1)">971</span></pre>
</div>
<p>如果该仓库不使用了,那么先在仓库配置文件中关闭仓库启用状态,然后卸载(umount)文件系统,再然后使用eject命令弹出光盘驱动器。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">eject</span> /dev/sr0</pre>
</div>
<h3>软件YUM源</h3>
<p>这里我以MariaDB为例,首先我是去找了阿里云的镜像站,跳转到了MariaDB的官网,在对方所提供的Repository Configuration Tool中选择了一些系统信息后,自动帮我生成了repo文件。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">cat</span> /etc/<span style="color: rgba(0, 0, 255, 1)">yum</span>.repos.d/<span style="color: rgba(0, 0, 0, 1)">MariaDB.repo
# MariaDB </span><span style="color: rgba(128, 0, 128, 1)">10.3</span> CentOS repository list - created <span style="color: rgba(128, 0, 128, 1)">2019</span>-<span style="color: rgba(128, 0, 128, 1)">05</span>-<span style="color: rgba(128, 0, 128, 1)">14</span> <span style="color: rgba(128, 0, 128, 1)">03</span>:<span style="color: rgba(128, 0, 128, 1)">34</span><span style="color: rgba(0, 0, 0, 1)"> UTC
# http:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">downloads.mariadb.org/mariadb/repositories/</span>
<span style="color: rgba(0, 0, 0, 1)">
name </span>=<span style="color: rgba(0, 0, 0, 1)"> MariaDB
baseurl </span>= http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">yum.mariadb.org/10.3/centos7-amd64</span>
gpgkey=https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">yum.mariadb.org/RPM-GPG-KEY-MariaDB</span>
gpgcheck=<span style="color: rgba(128, 0, 128, 1)">1</span></pre>
</div>
<p>其他的软件,也是类似的做法,要么去比较受信任的国内大型镜像站点,要么去官方站点。</p>
<p>当我们想单独查看已增加的仓库中有哪些程序包时,可以使用该命令。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> repository-packages mariadb list</pre>
</div>
<p>详情可参考repository-packages子命令。</p>
<div class="cnblogs_code">
<pre>repository-packages <enabled-repoid> <<span style="color: rgba(0, 0, 255, 1)">install</span>|remove|remove-or-reinstall|remove-or-distribution-synchronization> [...]</pre>
</div>
<p> </p>
<h1>源码编译安装</h1>
<blockquote>
<p>参考资料:</p>
<p>Linux下源代码的编译安装入门</p>
<p>How to Install Software from Source Code… and Remove it Afterwards</p>
</blockquote>
<p>RPM安装,是使用别人事先制作好的rpm包。包中的二进制程序文件,是对方根据软件需求方的硬件、系统等信息事先编译好的,只能适用于那个系统、硬件的机器上。例如,64位CentOS 7系统上的rpm包,就无法应用于32位CentOS 6系统。</p>
<p>YUM安装,由于是基于RPM实现的,所以也会有这个现象。</p>
<p>源代码在撰写的过程中,可能将软件的所有功能都已经写好了。但是,编译的时候,一般是根据需求来编译,不需要的功能是不会编译入软件中的。</p>
<p>如果通过rpm或者yum安装的软件,没有我们所需要的功能(但是软件的源代码中是有该功能的),此时就需要用户自行基于<span style="color: rgba(255, 0, 0, 1)"><strong>源码编译安装</strong></span>了。</p>
<p>源码编译安装,是一个有时候让人觉得极其痛苦的过程,不同的Linux发行版,不同的软件,组合起来在安装的过程当中,会有不同的问题。加之本人对C语言源码编译的过程也不太了解,所以本文说的不一定正确。</p>
<p>引用中有一篇简书的中文资料和一篇It's FOSS的英文资料可供参考,后者我没看过,若将来想深入研究,可看。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">源代码编译大致流程:
源代码 </span>--> 预处理 --> 编译(<span style="color: rgba(0, 0, 255, 1)">gcc</span>) --> 汇编 --> 链接 --> 执行</pre>
</div>
<p>一般来说,Linux下的软件大多数为C语言所编写,所以使用的自动化构建工具一般是make。涉及的程序包为autoconf和automake,一般我们装上Development Tools包组就会有。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> group <span style="color: rgba(0, 0, 255, 1)">install</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Development Tools</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>接下来就是软件源代码的获取,一般是去官方网站,这里以memcached为例。获取到的是.tar.gz格式的文件,解压后,进入目录中。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">tar</span> -xzf memcached-<span style="color: rgba(128, 0, 128, 1)">1.5</span>.<span style="color: rgba(128, 0, 128, 1)">14</span>.<span style="color: rgba(0, 0, 255, 1)">tar</span><span style="color: rgba(0, 0, 0, 1)">.gz
# cd memcached</span>-<span style="color: rgba(128, 0, 128, 1)">1.5</span>.<span style="color: rgba(128, 0, 128, 1)">14</span>/</pre>
</div>
<p>进入目录后,我们首先要找到相关的帮助文件,一般是大写的INSTALL或者README,对本示例来说,是INSTALL和README.md。一般是文本文件,可直接查看。</p>
<p>这类文件肯定都是英文的了,不好阅读。对于本示例来说,README.md文件还好,INSTALL文件就非常长了。一般来说,最简单的步骤为如下。</p>
<div class="cnblogs_code">
<pre># ./configure && <span style="color: rgba(0, 0, 255, 1)">make</span> && <span style="color: rgba(0, 0, 255, 1)">make</span> <span style="color: rgba(0, 0, 255, 1)">install</span></pre>
</div>
<p>configure是一个POSIX兼容的shell脚本,运行该脚本可用于检测软件所需要的各类环境,例如是否有各种各样的库支持等。</p>
<p>可用于指定软件文件的安装位置,最常用的是--prefix选项。</p>
<div class="cnblogs_code">
<pre>--prefix=<span style="color: rgba(0, 0, 0, 1)">PREFIX
</span>--prefix=/usr/local/memcached/</pre>
</div>
<p>还有更加细粒度的针对不同类型的文件的安装位置调整。</p>
<div class="cnblogs_code">
<pre>--bindir=<span style="color: rgba(0, 0, 0, 1)">DIR
</span>--libexecdir=<span style="color: rgba(0, 0, 0, 1)">DIR
</span>--libdir=<span style="color: rgba(0, 0, 0, 1)">DIR
</span>--mandir=<span style="color: rgba(0, 0, 0, 1)">DIR
</span>--docdir=<span style="color: rgba(0, 0, 0, 1)">DIR
...</span></pre>
</div>
<p>可用于开启或者关闭一些特性。</p>
<div class="cnblogs_code">
<pre>--disable-<span style="color: rgba(0, 0, 0, 1)">FEATURE
</span>--enable-FEATURE[=ARG]</pre>
</div>
<p>是否依赖某些程序包。一般是某些带有lib或者devel字符串的包。</p>
<div class="cnblogs_code">
<pre>--with-PACKAGE[=<span style="color: rgba(0, 0, 0, 1)">ARG]
</span>--without-PACKAGE</pre>
</div>
<p>这些可详见:</p>
<div class="cnblogs_code">
<pre># ./configure --help</pre>
</div>
<p>接下来就让我们来实操一下,我们仅指定--prefix选项。源码编译基本最头疼的地方就在第一步,因为可能会报很多错误。</p>
<div class="cnblogs_code">
<pre># ./configure --prefix=/usr/local/memcached/</pre>
</div>
<p>错误一。</p>
<div class="cnblogs_code">
<pre>checking <span style="color: rgba(0, 0, 255, 1)">for</span> libevent directory... configure: error: libevent is required.You can get it from http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">www.monkey.org/~provos/libevent/</span>
<span style="color: rgba(0, 0, 0, 1)">
If it</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s already installed, specify its path using --with-libevent=/dir/</span></pre>
</div>
<p>通过yum命令我发现本机已安装libevent程序包,但是没有安装libevent-devel,因此我们尝试安装后者。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> list *libevent*<span style="color: rgba(0, 0, 0, 1)">
# </span><span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span> libevent-devel</pre>
</div>
<p>再次configure后,成功了。</p>
<p>注意:虽然报错提示我们去官网下载libevent来安装,但是能通过yum/rpm安装的就尽量通过该方式安装,尽量避免源码编译安装。而且根据本人经验,上文也说了,一般这种缺少库之类的,都是缺少一些devel类或者lib类的包。</p>
<div class="cnblogs_code">
<pre>configure: creating ./<span style="color: rgba(0, 0, 0, 1)">config.status
config.status: creating Makefile
config.status: creating doc</span>/<span style="color: rgba(0, 0, 0, 1)">Makefile
config.status: creating config.h
config.status: executing depfiles commands</span></pre>
</div>
<p>config.status:保留有我们此前的编译选项,直接运行该脚本<span style="color: rgba(255, 0, 0, 1)"><strong>应该或许可以</strong></span>再次生成相同的Makefile文件。</p>
<p>config.h:用于包含系统依赖定义。</p>
<p>Makefile:自动化构建所需要使用到的配置文件,运行完configure脚本后会根据模板文件Makefile.in生成。</p>
<p>接下来我们就可以执行make了。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">make</span></pre>
</div>
<p>make是根据Makefile文件调用gcc等编译程序完成编译链接等操作,一般是不会出错。注意,make本身不是编译工具。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">make</span> <span style="color: rgba(0, 0, 255, 1)">install</span></pre>
</div>
<p>make install一般就更不会出错了。</p>
<p>成功的话,软件相关的所有文件就都在--prefix选项所指定的/usr/local/memcached目录中了。以下是简单的测试启动。</p>
<div class="cnblogs_code">
<pre># /usr/local/memcached/bin/memcached -d -<span style="color: rgba(0, 0, 0, 1)">u zwl
# </span><span style="color: rgba(0, 0, 255, 1)">ps</span> aux | <span style="color: rgba(0, 0, 255, 1)">grep</span> -i <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">memcached</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
zwl </span><span style="color: rgba(128, 0, 128, 1)">8965</span><span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(128, 0, 128, 1)">0.3</span> <span style="color: rgba(128, 0, 128, 1)">413848</span><span style="color: rgba(128, 0, 128, 1)">3124</span> ? Ssl<span style="color: rgba(128, 0, 128, 1)">17</span>:<span style="color: rgba(128, 0, 128, 1)">02</span> <span style="color: rgba(128, 0, 128, 1)">0</span>:<span style="color: rgba(128, 0, 128, 1)">00</span> /usr/local/memcached/bin/memcached -d -<span style="color: rgba(0, 0, 0, 1)">u zwl
root </span><span style="color: rgba(128, 0, 128, 1)">8978</span><span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(128, 0, 128, 1)">0.0</span> <span style="color: rgba(128, 0, 128, 1)">112708</span> <span style="color: rgba(128, 0, 128, 1)">992</span> pts/<span style="color: rgba(128, 0, 128, 1)">0</span> S+ <span style="color: rgba(128, 0, 128, 1)">17</span>:<span style="color: rgba(128, 0, 128, 1)">02</span> <span style="color: rgba(128, 0, 128, 1)">0</span>:<span style="color: rgba(128, 0, 128, 1)">00</span> <span style="color: rgba(0, 0, 255, 1)">grep</span> --color=auto -<span style="color: rgba(0, 0, 0, 1)">i memcached
# netstat </span>-ntulp | <span style="color: rgba(0, 0, 255, 1)">grep</span> -i <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">memcached</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
tcp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">11211</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* LISTEN <span style="color: rgba(128, 0, 128, 1)">8965</span>/<span style="color: rgba(0, 0, 0, 1)">memcached
tcp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> :::<span style="color: rgba(128, 0, 128, 1)">11211</span> :::* LISTEN <span style="color: rgba(128, 0, 128, 1)">8965</span>/memcached</pre>
</div>
<p>make还有很多其他的子命令,可深入了解。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">make</span> test|<span style="color: rgba(0, 0, 0, 1)">check
# </span><span style="color: rgba(0, 0, 255, 1)">make</span><span style="color: rgba(0, 0, 0, 1)"> installcheck
# </span><span style="color: rgba(0, 0, 255, 1)">make</span><span style="color: rgba(0, 0, 0, 1)"> clean
# </span><span style="color: rgba(0, 0, 255, 1)">make</span><span style="color: rgba(0, 0, 0, 1)"> distclean
# </span><span style="color: rgba(0, 0, 255, 1)">make</span> uninstall</pre>
</div>
<p>安装后还没完,源码安装后,由于安装位置是自定义的,所以系统在默认的PATH环境变量下、库路径下、man手册路径下,可能无法找到我们所安装的软件。因此涉及到以下操作。</p>
<p>1、导出二进制程序目录至PATH环境变量中;</p>
<p> 编辑文件/etc/profile.d/NAME.sh</p>
<p> export PATH=/PATH/TO/BIN:$PATH</p>
<p>2、导出库文件路径</p>
<p> 编辑/etc/ld.so.conf.d/NAME.conf</p>
<p> /usr/local/apache2/lib</p>
<p> 让系统重新生成缓存:</p>
<p> ldconfig [-v]</p>
<p>3、导出头文件</p>
<p> 基于字符链接方式实现:</p>
<p> # ln -sv ...</p>
<p>4、导出帮助手册</p>
<p> 编辑/etc/man.config文件</p>
<p> 添加一个MANPATH</p>
<p>5、在源码目录的scripts目录下,有管理脚本,需要复制到相关的目录。</p>
<p> scripts/memcached.service</p>
<p> </p>
<h1>总结</h1>
<p>限于篇幅有限、本人懒惰以及专业不足,因此本博文可能写的不是很完善,特别是在源码编译安装这块。好在基本的软件安装都可通过yum来实现,该安装方式所安装的软件特性也基本符合大众需求。</p>
<p>还有一种可实现类似于源码编译安装的叫做Source RPM安装,大家可参考一下。</p>
<blockquote>
<p>Working with Source RPMs</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/alongdidi/p/software_install_on_CentOS_7.html
頁:
[1]