软件包有两种:

       二进制格式的软件包和源码程序包。

如何选择适合自己的二进制格式的软件包?

1、根据CPU架构选择软件包

    二进制格式的软件包就是已经把源程序转化为CPU所支持的指令集,它可以直接运行的。因为不同架构的CPU指令集不完全一样的。所以二进制格式的

软件包通常会标识适用于那种架构的CPU。

CPU 常见平台arch:
    1)、Power  造价高、性能强劲
    2)、简化板的 PowerPC
    3)、UItraSparc
    4)、x86 功耗低,性能接近服务器级架构的CPU。
    5)、x86_64
    7)、MIPS

    不同架构的CPU所支持的指令集是不一样的。所以,在x86 架构的CPU上编译的软件,移植到 Power 架构的CPU上是无法运行的、我们要根据使用的CPU的架构来选择二进制软件包。

 例:这两个程序包的适合i386和i686架构的CPU。

[root@Node1 ~]# ll /home/admin/
total 1136
-rw-r--r--. 1 root  root  221868 May  9  2012 drbd83-8.3.8-1.el5.centos.i386.rpm
-rw-r--r--. 1 root  root  125974 May  9  2012 kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

2、根据所使用的操作系统选择对应的版本。

   应用程序虽然是运行在CPU上,但受控于内核。不同的内核支持的二进制执行文件的格式是不一样的。Linux 使用的二进制格式是:ELF.而Windows 所支持的二进制格式就不是:ELF了。

可以使用下述方法获取二进制程序的格式:

[root@Node1 ~]# file `which httpd`
/usr/sbin/httpd: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

   所以,选择二进制软件包的时候,要了解该软件包运行的平台是:windows ,还是 Linux呢。这就是所谓的ABI,程序的运行环境不一样的。

   根据操作系统选择好二进制软件程序包以后,还要考虑你的操作系统是32位的,还是64位的?

虽然64位的兼容32位,意思是说:在64位操作系统上可以运行32位的应用程序。但是应用程序在64位系统上运行就不能充分发挥64位操作系统的性能。32位操作系统就不能运行64位的应用程序了。一般是向下兼容的。所以,我们选择二进制程序包的时候还要了解操作系统的位长。尽量选择位长与操作系统

位长一样的软件包,这样能够充分发挥操作系统的性能和应用程序的性能。

------------这样就可以根据实际情况选择适合我们系统的二进制程序包了。



    Linux 系统中二进制应用程序通常以下几部分组成:配置文件、库文件、头文件、二进制程序、帮助文档。根据FHS(Filesystem Hierarchy Standard) 标准

不同的文件存放在不同的目录中。

配置文件            放在/etc目录
库文件              放在/lib、/usr/lib
二进制程序          放在/bin、/sbin、/usr/bin、/usr/sbin
头文件              放在/usr/include
帮助文档            放在/usr/share

    因为,在Linux系统中卸载软件就是直接把安装的程序文件删掉就可以了。没有Windows系统中所谓的注册表的概念。

    一个二进制程序包通常有很多文件:如配置文件、库文件、头文件、二进制程序文件、帮助文档等等。要把这些文件存放到上述的目录中。

    由于,这些目录中存放了大量的文件,执行程序的卸载工作有很多的不便。因为要从这些目录中一个个找出来再把它删掉,很困难。

     这就需要有一种工具帮我们记录这个应用程序包的文件安装到哪里,安装该程序时候都安装了那些文件等等。rpm(RPM Package Manager)就是这样一种工具。

     在Linux系统中,RPM包管理机制已经成为一种标准。像CentOS 和 RedHat 等发行版,都使用【rpm】程序包管理器来管理,二进制程序包的安装、升级、卸载。等同于windows中的软件安装卸载程序。

下面看看,RPM软件包管理工具的功能:

 1、打包

       把二进制程序的各个文件打成为.rpm格式的数据包。rpm格式的数据包有一定的格式,如下:

      

 软件名称|-该包的作用|-程序的主版本号.次版本号.rpm包发行号-系统平台.CPU平台.rpm
