linux程序的源码编译安装方式毕竟比较繁琐,安装后也不易管理,为此linux官方提供了专门的程序包管理器来解决这些问题


一、程序包管理器

程序包管理器:将源程序编译并打包成一个或有限的几个文件,可用于实现安装、查询、升级、卸载等功能

程序包管理器的管理实现

  ①数据库,用于记录:

    程序名及版本

    程序之间的依赖关系

    功能性说明

    安装生成的各文件路径及校验码

  ②程序的组成清单

    文件清单

    安装卸载时运行的脚本

■常用程序包管理器:

  Redhat:rpm(redhat package manager),其对应的程序包后缀为.rpm对应的前端工具为yum

  Debian:dpkg,其对应的程序包后缀为.deb,对应的前端工具为apt-get


rpm包的制作需要rpmbuild工具,其制作过程这里不作说明,以下详解一下rpm包的管理


二、rpm程序包

2.1、rpm包命名格式name-version-release.arch.rpm,如httpd-2.2.15-45.el6.centos.x86_64.rpm

    version:major.minor.release,同源码

    release:rpm自身发行号,与源码的发行号无关,仅用于标识对rpm包不同制作的修订,同时release还包含此包适用的OS

    arch:适用的硬件平台

      x86: i386, i486, i586, i686等

      x86_64: x86_64

      powerpc: ppc

      noarch: 依赖于虚拟机

2.2、rpm分包机制

  一个程序体积可能很大,为了方便管理,rpm包管理器依据功能性差异,将一个程序打包成若干个包

    主包(核心包):其name与源程序一致,如httpd-2.2.15-45.el6.centos.x86_64.rpm 

    子包:httpd-devel-2.2.15-45.el6.centos.x86_64.rpm

       httpd-tools-2.2.15-45.el6.centos.x86_64.rpm

  区别:程序x依赖于y和z,若x是基于rpm包安装,则x依赖的是y和z的核心包;若x基于源码编译安装,则x依赖的是y和z的开发包

2.3、获取rpm包的途径

①官方发行的光盘、官方站点、镜像站点

   mirros.163.com

   mirrors.sohu.com

②项目的官网:源代码、rpm包

③第三方机构或个人制作并公开发布许多rpm包

   rpmfind.net

   rpm.pbone.net

④额外程序包的可靠途径:EPEL,为Federa所维护

2.4、rpm包的合法性验证

  rpm包的合法性包括来源合法性和包的完整性两个方面

  包的制作者使用单向加密算法提取出原始数据的特征码,并使用自己的私钥加密这段特征码,附加在原始数据之后

  验证过程:

    前提:必须有可靠机制获取到包制作者的公钥

    ①使用包制作者的公钥解密那段加密的特征码,能解密则说明来源合法

    ②使用与制作者同样的单向加密算法提取数据的特征码,并与解密得到的特征码比对,相同则说明包完整性没问题


2.5、rpm包管理器的使用

  ㈠验证程序包的合法性

   我们在安装rpm程序包之前,一般要检验其合法性,尤其是从非官方或非权威站点获得的包。当然,不检验包的合法性并不影响包的安装

   ①导入制作者的公钥

    rpm --import /path/to/key_file

   ②若已导入公钥,rpm安装程序包的过程中会自动检查其合法性

   ③手动检查:

     rpm -K /path/to/pkg_name

     rpm --checksig /path/to/pkg_name

        不检查包完整性:

          rpm -K --nodigest /path/to/pkg_name

        不检查包的来源合法性:

          rpm -K --nosignature /path/to/pkg_name

   ④rpm -qa gpg-pubkey*  #显示所有已导入的gpg格式的公钥

    rpm -qi gpg-pubkey-NAME  #显示密钥的详细信息

