Linux笔记 Day16---(Linux中的源码包、二进制包、RPM包)


Linux下的软件包众多,且几乎都是经 GPL 授权、免费开源(无偿公开源代码)的。这意味着如果你具备修改软件源代码的能力,只要你愿意,可以随意修改。

Linux下的软件包可分为两种,分别是源码包和二进制包

一、Linux源码包

(一)概念

实际上,源码包就是一大堆源代码程序,是由程序员按照特定的格式和语法编写出来的。

源码包是Linux中软件包的另一种形式,需要在计算机上进行编译以后才可以产生可以直接运行的二进制程序。源代码包里面包括了程序的程序代码,一般就是我们能认识的C语言文件,因此在安装源码包的时候通常会检索系统中是否正确安装gcc编译器,并且源代码安装的时间会比较长。

计算机只能识别机器语言,也就是二进制语言,所以源码包的安装需要一名“翻译官”将“abcd”翻译成二进制语言,这名“翻译官”通常被称为编译器。

“编译”指的是从源代码到直接被计算机(或虚拟机)执行的目标代码的翻译过程,编译器的功能就是把源代码翻译为二进制代码,让计算机识别并运行

另外,由于源码包的安装需要把源代码编译为二进制代码,因此安装时间较长。
比如,在 Windows下安装 QQ,QQ 功能较多,程序相对较大(有 70 MB左右),但由于其并非是以源码包的形式发布,而是编译后才发布的,因此只需几分钟(经过简单的配置)即可安装成功。但如果我们以源码包安装的方式在 Linux 中安装一个 MySQL 数据库,即便此软件的压缩包仅有 23 MB左右,也需要 30 分钟左右的时间(根据硬件配置不同,略有差异)。

源码包一般包含多个文件,为了方便发布,通常会将源码包做打包压缩处理,Linux 中最常用的打包压缩格式为“tar.gz”,因此源码包又被称为 Tarball

Tarball 是 Linux 系统的一款打包工具,可以对源码包进行打包压缩处理,人们习惯上将最终得到的打包压缩文件称为 Tarball 文件。

源码包需要我们自己去软件官方网站进行下载,包中通常包含以下内容:

  1. 源代码文件。
  2. 配置和检测程序(如 configure 或 config 等)。
  3. 软件安装说明和软件说明(如 INSTALL 或 README)。

通过对比你会发现,源码包的编译是很费时间的,况且绝多大数用户并不熟悉程序语言,在安装过程中我们只能祈祷程序不要报错,否则新手很难解决。

(二)格式

  *.tar.gz、*.tgz、*.bz2

源码包的格式一般是一个版本号的tar包,例如:httpd-2.4.25.tar.gz,文件名包含信息比较少

(三)特性

优点:

tar包形式的源码包包含的内容是明文可见的源代码,如果有足够的能力,可以自行修改源代码,并且在安装的时候可以自由选择要安装的所需功能(./configure中的各种参数)及路径等,并且卸载移除的时候也比较方便。 建议在安装线上的生产服务器软件包时都用源码安装,这是因为源码安装可以自行调整编译参数,能够最大化地定制安装结果。

缺点:

1)安装过程步骤过多,尤其安装较大及较多软件时,添加各种参数时容易出现问题
2)编译时间较长,执行make编译的时间通常较长,一会都会比安装二进制包时间长
3)因为编译手动安装,涉及系统环境比较复杂,可能会出现各种问题,一旦出现问题,新手很难解决(一般都会出现问题)

(四)安装步骤

源码包一般的安装过程:
1)解压
2)./configure
3)make
4)make install
5)vim /etc/profile,文件末尾添加PATH=/usr/local/xxx/bin:$PATH(或者写在/etc/profile.d/目录下创建文件并写入环境变量相关配置),然后 source 环境变量文件

说明:

  • ./configure
    1)、定义需要的功能选项
    2)、检测系统环境是否符合安装要求
    3)、把定义好的功能选项和检测环境系统信息都写入Makefile文件,用于后续的编辑

说明:tar包形式包含的内容是明文可见的源代码,如果有足够的能力,可以自行修改源代码,并且在安装的时候可以自由选择要安装的所需功能(./configure中的各种参数),并且卸载移除的时候也比较方便

注意1:每个源码包都会有configure命令,就算极个别没有这个命令也会用其他的命令取代(例如openssl的./config)
注意2:执行过./configure之后,会生成Makefile文件,make和make install都是依赖这个文件进行编译安装的

  • make
    1)将源码包翻译成机器能识别的语言(也就是将源代码–>可执行的二进制文件,类似生成Windows中的.exe可执行文件)
    2)一旦编译出错,需要修改之后再次编译,请使用make clean,清除之前的编译产生的缓存文件。
    注意:这一步执行时间一般是最长的。

  • make install
    1)真正的安装(例如在windows中执行qq.exe或者wechat.exe安装qq和微信到电脑)
    2)一旦这步出错,需要执行make clean,并删除对应的目录(例如./configure使用–prefix参数指定安装到/usr/local/openssl,则需要删除该目录)

(五)源码包的安装

【例 1】apache http源码包的安装

1、安装准备

[root@admin ~]# yum install gcc gcc-c++ gcc-g77

2、下载源码包(.tar.gz格式)
下载地址: http://mirror.bit.edu.cn/apache/httpd/httpd-2.4.43.tar.gz

源码包建议保存位置:/usr/local/src

[root@admin ~]# cd /usr/local/src
[root@admin src]# wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.4.43.tar.gz
#等待下载完成

3.解压

[root@admin src]# ls
httpd-2.4.43.tar.gz
[root@admin src]# tar xf httpd-2.4.43.tar.gz 
[root@admin src]# ls
httpd-2.4.43  httpd-2.4.43.tar.gz
[root@admin src]# cd httpd-2.4.43
[root@admin httpd-2.4.43]# 

4.下载安装编译工具

[root@admin httpd-2.4.43]# yum install gcc-c++ gcc make -y
[root@admin httpd-2.4.43]# cat INSTALL 

5.编译安装

编译安装软件程序包源码编译安装三步走:./configure(配置)、make(编译)、make install(安装)

源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)。

Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure –help输出详细的选项列表。

其中--prefix选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较凌乱。

这里我们可以查看INSTALL 文件,查看安装说明:

  APACHE INSTALLATION OVERVIEW

  Quick Start - Unix
  ------------------

  For complete installation documentation, see [ht]docs/manual/install.html or
  http://httpd.apache.org/docs/2.4/install.html

     $ ./configure --prefix=PREFIX
     $ make
     $ make install
     $ PREFIX/bin/apachectl start
     ……省略以下内容……

使用 ls 命令可以看到当前目录下有一个名为 configure 的可执行文件:
在这里插入图片描述

[root@admin httpd-2.4.43]# ll configure
-rwxr-xr-x. 1 root 40 1209103 3月  26 22:46 configure
说明: ./configure
a. 指定安装路径,例如 --prefix=/usr/local/apache
b. 启用或禁用某项功能, 例如 --enable-ssl, --disable-filter --with-http_ssl_module
c. 和其它软件关联,例如--with-pcre
d. 检查安装环境,例如是否有编译器gcc,是否满足软件的依赖需求
最终生成:Makefile

软件配置与检查./conigure
#1、定义需要的功能选项。
#2、检测系统是否符合安装要求。
#3、把定义好的功能选项和检测系统环境的信息都写入Makefile 文件,用于后续的编辑

执行:

#检查安装环境,并指定安装目录为usr/local/apache
[root@admin httpd-2.4.43]# ./configure --prefix=/usr/local/apache    #一定要进入解压后的目录执行./configure进行预编译
……省略以上输出信息……
configure: 
checking for APR... no
configure: error: APR not found.  Please read the documentation.
#校验没通过 APR失败 我们需要下载APR ,这是因为安装此软件需要依赖于 arp 等软件,由于电脑上未安装,所以必须先安装httpd的依赖软件,才能通过校验
#还是一样,通过 wget 下载工具进行下载或者在宿主机上下载好,使用lrzsz软件提供的 rz 命令上传到当下
#这里依赖的软件有两个:apr-1.6.5.tar.gz 下载地址:http://mirror.bit.edu.cn/apache/apr/apr-1.6.5.tar.gz
#apr-util-1.6.1.tar.gz 下载地址:http://mirror.bit.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
[root@admin httpd-2.4.43]# cd ..
[root@admin src]# wget http://mirror.bit.edu.cn/apache/apr/apr-1.6.5.tar.gz
[root@admin src]# wget http://mirror.bit.edu.cn/apache/apr/apr-util-1.6.1.tar.gz   #下载这两个依赖软件
#解压第一个(这个apr-1.6.5软件必须是第一个安装,因为被httpd依赖的第二个软件apr-util-1.6.1是依赖于apr-1.6.5 的)
[root@admin src]# tar xf apr-1.6.5.tar.gz
#进入解压后的目录进行预编译并指定安装目录为/usr/local/apr
[root@admin apr-1.6.5]# ./configure --prefix=/usr/local/apr  
#耐心等待,没有显示错误信息,继续进行下一步
#编译并安装该软件
[root@admin apr-1.6.5]# make && make install
#耐心等待,没有显示错误信息,安装成功。继续进行下一步
#解压第二个文件
[root@admin apr-1.6.5]# cd ..
[root@admin src]# ls
apr-1.6.5  apr-1.6.5.tar.gz  apr-util-1.6.1.tar.gz  httpd-2.4.43
[root@admin src]# tar xf apr-util-1.6.1.tar.gz 
[root@admin src]# cd apr-util-1.6.1
#编译第二个软件,并指定安装目录为/usr/local/apr-util 同时必须声明第一个安装目录
[root@admin apr-util-1.6.1]#  ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
#耐心等待,没有显示错误信息,继续进行下一步
#编译并安装
[root@admin apr-util-1.6.1]# make && make install
 xml/apr_xml.lo -c xml/apr_xml.c && touch xml/apr_xml.lo
xml/apr_xml.c:35:19: 致命错误:expat.h:没有那个文件或目录
……省略部分输出信息……
# 缺少xml 的解析器 需要安装一个 
#缺少pcre https://sourceforge.net/projects/pcre/files/pcre/8.42/pcre-8.42.tar.gz/download
[root@admin apr-util-1.6.1]# cd ..
[root@admin src]# wget https://sourceforge.net/projects/pcre/files/pcre/8.42/pcre-8.42.tar.gz/download
 #等待下载完成
 [root@admin src]# ls     #这个名为down的文件就是下载好的
apr-1.6.5         apr-util-1.6.1.tar.gz  httpd-2.4.43.tar.gz
apr-1.6.5.tar.gz  download               pcre-8.42
apr-util-1.6.1    httpd-2.4.43
#解压该文件
 [root@admin src]# tar xf download 
[root@admin src]# ls     #解压后的目录为pcre-8.42
apr-1.6.5         apr-util-1.6.1.tar.gz  httpd-2.4.43.tar.gz
apr-1.6.5.tar.gz  download               pcre-8.42
apr-util-1.6.1    httpd-2.4.43
#预编译
[root@admin pcre-8.42]# ./configure --prefix=/usr/local/pcre
#等待,完成后进行编译和安装
[root@admin pcre-8.42]# make && make install
#继续对apr-utl进行编译安装,这时就不会报错
[root@admin src]# cd ..
[root@admin src]# cd apr-util-1.6.1
[root@admin apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
[root@admin apr-util-1.6.1]# make && make install
#前置包安装完后就可以预编译httpd
[root@admin src]# cd ..
[root@admin src]# cd httpd-2.4.43
#预编译
[root@admin httpd-2.4.43]# ./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre
[root@admin httpd-2.4.43]# make && make install
#等待安装完成,没有提示错误信息
#查看安装情况
[root@admin apache]# cd /usr/local/bin
[root@admin bin]# ls   #这里都是可执行文件
ab         dbmmanage    htcacheclean  httpd
apachectl  envvars      htdbm         httxt2dbm
apxs       envvars-std  htdigest      logresolve
checkgid   fcgistarter  htpasswd      rotatelogs
#安装完成后启动该服务
[root@admin bin]# /usr/local/apache/bin/apachectl start
[root@admin bin]# ps -ef | grep httpd    #查看
root      45499      1  0 09:49 ?        00:00:00 /usr/local/apache/bin/httpd -k start
daemon    45500  45499  0 09:49 ?        00:00:00 /usr/local/apache/bin/httpd -k start
daemon    45501  45499  0 09:49 ?        00:00:00 /usr/local/apache/bin/httpd -k start
daemon    45502  45499  0 09:49 ?        00:00:00 /usr/local/apach
#关闭该服务
[root@admin bin]# /usr/local/apache/bin/apachectl stop
#查看
[root@admin bin]# ps -ef | grep httpd
root      45597   1611  0 09:52 pts/0    00:00:00 grep --color=auto httpd


【例 2】memcached 源码包的安装

1.下载源码包(.tar.gz格式)

两种方式:①在windows电脑上进入官网下载所需包,然后使用 ftp上传进来
②获取源码包的下载地址,使用wget下载工具直接下载

其实我们可以先用 yum install memcached 查看该软件包的依赖,再根据此依赖下载对应的源码包(虽然使用yum方式查找到的是对应软件RPM包的依赖,对于源码包来说是一样的)

2.解压
解压到 /usr/local/src 下

[root@admin src]# tar xf libevent-2.1.8-stable.tar.gz 
[root@admin src]# tar xf memcached-1.5.6.tar.gz 
[root@admin src]# ls
libevent-2.1.8-stable         memcached-1.5.6
libevent-2.1.8-stable.tar.gz  memcached-1.5.6.tar.gz

3.编译和安装

安装预编译工具:

[root@admin src]# yum install gcc-c++ gcc make

若已安装则跳过

因为 memcached 软件的安装依赖于 libevent 软件,所以先编译和安装 libevent

进入解压后的目录进行对 libevent 进行预编译:

[root@admin src]# cd libevent-2.1.8-stable
[root@admin libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent
#等待……预编译完成后查看是否有显示错误信息
#并查看执行后的情况
[root@admin libevent-2.1.8-stable]# echo $?
0     		#0表示正常执行完上次命令

对 libevent 进行编译和安装

[root@admin libevent-2.1.8-stable]# make && make install
#等待安装,完成后查看是否有显示错误信息
#并查看命令执行后的情况
[root@admin libevent-2.1.8-stable]# echo $?
0      #成功执行

进入解压后的目录进行对 memcached 进行预编译:

[root@admin src]# cd memcached-1.5.6
#在指明安装目录的同时要指出被 memcached 软件所依赖的软件的安装位置
[root@admin memcached-1.5.6]# /.configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
#等待安装,完成后查看是否有显示错误并查看命令执行后的情况
[root@admin memcached-1.5.6]# echo $?
0

对 memcached 进行编译和安装

[root@admin memcached-1.5.6]# make && make install
[root@admin memcached-1.5.6]# echo $?
0

这样就安装完成了,启动该服务查看是否可以正常运行:

[root@admin memcached-1.5.6]# cd /usr/local/memcached
[root@admin memcached]# ls
bin  include  share
[root@admin memcached]# bin/memcached -d -l 0.0.0.0 -p 11211 -u root
[root@admin memcached]# ps -ef | grep memcached    #可以看到,该服务可以正常启动
root      10781      1  0 11:16 ?        00:00:00 bin/memcached -d -l 0.0.0.0 -p 11211 -u root
root      10792   1528  0 11:16 pts/0    00:00:00 grep --color=auto memcached
#下面验证该服务是否可以正常工作
#关闭防火墙
[root@admin memcached]# systemctl stop firewalld
#而后使用另一台主机使用telnet 连接该主机
[dxk@admin ~]$ telnet 192.168.126.3 11211
Trying 192.168.126.3...
Connected to 192.168.126.3.
Escape character is '^]'.     #可以看到正常链接,memcached 服务工作正常

源码包卸载:直接删除安装目录即可,不会残留任何垃圾,如果创建了软链接及编辑了额外文件也要进行移除

为了解决使用源码包安装方式的问题,Linux 软件包的安装出现了使用二进制包的安装方式。

二、Linux二进制包

(一)概念

二进制包是软件包的一种形式,二进制包是已经经过编译,可以马上运行的程序软件包。你只需要下载和解包(安装)它们以后,就马上可以使用。软件包的内容是01二进制代码(一般以16进制显示),也就是说,这些文件是计算机能直接识别的(计算机只能识别处理01二进制)

二进制包,也就是源码包经过成功编译之后产生的包。由于二进制包在发布之前就已经完成了编译的工作,因此用户安装软件的速度较快(同 Windows下安装软件速度相当),且安装过程报错几率大大减小。

二进制包是 Linux 下默认的软件安装包,因此二进制包又被称为默认安装软件包

相比源码包,二进制包是在软件发布时已经进行过编译的软件包,所以安装速度比源码包快得多(和 Windows 下软件安装速度相当)。也正是因为已经进行通译,大家无法看到软件的源代码。

(二)格式

格式1: xxxx-devel-6b-33.x86_64.rpm格式(RPM包),

格式2: mysql-5.5.32-linux2.6-x86_64.tar.gz格式(tar -zxvf解压之后就能直接使用)
这里注意和源码包的区别:二进制格式的包名字很长,一般都会带有版本号、适应平台、适应的硬件类型等,而源码格式仅仅就是一个版本号的tar包,例如httpd-2.4.25.tar.gz。

我们一般说的二进制包其实默认指的就是RPM包,也就是说二进制包包含RPM包,RPM包是二进制包的一个子集

(三)特性

这些文件的内容都是01二进制代码(一般以16进制显示),也就是说,这些文件是计算机能直接识别的(计算机只能识别处理01二进制)

(四)安装

【例 】apache tomcat 二进制包的安装

安装 tomcat 之前需要先安装 jdk (依赖性)

1.下载源码包
官网下载 jdk 和 tomcat 源码包(.tar.gz格式)

[root@admin src]# ls
apache-tomcat-8.0.36.tar.gz  jdk-7u79-linux-x64.tar.gz

2.解压

[root@admin src]# tar xf apache-tomcat-8.0.36.tar.gz 
[root@admin src]# tar xf jdk-7u79-linux-x64.tar.gz 
[root@admin src]# ls
apache-tomcat-8.0.36         jdk1.7.0_79
apache-tomcat-8.0.36.tar.gz  jdk-7u79-linux-x64.tar.gz

3.使用

[root@admin src]# cd jdk1.7.0_79/bin

[root@admin bin]# ls
appletviewer    javap         jps           rmic
apt             java-rmi.cgi  jrunscript    rmid
ControlPanel    javaws        jsadebugd     rmiregistry
extcheck        jcmd          jstack        schemagen
idlj            jconsole      jstat         serialver
jar             jcontrol      jstatd        servertool
jarsigner       jdb           jvisualvm     tnameserv
java            jhat          keytool       unpack200
javac           jinfo         native2ascii  wsgen
javadoc         jmap          orbd          wsimport
javafxpackager  jmc           pack200       xjc
javah           jmc.ini       policytool
[root@admin bin]# ./java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
#因为未配置环境变量(classpath等),所以执行命令的时候必须带相应命令的所在路径

4.配置环境变量

[root@admin bin]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/src/jdk1.7.0_79
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
[root@admin bin]# source /etc/profile.d/java.sh     #加载生效
#这样就可以在任何地方执行该命令不用带路径
[root@admin ~]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

5.检验tomcat

[root@admin src]# cd apache-tomcat-8.0.36
[root@admin apache-tomcat-8.0.36]# ls
bin   lib      logs    RELEASE-NOTES  temp     work
conf  LICENSE  NOTICE  RUNNING.txt    webapps
[root@admin apache-tomcat-8.0.36]# cd bin
[root@admin bin]# ls
bootstrap.jar                 setclasspath.sh
catalina.bat                  shutdown.bat
catalina.sh                   shutdown.sh
catalina-tasks.xml            startup.bat
commons-daemon.jar            startup.sh
commons-daemon-native.tar.gz  tomcat-juli.jar
configtest.bat                tomcat-native.tar.gz
configtest.sh                 tool-wrapper.bat
daemon.sh                     tool-wrapper.sh
digest.bat                    version.bat
digest.sh                     version.sh
setclasspath.bat
[root@admin bin]# ./startup.sh
Using CATALINA_BASE:   /usr/local/src/apache-tomcat-8.0.36
Using CATALINA_HOME:   /usr/local/src/apache-tomcat-8.0.36
Using CATALINA_TMPDIR: /usr/local/src/apache-tomcat-8.0.36/temp
Using JRE_HOME:        /usr/local/src/jdk1.7.0_79/jre
Using CLASSPATH:       /usr/local/src/apache-tomcat-8.0.36/bin/bootstrap.jar:/usr/local/src/apache-tomcat-8.0.36/bin/tomcat-juli.jar
Tomcat started.
[root@admin bin]# netstat -tunalp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1093/sshd           
tcp        0      0 192.168.126.3:22        192.168.126.1:50170     ESTABLISHED 1539/sshd: root@pts 
tcp        0      0 192.168.126.3:22        192.168.126.1:51371     ESTABLISHED 1624/sshd: root@pts 
tcp6       0      0 :::8080                 :::*                    LISTEN      1700/java			#tomcat端口8080           
tcp6       0      0 :::22                   :::*                    LISTEN      1093/sshd           
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1700/java           
tcp6       0      0 :::8009                 :::*                    LISTEN      1700/java  
[root@admin bin]# systemctl stop firewalld   #关闭防火墙

在宿主机的浏览器中访问该主机的tomcat WEB服务器

由于未设置那么页面为tomcat的默认页面
在这里插入图片描述

以上是非RPM包的二进制包的安装。关于二进制包下的RPM包的安装在下面进行详细讲解

三、RPM包

(一)概念

在一个操作系统下,需要安装实现各种功能的软件包。这些软件包一般都有各自的程序,但是同时也有错综复杂的依赖关系。同时还需要解决软件包的版本,以及安装,配置,卸载的自动化问题。

为了解决这些问题,RedHat针对自己的系统提出了一个较好的办法来管理成千上百的软件。这就是RPM管理系统在系统中安装了rpm管理系统以后,只要是符合rpm文件标准的打包的程序都可以方便的安装,升级,卸载

也就是说 rpm 原本是Red Hat公司专门用来管理Red Hat的Linux发行版本的各项程序套件的管理程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他Linux发行版本的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。

yum(Yellowdog Update Manager)是RPM的前端工具,是基于RPM的一个管理工具,它能自动的解决安装rpm包产生的依赖关系

RPM包也就是二进制包的一种,rpm包很好区分,以rpm结尾的一般都是rpm包

注意:RPM分为两种,分别是:package和srcpackage,也就是binary rpm和source rpm;前者是已经编译好的二进制包,可以直接安装使用,而后者是包含了源代码的rpm包,需要重组rebuild之后才可以安装使用,其实从严谨的角度上来说,.src.rpm算是特殊的源码包,特殊在它能直接生成rpm包*

(二)格式

格式1: name-version-release.arch.rpm

格式2: name-version-release.arch.src.rpm

RPM 二进制包的命名需遵守统一的命名规则,用户通过名称就可以直接获取这类包的版本、适用平台等信息

RPM 二进制包命名的一般格式如下:

包名-版本号-发布次数-发行商-Linux平台-适合的硬件平台-包扩展名

例如,RPM 包的名称是httpd-2.4.6-93.el7.centos.x86_64.rpm ,其中:

  • httpd:软件包名。这里需要注意,httpd 是包名,而 httpd-2.2.15-15.el6.centos.1.i686.rpm 通常称为包全名,包名和包全名是不同的,在某些 Linux 命令中,有些命令(如包的安装和升级)使用的是包全名,而有些命令(包的查询和卸载)使用的是包名,一不小心就会弄错。
  • 2.4.6:包的版本号,版本号的格式通常为主版本号.次版本号.修正号
  • 93:二进制包发布的次数,表示此 RPM 包是第几次编程生成的。
  • el*:软件发行商,el7 表示此包是由 Red Hat 公司发布,适合在 RHEL 7.x (Red Hat Enterprise Unux) 和 CentOS 7.x 上使用。
  • centos:表示此包适用于 CentOS 系统。
  • x86_64:表示此包使用的硬件平台,目前的 RPM 包支持的平台如下所示:
平台名称 使适用平台信息
i386 386 以上的计算机都可以安装
i586 586 以上的计算机都可以安装
i686 奔腾 II 以上的计算机都可以安装
x86_64 64 位 CPU 可以安装
noarch 没有硬件限制
  • rpm:RPM 包的扩展名,表明这是编译好的二进制包,可以使用 rpm 命令直接安装。此外,还有以 src.rpm 作为扩展名的 RPM 包,这表明是源代码包,需要安装生成源码,然后对其编译并生成 rpm 格式的包,最后才能使用 rpm 命令进行安装。

  • 特殊名称
    devel:表示这个RPM包是软件的开发包。
    manual 手册文档。

说明:Linux 系统不靠扩展名分区文件类型,那为什么包全名中要包含 .rpm 扩展名呢?其实,这里的扩展名是为系统管理员准备的,如果我们不对 RPM 包标注扩展名,管理员很难知道这是一个 RPM 包,当然也就无法正确使用。

包全名:一般安装和升级的包,都没有安装,操作的是未安装包,所以用包全名,且安装的时候要写包所在的全路径。
包名:这个时候包已经安装过了,告诉系统该包名,系统就可以搜索到这个包,这时不用写包全名。它搜索的地方是/var/lib/rpm/下的数据库,所以就不用写绝对路径,这些目录下的文件都是二进制文件,不能直接使用 vi 命令打开,因为我们是已经安装了的包,它搜索/var/lib/rpm下的数据库,不用写绝对路径,在任何位置下执行搜索命令都可以找到。查询和卸载这些命令操作的都是已经安装过的包,所以只需写包名即可。

Tips:

  • 向后兼容=向后看,向历史兼容,也就是现在的新版本能读取运行旧版本的数据,例如win10能向后兼容win7的软件,win7能向后兼容win xp的软件,office 2016能够打开office2010的文件,64位的CPU能够向后兼容处理针对32位CPU所开发的32位应用程序
  • 向前兼容=向前看,向新版本或新数据兼容,向新事物兼容,或者说新版本生成的数据,能够在旧版本上运行处理,例如针对32位CPU开发的应用程序不能再64位CPU上运行,那么这里这个应用程序就是向前不兼容,如果假设能运行,那么就是向前兼容的,office 2007能够处理office 2016产生的数据,我们就说是向前兼容

(三)特性

RPM包优点:

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

RPM包缺点:

  • 经过编译,不能在看到源代码。
  • 功能选择不如源码包灵活。功能已经被固定,无法灵活的删除或新增功能
  • 依赖性,RPM包存在很强的依赖性,大部分RPM包的顺利安装需要安装很多个依赖RPM包
    有时我们会发现,在安装软件包 a 时需要先安装 b 和 c,而在安装 b 时需要先安装 d 和 e。这就需要先安装 d 和 e,再安装 b 和 c,最后才能安装 a。需要有一定的顺序,但是有时依赖性会非常强

对于已经编译成二进制的rpm包,由于操作系统环境不同,一般不能混用。
但是以src.rpm形式发行的软件包,由于需要安装时进行本地编译,所以通常可以在不同系统下安装

(四) RPM包安装、卸载和升级

第一种:rpm命令

RPM包默认安装路径
通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到指定目录中。

安装路径 含 义
/etc/ 配置文件安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 程序所使用的函数库保存位置
/usr/share/doc/ 基本的软件使用手册保存位置
/usr/share/man/ 帮助文件保存位置

RPM 包的默认安装路径是可以通过命令查询的。

除此之外,RPM 包也支持手动指定安装路径,但此方式并不推荐。因为一旦手动指定安装路径,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用

1.RPM 包的安装

rpm命令安装 RPM 包的命令格式: rpm -ivh 包全名
注意一定是包全名。涉及到包全名的命令,一定要注意路径

  • -i:安装(install);
  • -v:显示更详细的信息(verbose);
  • -h:打印 ,显示安装进度(hash);

例如,使用此命令安装 wget 软件包,如下:

[root@admin ~]# rpm -ivh /var/ftp/centos7u2/Packages/wget-1.14-18.el7_6.1.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:wget-1.14-18.el7_6.1             ################################# [100%]

注意:安装的时候,如果该RPM包不在当前目录下则必须加上该包的路径

此命令还可以一次性安装多个软件包,仅需将包全名用空格分开即可

[root@admin ~]# rpm -ivh a.rpm b.rpm c.rpm

如果还有其他安装要求(比如强制安装某软件而不管它是否有依赖性),可以通过以下选项进行调整:

  • -nodeps:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意,这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
  • -replacefiles:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报"某个文件已经存在"的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。
  • -replacepkgs:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
  • -force:强制安装。不管是否已经安装,都重新安装。也就是 -replacefiles 和 -replacepkgs 的综合。
  • -test:测试安装。不会实际安装,只是检测一下依赖性。
  • -prefix:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。

当然:使用rmp命令安装RPM 软件包时考虑包之间的依赖性

比如,我们要安装 apache 软件包,如下所示:

[root@admin ~]# rpm -ivh /var/ftp/centos7u2/Packages/httpd-2.4.6-93.el7.centos.x86_64.rpm
错误:依赖检测失败:
	httpd-tools = 2.4.6-93.el7.centos 被 httpd-2.4.6-93.el7.centos.x86_64 需要

报错信息提示我们,如果要安装 httpd,需要先安装 httpd-tools软件,这体现的就是 RPM 包的依赖性。

那么我们就需要先安装httpd-tools,再安装httpd软件

[root@admin ~]# rpm -ivh  /var/ftp/centos7u2/Packages/httpd-tools-2.4.6-93.el7.centos.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:httpd-tools-2.4.6-93.el7.centos  ################################# [100%]
[root@admin ~]# rpm -ivh  /var/ftp/centos7u2/Packages/httpd-2.4.6-93.el7.centos.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:httpd-2.4.6-93.el7.centos        ################################# [100%]

这样apache服务安装完成,可以检测下能否使用:

[root@admin ~]# systemctl start httpd
[root@admin ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running)
   ……省略……

没有问题,该服务可以正常启动

Linux 系统中,RPM 包之间的依赖关系大致可分为以下 3 种:

  • 树形依赖(A-B-C-D):要想安装软件 A,必须先安装 B,而安装 B 需要先安装 C…….解决此类型依赖的方
    法是从后往前安装,即先安装 D,再安装 C,然后安装 B,最后安装软件 A。
  • 环形依赖(A-B-C-D-A):各个软件安装的依赖关系构成“环状”。解决此类型依赖的方法是用一条命令同时安装所有软件包,即使用 rpm -ivh 软件包A 软件包B …。
  • 模型依赖:软件包的安装需要借助其他软件包的某些文件(比如库文件)。解决模块依赖最直接的方式是通过 http://www.rpmfind.net 网站找到包含此文件的软件包,安装即可。

以上 3 种 RPM 包的依赖关系,给出的解决方案都是手动安装,比较麻烦。那么可以使用 后面讲到的yum 命令安装RPM包,可以自行解决依赖关系。

2.RPM包的升级

使用如下命令即可实现 RPM 包的升级:

 rpm -Uvh 包全名

-U(大写)选项的含义是:如果该软件没安装过则直接安装;若安装了则升级至最新版本。

 rpm -Fvh 包全名

-F(大写)选项的含义是:如果该软件没有安装,则不会安装,必须安装有较低版本才能升级。

3.RPM包的卸载

使用rmp命令卸载RPM 软件包时也要考虑包之间的依赖性

使用方法:

rpm -e 包名
  • -e:卸载
  • –nodeps:不检查依赖
  • –test:测试卸载

例如,我们在使用rpm命令安装 memcached 软件的时候,会被告知要先安装 libevent 软件,

[root@admin ~]# rpm -ivh memcached-1.4.15-10.el7_3.1.x86_64.rpm 
错误:依赖检测失败:
	libevent-2.0.so.5()(64bit) 被 memcached-0:1.4.15-10.el7_3.1.x86_64 需要

所以要先安装 libevent ,再安装 memcached 。

[root@admin ~]# rpm -ivh libevent-2.0.21-4.el7.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:libevent-2.0.21-4.el7            ################################# [100%]
[root@admin ~]# rpm -ivh memcached-1.4.15-10.el7_3.1.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:memcached-0:1.4.15-10.el7_3.1    ################################# [100%]

这样就安装好了。当我们想卸载 libevent 的时候

[root@admin ~]# rpm -e libevent
错误:依赖检测失败:
	libevent-2.0.so.5()(64bit)(已安裝) memcached-0:1.4.15-10.el7_3.1.x86_64 需要

因为 libevent 被 memcached 需要,所以要想卸载 libevent ,必须先卸载 memcached

所以说:如果你要卸载的软件包被其它软件包所依赖,系统则会提示"依赖性错误"

通过 --nodeps 选项可以忽略软件包的依赖,让 rpm 命令强制卸载某个软件包。但强制卸载软件包之后可能导致其它依赖于它的软件包都无法正常工作,并可能导致系统安全以及稳定性等多方面的问题,因此不建议强制卸载软件包

注意:卸载软件包时,只需要提供软件包的名称即可,使用 RPM 软件包的全名则会提示“错误的软件包”

可以在卸载前先进行测试:

4.查询rpm包是否安装

用法:

rpm -q 包名   #查询指定包是否安装
rpm -a       #查询所有已经安装的RPM包

以上的查询命令是不一定在特定 Packages 的目录当中才能执行的。操作的是未安装包为了让系统找到这个包,必须进到 Packages 这个目录当中,或者需要这个绝对路径。而查询是在我们这个后台的数据库当中寻找的,所以在任何目录中执行这个查询命令都可以执行的,而不需要进入到这个光盘Packages目录当中

[root@admin ~]# rpm -q httpd  #查询httpd是否安装
httpd-2.4.6-93.el7.centos.x86_64   #说明已安装
[root@admin ~]# rpm -q nginx    #查询nginx是否安装
未安装软件包 nginx                  #说明未安装 
[root@admin ~]# rpm -qa     #所查询所有已经安装的RPM包

##通过管道符和grep命令,可以列出所有的相关关键字的包
[root@admin ~]# rpm -qa | grep httpd
httpd-tools-2.4.6-93.el7.centos.x86_64
httpd-2.4.6-93.el7.centos.x86_64

5.查询详细信息

用法:

rpm -qi 包名      #查询软件信息
rpm -qip 全包名     #查询未安装包信息(若该包不在当前目录下,则执行时必须写绝对路径,而且是全包名)
[root@admin ~]# rpm -qi httpd
Name        : httpd
Version     : 2.4.6
Release     : 93.el7.centos
……省略……

这个包信息是组建这个包或者写这个包的时候就已经写好了,保存在这个软件包当中,就直接可以通过 rpm -qi 包名 命令来查看这个信息。

6.查找软件包安装位置

用法:

rpm -ql 包名
rpm  -qlp 全包名      #查询 未安装包信息(若该包不在当前目录下,则执行时必须写绝对路径,而且是全包名)
[root@admin ~]# rpm -ql httpd
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
……省略……

7.查找系统文件属于那个RPM包

用法:

rpm -qf 系统文件名
  • 通过这个命令可以查询:通过文件名可以追寻属于哪个包。后面不能跟包名,也不能跟保全名,只能跟系统文件名。
  • 切记:这个系统文件名必须是包装出来的,才能反向追查它是属于哪个包。但是,如果这个文件不是包装出来的,比如人为创建的、或者系统自动生成一些临时文件(如,日志文件),这些文件都不是通过包装出来,因此通过这个文件是不能追查到包的。
[root@admin ~]# rpm -qf /usr/bin/ls
coreutils-8.22-24.el7.x86_64
[root@admin ~]#  rpm -qf /etc/yum.conf
yum-3.4.3-167.el7.centos.noarch

后面加文件的绝对路径

8.查找软件包的依赖性
用法:

rpm -qR 包名   
rpm  -qRp 全包名    #查询未安装包的依赖性(因为查询的是未安装的包,后面需要加包全名或者用绝对路径)
[root@admin Packages]# rpm -qR httpd
/etc/mime.types
system-logos >= 7.92.1-1
httpd-tools = 2.4.6-93.el7.centos
/usr/sbin/useradd
……省略……
#可以发现要安装apach的包,需要依赖以上这么多包,这些包只有正常安装后,才能安装apach的包
[root@admin ~]# rpm -qRp /var/ftp/centos7u2/Packages/zziplib-0.13.62-12.el7.x86_64.rpm   #查询未安装包的依赖信息

9.RPM包校验

Linux 系统中装有大量的 RPM 包,且每个包都含有大量的安装文件。因此,为了能够及时发现文件误删、误修改文件数据、恶意篡改文件内容等问题,Linux 提供了以下两种监控(检测)方式:

  • RPM 包校验:其实就是将已安装文件和 /var/lib/rpm/ 目录下的数据库内容进行比较,确定文件内容是否被修改。
  • RPM 包数字证书校验:用来校验 RPM 包本身是否被修改。

用法:

rpm -Va    #校验系统中已安装的所有软件包
rpm -V 已安装的包名    #校验指定 RPM 包中的文件
rpm -Vf 系统文件名   #校验某个系统文件是否被修改

例如校验 apache 软件包中所有的安装文件是否被修改:

[root@admin ~]# rpm -V httpd

可以看到,执行后无任何提示信息,表明所有用 apache 软件包安装的文件均未改动过,还和从原软件包安装的文件一样

下面对 apache 的配置文件 /etc/httpd/conf/httpd.conf 做适当修改

[root@admin ~]# vim /etc/httpd/conf/httpd.conf 
#对文件进行修改后保存退出,再次使用 rpm -V 命令对 apache 软件包进行验证
[root@admin ~]# rpm -V httpd
S.5....T.  c /etc/httpd/conf/httpd.conf

可以看到,结果显示了文件被修改的信息。该信息可分为以下 3 部分:
1.最前面的 8 个字符(S.5…T)都属于验证信息,各字符的具体含义如下:

  • S:文件大小是否改变。
  • M:文件的类型或文件的权限(rwx)是否改变。
  • 5:文件MD5校验和是否改变(可以看成文件内容是否改变)。
  • D:设备的主从代码是否改变。
  • L:文件路径是否改变。
  • U:文件的属主(所有者)是否改变。
  • G:文件的属组是否改变。
  • T:文件的修改时间是否改变。
  • .:若相关项没发生改变,用 . 表示。
    2.被修改文件类型,大致可分为以下几类:
  • c:配置文件(configuration file)。
  • d:普通文档(documentation)。
  • g:"鬼"文件(ghost file),很少见,就是该文件不应该被这个 RPM 包包含。
  • l:授权文件(license file)。
  • r:描述文件(read me)。
    3.被修改文件所在绝对路径(包含文件名)

由此,S.5…T. c S.5…T. c /etc/httpd/conf/httpd.conf 表达的完整含义是:配置文件 httpd.conf 的大小、内容、修改时间被人为修改过。

注意,并非所有对文件做修改的行为都是恶意的。通常情况下,对配置文件做修改是正常的,比如说配置 apache 就要修改其配置文件,而如果验证信息提示对二进制文件做了修改,这就需要小心,除非是自己故意修改的

第二种:yum命令

rpm命令安装RPM包需要手动解决包之间具有依赖性的问题,尤其是库文件依赖,需要自行去 http://www.rpmfind.net 网站上查找相关的 RPM 包。其实,我们可以选择可自动安装软件包(自动解决包之间依赖关系)的安装方式。

yum,全称“Yellow dog Updater, Modified”,是一个专门为了解决包的依赖关系而存在的软件包管理器。就好像 Windows 系统上可以通过 360 软件管家实现软件的一键安装、升级和卸载,Linux 系统也提供有这样的工具,就是 yum

可以这么说,yum 是改进型的 RPM 软件管理器,它很好的解决了 RPM 所面临的软件包依赖问题

yum 在服务器端存有所有的 RPM 包,并将各个包之间的依赖关系记录在文件中,当管理员使用 yum 安装 RPM 包时,yum 会先从服务器端下载包的依赖性文件,通过分析此文件从服务器端一次性下载所有相关的 RPM 包并进行安装

yum 软件可以用 rpm 命令安装,安装之前可以通过如下命令查看 yum 是否已安装:

[root@admin ~]# rpm -qa | grep yum
yum-3.4.3-167.el7.centos.noarch
yum-plugin-fastestmirror-1.1.31-53.el7.noarch
yum-metadata-parser-1.1.4-10.el7.x86_64

可以看到,系统上已经安装了 yum

如未安装, 可以挂载镜像文件在Packages目录中找到yum软件进行安装

1.显示配置的仓库

yum repolist
yum repolist all        #显示所有配置的软件仓库/软件源
yum repolist enabled    #显示可用的软件仓库/软件源



软件源/软件仓库(repository)

1.概念:

软件源,顾名思义就是软件的来源,软件的来源就是存放各种软件包的软件仓库或者官方发布的ISO文件,其中包含各种应用软件

多数Linux发行版都有自己的软件安装、配置方案,同时还有各自的软件包管理系统。为了省去用户四处寻找合适软件安装包的麻烦,这些发行版将常用的软件集中到一个服务器上,并为用户提供了自动下载、安装软件的接口,这就是我们所说的“软件仓库”。

为了方便大众访问,人们为这些软件仓库建立了大量的“镜像”,使世界各地的用户都能方便地使用。不同发行版的软件仓库一般不同,如用户接口各异、软件丰富程度不同、镜像分布不同等等

软件仓库管理软件,例如yum和zypper,配置文件格式为.repo,可以在仓库中自动地定位并获取正确的RPM软件包*。多数Linux发行版都有自己的软件安装、配置方案,同时还有各自的软件仓库管理系统,例如RHEL的yum,suse的zypper,Debian和Ubuntu的apt。

2.格式:

软件仓库类型:

  • 在线网络访问获取方式,包含各类软件的二进制包或者源码包,可以自定义软件种类及数量,软件仓库的获取方式可以是http、FTP、nfs等,一般官方也会提供这种软件仓库。

  • 离线本地访问获取方式,官方发行版本的离线ISO文件,内部包含的软件都是经过筛选的,挂载出来后也可以称之为是一个软件仓库

软件仓库的的配置文件格式一般是:*.repo

3.特性:

软件仓库中包含的不止只有软件包,还有其他信息(软件包的信息,位置信息,软件包的依赖关系,索引文件等) 类似于索引的作用,可以快速的检索到该包

在Linux操作系统中,软件包的安装其实是文件的拷贝,即把软件所用的各个文件拷贝到特定目录。当然RPM安装软件包,也不例外。但RPM更“先进”一些,因为它在安装前,还会执行检查软件包的依赖(Dependency)、检查软件包的冲突(Conflicts)。最后才将软件包里面的相关文件解出并存放到相应位置。也就是说软件仓库中包括了所有RPM包的头信息(header)描述,比如依赖性等。客户端使用例如yum等仓库管理软件在安装的时候就会去下载header文件并加以分析,这样才能自动地从服务端下载相关软件,并正确地完成安装任务。

注意:Linux软件包的基本组成部分通常有:共享库、应用程序、依赖关系,服务和文档。对软件包的使用和管理被称为包管理






2.查看RPM包

yum list 					#查询所有可用软件包列表,或者yum list all
yum list|grep 包名			#查看指定包
yum list installed|grep 包名 #查看是否已安装某包
yum list available			#显示可安装的包
yum list updates 			#显示已经更新的包
yum list recent 			#显示最近增加的包


#如果未被安装,则会显示可安装的软件包

[root@admin ~]# yum list samba
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirrors.huaweicloud.com
 * updates: mirror.bit.edu.cn
可安装的软件包
samba.x86_64                4.10.4-11.el7_8                updates

#如果已经安装,则会显示已安装的软件包

[root@admin ~]# yum list httpd
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirrors.huaweicloud.com
 * updates: mirror.bit.edu.cn
已安装的软件包
httpd.x86_64               2.4.6-93.el7.centos               @base

3.RPM包安装

yum install 包名      	#安装
yum install -y 包名 		#安装包,并对所有的Y/N选择Y

4.升级

yum -y update		    #升级所有软件包。不过考虑到服务器强调稳定性,因此该命令并不常用。
yum -y update 包名		#升级特定的软件包。

5.搜索

yum search 包名    #从 yum 源服务器上查找与关键字相关的所有软件包

6.显示软件包信息

yum info 包名

例:

[root@admin ~]# yum info httpd
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirrors.huaweicloud.com
 * updates: mirror.bit.edu.cn
已安装的软件包
名称    :httpd
架构    :x86_64
版本    :2.4.6
发布    :93.el7.centos
大小    :9.4 M
源    :installed
来自源:base
简介    : Apache HTTP Server
网址    :http://httpd.apache.org/
协议    : ASL 2.0
描述    : The Apache HTTP Server is a powerful, efficient, and
         : extensible web server.

7.列出软件包提供哪些文件

yum provides 包名

8.创建和清理缓存

yum makecache #构建缓存
yum clean all #清理

9.卸载

使用 yum 卸载软件包时,会同时卸载所有与该包有依赖关系的其他软件包,即便有依赖包属于系统运行必备文件,也会被 yum 无情卸载,带来的直接后果是使系统崩溃

除非你能确定卸载此包以及它的所有依赖包不会对系统产生影响,否则不要使用 yum 卸载软件包

yum remove 包名		#卸载指定的软件包

猜你喜欢

转载自blog.csdn.net/weixin_45880055/article/details/107831989