[root@Node1 ~]# ll /mnt/cdrom/Packages/ | grep "\<zlib\-[0-9]>"
-r--r--r--.  94 root root    74336 Nov 27  2012 zlib-1.2.3-29.el6.i686.rpm

      说明:这是一个主软件包名称为:             zlib.

            主版本号为:                         8

   次版本号为:                         3

   rpm包发行号:                        8

   适用的系统平台:                     centos 5

   适用于CPU架构                        i686

[root@Node1 ~]# ll /mnt/cdrom/Packages/ | grep "\<zlib\>-devel"
-r--r--r--.  77 root root    45052 Nov 27  2012 zlib-devel-1.2.3-29.el6.i686.rpm

说明:zlib后的横杠(-)跟的不是数字,而是一个单词----> devel.就表示该包是子软包。“devel”表示,该软件包的作用是开包用的。

    zlib是基于互联网的,Web服务器传输数据的时候经常使用的数据压缩工具,数据经过压缩后可以节省带宽,为公司节省不少成本的,但是压缩就要耗费CPU计算资源。

[root@Node1 ~]# ll /mnt/cdrom/Packages/ | grep "[[:space:]]openssl\>-[0-9]"
-r--r--r--.  32 root root  1435936 Jan 21  2013 openssl-1.0.0-27.el6.i686.rpm

说明:从PRM程序包的格式可知道,该程序包为主包。

[root@Node1 ~]# ll /mnt/cdrom/Packages/ | grep "[[:space:]]openssl\>-devel"
-r--r--r--.  27 root root  1201312 Jan 21  2013 openssl-devel-1.0.0-27.el6.i686.rpm

说明

   根据PRM包的格式知道,该包是一个子包,作用:是开发的时候才用到的。下面举个例子说明下,开发包在什么时候使用到?

   编译安装 httpd 服务器软件 

  [root@localhost httpd-2.2.17]# ./configure \
 --prefix=/usr/local/apache2\
 --sysconfdir=/etc/httpd\
 --enable-mods-shared=all\
 --enable-so\
 --enable-rewrite\
 --enable-cgi\
 --enable-ssl\     ------> 启用用ssl
 --with-z
[root@localhost httpd-2.2.17]# make
checking openssl/engine.h usability... yes
checking openssl/engine.h presence... yes
checking for openssl/engine.h... yes
checking for SSLeay_version... no
checking for SSL_CTX_new... no
checking for ENGINE_init... no
checking for ENGINE_load_builtin_engines... no
checking for SSL_set_cert_store... no
configure: error: ... Error, SSL/TLS libraries were missing or unusable

说明:httpd-2.2.17报错。缺少SSL/TLS库。

查看是否安装openssl-devel 开发包

[root@a ~]# rpm -qa | grep -i openssl
openssl-0.9.8e-22.el5_8.4

从上面查看结果知道,系统中没有安装:openssl-devel开发包。使用yum 工具把该软件包安装好。

[admin@localhost admin]$ yum install openssl-devel

再次编译就不会报错了。

[root@localhost httpd-2.2.17]# make
checking openssl/engine.h usability... yes
checking openssl/engine.h presence... yes
checking for openssl/engine.h... yes
checking for SSLeay_version... yes
checking for SSL_CTX_new... yes
checking for ENGINE_init... yees
checking for ENGINE_load_builtin_engines... yes
checking for SSL_set_cert_store... yes
......