[root@localhost ~]# mount /dev/cdrom /media  #挂载centos官网发行的光盘
[root@localhost ~]# ls /media  #centos光盘中自带了许多rpm包,位于Packages目录中
CentOS_BuildTag  EULA  p_w_picpaths    Packages                  repodata              RPM-GPG-KEY-CentOS-Debug-6     RPM-GPG-KEY-CentOS-Testing-6
EFI              GPL   isolinux  RELEASE-NOTES-en-US.html  RPM-GPG-KEY-CentOS-6  RPM-GPG-KEY-CentOS-Security-6  TRANS.TBL
[root@localhost ~]# cd /media/Packages/
[root@localhost Packages]# ls
...
libreoffice-langpack-et-4.0.4.2-9.el6.x86_64.rpm               zlib-devel-1.2.3-29.el6.x86_64.rpm
libreoffice-langpack-eu-4.0.4.2-9.el6.x86_64.rpm               zsh-4.3.10-7.el6.x86_64.rpm
[root@localhost Packages]# rpm -ivh --test samba-3.6.9-164.el6.x86_64.rpm  #测试安装
warning: samba-3.6.9-164.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
#警告:没有公钥,无法验证包的合法性
Preparing...                ########################################### [100%]
[root@localhost Packages]# rpm --import ../RPM-GPG-KEY-CentOS-6  #导入光盘中提供的公钥
[root@localhost Packages]# rpm -ivh --test samba-3.6.9-164.el6.x86_64.rpm  #可以看到警告信息已消除,验证通过
Preparing...                ########################################### [100%]
[root@localhost Packages]# rpm -K samba-3.6.9-164.el6.x86_64.rpm #还可手动检查
samba-3.6.9-164.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
[root@localhost Packages]# rpm -qa gpg-pubkey*  #查看已导入的所有公钥
gpg-pubkey-c105b9de-4e0fd3a3
[root@localhost Packages]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3  #查看指定公钥的详细信息
Name        : gpg-pubkey                   Relocations: (not relocatable)
Version     : c105b9de                          Vendor: (none)
Release     : 4e0fd3a3                      Build Date: Wed 28 Oct 2015 08:31:40 PM CST
Install Date: Wed 28 Oct 2015 08:31:40 PM CST      Build Host: localhost
Group       : Public Keys                   Source RPM: (none)
Size        : 0                                License: pubkey
Signature   : (none)
Summary     : gpg(CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.8.0 (NSS-3)

mQINBE4P06MBEACqn48FZgYkG2QrtUAVDV58H6LpDYEcTcv4CIFSkgs6dJ9TavCW
...


  ㈡安装程序包

   rpm -i [option] /path/to/package_file

   常用选项:

     -i:install

     -h:安装时显示hash码,用来表示安装进度

     -v:显示执行过程

     -vv:详细显示执行过程

     --test:仅作测试,并不真正安装

     --nodeps:忽略依赖关系

     --replacepkgs:重新安装。如果原有的配置文件作了修改,重装可能不执行替换,而是将新生成的配置文件重命名为X.rpmnew

   常用组合选项:-ivh

   如果依赖于其它包:

     ①解决依赖关系

     ②使用--nodeps选项忽略依赖关系,能安装上,但可能无法运行

[root@localhost Packages]# rpm -ivh samba-3.6.9-164.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:samba                  ########################################### [100%]
[root@localhost Packages]# rpm -ivh --test mysql-5.1.71-1.el6.x86_64.rpm 
error: Failed dependencies:提示需要先解决依赖关系
	libmysqlclient.so.16()(64bit) is needed by mysql-5.1.71-1.el6.x86_64
	libmysqlclient.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.71-1.el6.x86_64
	libmysqlclient_r.so.16()(64bit) is needed by mysql-5.1.71-1.el6.x86_64
	libmysqlclient_r.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.71-1.el6.x86_64
	mysql-libs = 5.1.71-1.el6 is needed by mysql-5.1.71-1.el6.x86_64
[root@localhost Packages]# rpm -ivh mysql-libs-5.1.71-1.el6.x86_64.rpm  #安装被依赖的包
Preparing...                ########################################### [100%]
   1:mysql-libs             ########################################### [100%]
[root@localhost Packages]# rpm -ivh mysql-5.1.71-1.el6.x86_64.rpm
Preparing...                ########################################### [100%]
   1:mysql                  ########################################### [100%]


  ㈢卸载程序包

   rpm -e [option] pkg_name

   常用选项:

     -e:erase

     -v,-vv,--test,--nodeps

   如果被其它包依赖: 

     ①将依赖于此包的所有包都卸载

     ②忽略依赖关系,能卸载,但可能造成其它包无法正常使用

   如果包的配置文件被修改,卸载时此文件将会被重命名(X.rpmsave)并保留

[root@localhost Packages]# rpm -e mysql-libs  #卸载指定的包
error: Failed dependencies:  #提示该包被mysql包依赖,无法卸载
	libmysqlclient.so.16()(64bit) is needed by (installed) mysql-5.1.71-1.el6.x86_64
	libmysqlclient.so.16(libmysqlclient_16)(64bit) is needed by (installed) mysql-5.1.71-1.el6.x86_64
	libmysqlclient_r.so.16()(64bit) is needed by (installed) mysql-5.1.71-1.el6.x86_64
	libmysqlclient_r.so.16(libmysqlclient_16)(64bit) is needed by (installed) mysql-5.1.71-1.el6.x86_64
	mysql-libs = 5.1.71-1.el6 is needed by (installed) mysql-5.1.71-1.el6.x86_64
[root@localhost Packages]# rpm -e --nodeps mysql-libs  #忽略依赖关系强制卸载
[root@localhost Packages]# mysql  #可以看到mysql已无法使用了
mysql: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
[root@localhost Packages]# vim /etc/samba/smbusers
[root@localhost Packages]# rpm -e samba  #卸载samba
warning: /etc/samba/smbusers saved as /etc/samba/smbusers.rpmsave
#可以看到,修改后的配置文件在程序卸载后会保留


  ㈣升级程序包:新版本取代老版本

   rpm -U/-F [option] /path/to/package_file

   常用选项:

     -U:升级或安装。不管有无老版本,都安装新版本

     -F:纯升级。有老版本才安装新版本,没有的话就不安装

     --force:强制升级,可能导致依赖此包的程序无法正常运行

     -v,-h

   常用组合选项:-Uvh-Fvh

   注意:不应该对内核执行升级操作,对于新内核应该直接安装,系统支持多内核并存,新内核若有兼容性问题还能用回老内核。

[root@localhost ~]# rpm -q zsh
package zsh is not installed  #显示zsh没有安装
[root@localhost ~]# rpm -Fvh /media/Packages/zsh-4.3.10-7.el6.x86_64.rpm #没有老版本,不安装
[root@localhost ~]# rpm -Uvh /media/Packages/zsh-4.3.10-7.el6.x86_64.rpm #不管有无老版本,都安装新版本
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]
[root@localhost ~]# rpm -q mysql
mysql-5.1.71-1.el6.x86_64
[root@localhost ~]# rpm -Fvh mysql-5.1.73-5.el6_6.x86_64.rpm  #安装新版本的mysql
error: Failed dependencies:提示依赖新版本的mysql-libs包
	mysql-libs = 5.1.73-5.el6_6 is needed by mysql-5.1.73-5.el6_6.x86_64
[root@localhost ~]# rpm -Fvh mysql-libs-5.1.73-5.el6_6.x86_64.rpm 
error: Failed dependencies:
	mysql-libs = 5.1.71-1.el6 is needed by (installed) mysql-5.1.71-1.el6.x86_64
# 这里出现了一个问题:要升级mysql包,需要先升级其所依赖的mysql-libs包,而mysql-libs包无法升级,因为它被现有mysql包依赖,故这里只能先卸载
[root@localhost ~]# rpm -e --nodeps mysql-libs
[root@localhost ~]# rpm -ivh mysql-libs-5.1.73-5.el6_6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:mysql-libs             ########################################### [100%]
[root@localhost ~]# rpm -Fvh mysql-5.1.73-5.el6_6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:mysql                  ########################################### [100%]
[root@localhost ~]# rpm -q mysql
mysql-5.1.73-5.el6_6.x86_64  #已升级至新版本


  ㈤查询操作

   rpm -q [option] [pkg_name]

   常用查询操作:

     ①查询某包是否已安装:rpm -q pkg_name

     ②查询所有已安装的包:rpm -qa

       可结合grep命令使用,查询符合指定范式的包:rpm -qa | grep 'PATTERN'

     ③查询包的描述信息:rpm -qi pkg_name

     ④查询某包生成了哪些文件:rpm -ql pkg_name

        查询某包生成了哪些配置文件:rpm -qc pkg_name

        查询某包生成了哪些帮助文件:rpm -qd pkg_name

        查询程序包相关的脚本:rpm -q --scripts pkg_name

         脚本有四类:

            preinstall:安装前脚本

            postinstall:安装后脚本

            preuninstall:卸载前脚本

            postuninstall:卸载后脚本   

     ⑤查询某个文件由哪个包安装生成:rpm -qf /path/to/somefile

     ⑥对尚未安装的包进行查询:rpm [option] /path/to/pkg_file,可用组合选项有-qpi,-qpl,-qpc,-qpd等

[root@localhost Packages]# rpm -q samba  #查询samba是否已安装
samba-3.6.9-164.el6.x86_64
[root@localhost Packages]# rpm -qa  #查询所有已安装的包
pulseaudio-module-gconf-0.9.21-14.el6_3.x86_64
db4-devel-4.7.25-18.el6_4.x86_64
libxklavier-4.0-9.el6.x86_64
...
[root@localhost Packages]# rpm -qa | grep 'mysql'
mysql-libs-5.1.71-1.el6.x86_64
mysql-5.1.71-1.el6.x86_64
[root@localhost Packages]# rpm -ql samba  #查看samba包生成了哪些文件
/etc/logrotate.d/samba
/etc/openldap/schema
/etc/openldap/schema/samba.schema
/etc/pam.d/samba
/etc/rc.d/init.d/nmb
/etc/rc.d/init.d/smb
/etc/samba/smbusers
/usr/bin/eventlogadm
/usr/bin/mksmbpasswd.sh
/usr/bin/smbstatus
/usr/lib64/samba/auth
...
[root@localhost Packages]# rpm -qc samba  #查看samba包生成了哪些配置文件
/etc/logrotate.d/samba
/etc/pam.d/samba
/etc/samba/smbusers
[root@localhost Packages]# rpm -qd samba  #查看samba包生成了哪些帮助文件
/usr/share/doc/samba-3.6.9/LDAP/README
...
/usr/share/man/man7/samba.7.gz
...
[root@localhost Packages]# rpm -qf /etc/openldap/schema  #查询指定文件由哪个包安装生成
samba-3.6.9-164.el6.x86_64
[root@localhost Packages]# rpm -qpi httpd-2.2.15-29.el6.centos.x86_64.rpm #安装httpd包前查看其详细信息
Name        : httpd                        Relocations: (not relocatable)
Version     : 2.2.15                            Vendor: CentOS

   

   ㈥校验程序包:用于检查包安装生成的文件属性是否发生变化

   rpm -V pkg_name

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
[root@localhost ~]# rpm -V httpd
S.5....T.  c /etc/httpd/conf/httpd.conf
#我们修改了httpd配置文件,可以看到其大小、MD5校验码及修改时间均发生了改变,其它属性无变化

   见上方命令行中的"S.5....T.",rpm用七个段位分别表示文件七种不同属性的变化状态,这七种属性分别为:

      S file Size differs  #大小

      M Mode differs (includes permissions and file type)  #权限

      5 digest (formerly MD5 sum) differs  #MD5校验码

      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

 若对应段位的属性有改变,则显示为对应字母标识;无变化则显示为【.】 

 

  ㈦rpm包管理器的数据库重建

   ①rpm包管理器的数据库目录:/var/lib/rpm

   ②rpm --initdb:初始化。如果事先没有库,会新建一个,有库的话就不新建

    rpm --rebuilddb:重建。直接重建,覆盖原有的数据库

[root@localhost ~]# ls /var/lib/rpm
Basenames     __db.001  __db.003  Dirnames     Group       Name          Packages     Provideversion  Requirename     Sha1header  Triggername
Conflictname  __db.002  __db.004  Filedigests  Installtid  Obsoletename  Providename  Pubkeys         Requireversion  Sigmd5
[root@localhost ~]# rpm --initdb  #已有库,则不会新建
[root@localhost ~]# rpm --rebuilddb
[root@localhost ~]# ls /var/lib/rpm
Basenames     Dirnames     Group       Name          Packages     Provideversion  Requirename     Sha1header  Triggername
Conflictname  Filedigests  Installtid  Obsoletename  Providename  Pubkeys         Requireversion  Sigmd5