Linux入门之软件包管理

linux有很多类的软件包管理机制,但是在redhatcentos这类版本的系统中,都会使用一种相同的机制,就是rpm软件包管理机制,当然,还有其它版本的linux使用的不同机制:

debian:使.deb文件,dpkg包管理器

redhat:使用.rpm文件,rpm包管理器

 

软件包在使用中又分类两种(源码包和二进制包):

源码包:一般是提供了一些源码模块和编译脚步组合起来的压缩文件,命令格式如:

name-version.tar.{gz|bz2|xz} 等,这里列举出来一个源码包:

[root@localhost ~]# ls -l tengine-1.4.2.tar.gz

-rw-r--r-- 1 root root 1185902 Aug 15 18:57 tengine-1.4.2.tar.gz

 

二进制rpm包:实现被编译包的,功能模块事先已经被设置好的软件,命令格式如:

rpm包的组成:

主包:

name-version-release.arch.rpm  例如:

bind-9.7.1-1.e15.i586.rpm

    子包:

name-toolname-9.7.1-1.e15.i586.rpm 例如:

bind-libs-9.7.1-1.e15.i586.rpm

bind-utils-9.7.1-1.e15.i586.rpm

包名格式:

name-version-release.arch.rpm

bind-major.minor.release-release.arch.rpm  

版本号说明:

主版本号:软件包有重大改进

此版本号:某个子功能发生重大变化

发行号:修正了部分bug,调整了一点功能

 

 

软件管理器的核心功能:

1、制作软件包;

2、安装、卸载、升级、查询、校验;

 

注意:rpm包自身有依赖关系,及安装软件包时需要先安装其依赖的软件包

 

软件包工具分类:

前段工具:yumapt-get

后端工具:rpmdpt

 

 

rpm命令:

rpm  rpmduild

rpm数据库:/var/lib/rpm

注意:/var/lib/rpm中的某些文件如果只是被破坏,可以通过命令来创建或初始化数据库,但是文件如果都被删除,其数据库信息将无法恢复,因此,要时常对此做备份

 

rpm命令使用方法:

1、安装:

rpm -i /PATH/TO/PACKAGE_FILE     注意:这里是软件包文件的路径

-h:以#符号显示进度,每个#符号表示2%进度

-v:显示详细过程

-vv:显示更为详细的过程

 

rpm  -ivh /PATH/TO/PACHAGE_FILE  提示:这里一般组合使用显示其安装状态

 --nodeps:忽略依赖关系;

 --replacepkgs:重新安装,替换原有安装;

 --replacefiles:会替换原有文件;

 --force:强行安装,可以实现重装或降级;

 --nosgnature:不检查来源的合法性

 --nodigest:不检查完整性

 --noscripts:不执行程序包脚步

%pre:安装前脚步;--nopre

%post:安装后脚本;--nopost

%preun:卸载前脚步;--nopre

%postun:卸载后脚步;--nopost

注意:有时对于来源不明的软件包,可以使用以上选项来防止软件包里的危险程序

 

2、升级:

rpm  -Uvh  /PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级,否则重装

rpm  -Fvh  /PATH/TO/NEW_PACKAGE_FILE:如果有老版本的,则升级,否则退出

--oldpackage:降级

 

注意事项:

1、不要对系统内核进行升级或降级安装,Linux执行多内核并存,因此直接安装新内核即可

2、如果对kernel升级,升级前如果改变了原内核中配置文件,那么升级后,原内核的配置文件将被重命名为filename.rpmnew的文件,而使用新内核的文件

 

3、查询

rpm  -q  PACKAGE_NAME:查询指定包是否已经安装

rpm  -qa:查看已经安装的所有软件包

 

rpm  -qi  PACKAGE_NAME:查询指定包的安装包的说明信息;

rpm  -ql  PACKAGE_NAME:查询指定包安装后生成的文件列表;

rpm  -qc  PACKAGE_NAME:查询指定包安装后生成配置文件;

rpm  -qd  PACKAGE_NAME:查询指定包安装的帮助文件;

 

rpm  --scripts PACKAGE_NAME:查询指明包中包含的脚步

rpm  -qf  /PATH/TO/SOMEFILE:查询指定的文件是由哪个rpm包安装以后生成的;

rpm  --whatprovides  CAPABILTTY :查询关键字或命令是由哪个包替换

rpm  --whatrequires  CAPABILTTY:查询指定包或命令是被哪个包所依赖

 

如果包尚未安装,我们需要查询其说明信息、安装以后会生成的文件:

rpm  -qpi  /PATH/TO/PACKAGE_FILES   查看软件包文件信息

rpm  -qpl  /PATH/TO/PACKAGE_FILES   查看软件包安装后生成哪些文件

 

如果安装后的文件有所丢失,而又有配置而不像重装去覆盖文件,可以通过工具处理:

rpm2cpio 包文件|cpio  -itv 预览包文件

rpm2cpio  包文件|cpio  -idv *.conf 展开包文件

注意:里面可以是特定路径或者文件通配符

 

rpm  --scripts  /PACKAGE_NAME:查询包生成的脚步文件

 -R:查询指定的程序包所依赖库及软件

 --provides:列出指定程序包提供的工具、命令

 --changelog:查询rpm包的更改信息

 

4、卸载

rpm  -e  PACKAGENAME

rpm  --erase  PACKAGENME

           --nodeps:忽略依赖关系任然卸载

           --test:只是测试卸载过程,并不真正卸载  

           --noscripts:卸载时不运行过程脚步

           --notriggers:不启动触发器

           --allmatches:卸载全部与其相配的文件

 

5、校验

rpm  -V  PACKNAME  PACKAGE_NAME

信息说明:

S  表示软件更改信息

M 显示权限信息

5  显示加密信息

D  显示主次设备号

L  显示链接路径数

U  显示包用户

G  显示包用户组

T  显示更改时间

p  显示更新对比属性

 

6、校验软件包来源合法性,及软件包完整性:

密钥文件:

          /etc/pki/rpm-gpg/目录下:

          RPM-GPG-KEY-readhat-release

          RPM-GPG-KEY-centos-release

检查软件包的完整性:

rpm  -K  /path/to/rpmfile

信息说明:

dsp, gpg:验证来源合法性,也即验证前面字段,可以使用--nosignature略过此项

sha1, md5:验证软件包完整性,可以使用--nodigest,略过此项

 

在此之前需要有公钥的存在,可以使用命令导入公钥:

rpm  --import  /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 

卸载公钥:

rpm  -qa  gpg-pubkey*  找出公钥名称

rpm  -e   gpg-pubkey......  卸载公钥

 

7、重建数据库

数据库文件路径:/var/lib/rpm/

使用命令重建:

rpm

--rebuilddb:重建数据库,一定会重新建立;

--initdb:初始化数据库,没有才建立,有就不建立;

 

案例:

#挂载CentOS镜像到/mnt/iso文件夹

[root@mzf ~]# mount /dev/cdrom  /mnt/iso/
mount: block device /dev/sr0 is write-protected, mounting read-only

#cd进入/mnt/iso目录

[root@mzf ~]# cd /mnt/iso/
[root@mzf iso]# pwd
/mnt/iso

#查看软件包存放在Packages

[root@mzf iso]# ls
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

#cd到此Packages目录中

[root@mzf iso]# cd Packages/

#找出tree软件

[root@mzf Packages]# find ./ -name "tree-1.5.3-3.el6.x86_64.rpm" 
./tree-1.5.3-3.el6.x86_64.rpm

#发现已经安装

[root@mzf Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
package tree-1.5.3-3.el6.x86_64 is already installed

#那就先卸载此文件

[root@mzf Packages]# rpm -e tree

#再次安装,显示进度安装成功

[root@mzf Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm 
Preparing...                 ########################################### [100%]
   1:tree             ########################################### [100%]

#安装zsh发现已经被安装过

[root@mzf Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm 
Preparing...                 ########################################### [100%]
package zsh-4.3.11-4.el6.centos.2.x86_64 is already installed

#使用--force强制安装并覆盖之前的安装

[root@mzf Packages]# rpm -ivh --force zsh-4.3.11-4.el6.centos.2.x86_64.rpm 
Preparing...         ########################################### [100%]
   1:zsh          ########################################### [100%]


#查询bind是否已经安装,发现只是一些库和工具

[root@mzf Packages]# rpm -qa | grep '^bind'
bind-libs-9.8.2-0.47.rc1.el6.x86_64
bind-utils-9.8.2-0.47.rc1.el6.x86_64

#安装一个服务器配置,显示此包依赖于bind-9.8.2-0.47.rc1.el6

[root@mzf Packages]# rpm -ivh bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm 
error: Failed dependencies:
bind = 32:9.8.2-0.47.rc1.el6 is needed by bind-chroot-32:9.8.2-0.47.rc1.el6.x86_64

#那么可以选择一起安装,也可以忽略、强制安装

[root@mzf Packages]# rpm -ivh --nodeps --force bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm 
Preparing...           ########################################### [100%]
   1:bind-chroot        warning: group named does not exist - using root
warning: group named does not exist - using root%)
warning: group named does not exist - using root%)
warning: group named does not exist - using root%)

说明:虽然装上了,但是显示一些错误信息,因为没有主配置文件,这里我们还是一起安装

[root@mzf Packages]# rpm -ivh bind-9.8.2-0.47.rc1.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:bind         warning: /etc/sysconfig/named created as /etc/sysconfig/named.rpmnew
########################################### [100%]

 

#卸载刚才安装的软件

[root@mzf Packages]# rpm -e bind-chroot
#没有信息就说明已经安装成功

#检验软件包来源合法性,这里显示正常

[root@mzf Packages]# rpm -K bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm 
bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

#而检验是通过公钥文件来处理的,如果没有这些文件,将会检查失效

[root@mzf Packages]# ls /etc/pki/rpm-gpg/
RPM-GPG-KEY-CentOS-6  RPM-GPG-KEY-CentOS-Debug-6  RPM-GPG-KEY-CentOS-Security-6  RPM-GPG-KEY-CentOS-Testing-6

#通过命令导入密钥:

[root@mzf Packages]# rpm --import /mnt/iso/RPM-GPG-KEY-CentOS-6

#查看刚才安装的密钥

[root@mzf Packages]# rpm -qa | grep 'gpg.*key'
gpg-pubkey-c105b9de-4e0fd3a3

#卸载此密钥

[root@mzf Packages]# rpm -e gpg-pubkey


 

如果安装过的软件的某些文件被删除或者破坏,如何只恢复指定文件而不重装?

#查看tree执行文件的路径

[root@mzf Packages]# which tree
/usr/bin/tree

#删除出tree执行文件

[root@mzf Packages]# rm -f /usr/bin/tree

#再次执行已经找不到此命令

[root@mzf Packages]# tree
-bash: tree: command not found

#通过rpm2cpiorpm包生成的文件列表写成数据流传给cpio查看

[root@mzf Packages]# rpm2cpio ./tree-1.5.3-3.el6.x86_64.rpm | cpio -tv
-rwxr-xr-x   1 root   root   41136 Jan 14  2015 ./usr/bin/tree
drwxr-xr-x   2 root   root   0 Jan 14  2015 ./usr/share/doc/tree-1.5.3
-rw-r--r--   1 root   root   18009 Aug 13  2004 ./usr/share/doc/tree-1.5.3/LICENSE
-rw-r--r--   1 root   root   4167 Oct 20  2009 ./usr/share/doc/tree-1.5.3/README
-rw-r--r--   1 root   root   3375 Jan 14  2015 ./usr/share/man/man1/tree.1.gz

#根据上面显示时说明展开默认在当前当文件夹

#那么我们切换到家目录

[root@mzf Packages]# cd

#只展开出tree命令

[root@mzf~]#rpm2cpio /mnt/iso/Packages/tree-1.5.3-3.el6.x86_64.rpm | cpio -idv ./usr/bin/tree
./usr/bin/tree
132 blocks

#拷贝这个命令到原来tree命令所在的目录

[root@mzf ~]# cp usr/bin/tree /usr/bin/tree

#发现tree命令又可以使用了

[root@mzf ~]# tree
.
├── anaconda-ks.cfg
├── checkdisk.sh


重建库文件

#查询库文件

[root@mzf ~]# 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@mzf ~]# mkdir backup
[root@mzf ~]# mv /var/lib/rpm/* backup/

#已经没有任何库文件

[root@mzf ~]# ls /var/lib/rpm/

#初始化库文件

[root@mzf ~]# rpm --initdb
[root@mzf ~]# ls /var/lib/rpm/
__db.001  __db.002  __db.003  __db.004  Packages

#重建库文件

[root@mzf ~]# rpm --rebuilddb
[root@mzf ~]# ls /var/lib/rpm/
Packages

#查询已经失效

[root@mzf ~]# rpm -qa
说明:这里的重建只是重新生成库文件,但以前的记录已经没有了,这时我们还原

#将刚才的文件再次移动到/var/lib/rpm

[root@mzf ~]# mv -f backup/* /var/lib/rpm/

#查询之前安装的软件,发现可以查看了

[root@mzf ~]# rpm -qa | grep '^bind.*'
bind-libs-9.8.2-0.47.rc1.el6.x86_64
bind-9.8.2-0.47.rc1.el6.x86_64

bind-utils-9.8.2-0.47.rc1.el6.x86_64

注意:这里如果只是一点文件或者锁文件破坏,还可以使用重建数据库拯救,但是如果/var/lib/rpm里的文件都被删除了,就算重建了,记录是找不回来的,这时就需要对库文件进行备份了