说明:

    httpd 服务器,接收用户请求后,分析用户请求的资源,响应用户时候,要调用openssl,对数据加密,再发送。在编写httpd软件,调用了openssl提供的API(开发库),实现了对数据的加密之后再传送的功能。就是所谓的:HTTPS。所以编译该软件的时候,系统没有openssl的开发库会报错的的。虽然系统上有openssl-devel 但是编译httpd软件的时候找不到。也会报错的。这就涉及到系统默认到哪里去找开发库的问题了。

    默认系统会到:/lib、/usr/lib 这两个目录去找开发库。如果你的开发库不在系统默认的地方,就要告诉系统你的开发库在什么地方。一般有两种方式:

   (1)、/etc/ld.so.conf.d/下创建一个文件,只要它的后缀是.conf就行。然后把你的开发库的在的路

       径添加到该文件中。然后执行【ldconfig -v】通知系统配置文件。

   (2)、在编译软件的时候在选项中直接指定开发库在哪里:openssl-dir=/path/to/somepath/  

 2、安装

【rpm -ivh /path/to/package_file】           安装软件包,并显示安装进度。
【rpm -ivh --test /path/to/package_file】    测试软件包是否可安装


    Linux的重要哲学思想之一:“组合小程序完成复杂任务”。在 Linux 中一个程序,往往要依赖其它好多小程序才可以完成一个大的功能。这些程序是有依赖关系的。程序的执行过程,也称为程序流。当程序执行到某个位置就要调用另外一个程序完成特定的任务,并把执行结果返回给主程序。这时候主程序才可以往下执行的。

    这样组合小程序完成了复杂的任务。如果使用【rpm】程序包管理工具安装程序包时候,如果程序包有依赖关系。rpm程序包管理工具是没有办法解决的,只有人工解决,有的程序包依赖关系很复杂。人工根本很难解决。

     后来,就有了解决程度包依赖关系的工具:yum Yellowdog Update Modifier.它是rmp的前端工具。这能够分析你所要安装的程序包有那些依赖程序包,并分析它们的依赖关系。根据依赖关系把程序包安装好,如果你系统中有些程序包已经安装了,它就不会重新安装。


3、卸载

【rpm [options] package_name】
	 -e          卸载软件包
	 --nodeps    忽略依赖关系。很危险,可能寻到被依赖的软件包无法使用。

 4、升级

rpm [option] /path/to/package_file
      -Uvh     升级并安装
      -Fvh     纯升级

注意:软件包有依赖关系,有可能升级这后,被依赖的软件包无法使用。或冲突等问题。

 5、校验

  (1)、包安装前,进行rpm包的合法性和完整性检验:

       在当前系统上导入包的制作者的公钥

       rpm --import /path/to/key_file

       在安装软件包的时候,会自动检验rpm包的合法性和完整性的。

       手动检查,rpm包的合法性和完整性使用下述方法。

  rmp  -K /path/to/package_file
	  --nodigest         不检查包完整性
	  --nosignature      不检查来源合法性


  (2)、包安装后检查文件属性

          检查文件属性是否发生变化,这是软件包安全的一种手段。

       rpm -V package_name

       使用上述方法会查出文件那些属性发生了改变。文件属性如下:

       S file Size differs    
       M Mode differs (includes permissions and file type)
       5 digest (formerly MD5 sum) differs
       D Device major/minor number mismatch
       L readLink(2) path mismatch
       U User ownership differs
       G Group ownership differs
       T mTime differs
       P caPabilities differ

     说明:

          如果属性无变化,显示为点(.),否则,就使用上述属性表示。

 6、查询包的描述信息,只能查询已经安装的包

   rpm -qi package_name
            Relocations:是否可以指定安装位置

7、查询文件是由哪个包生成的。

 rpm  -qf /path/to/some_file
 
 [root@Node1 ~]# rpm -qf `which free`
 procps-3.2.8-25.el6.i686

8、查询某包生成哪些文件

 rpm -ql package_name | less

 [root@Node1 ~]# rpm -ql zlib
  /lib/libz.so.1
  /lib/libz.so.1.2.3

9、对尚未安装的包执行查询

rpm -qpl /path/to/package_file

[root@Node1 ~]# rpm -qpl /mnt/cdrom/Packages/zsh-4.3.10-5.el6.i686.rpm  | grep "^/etc"
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc