Linux入门学习之rpm软件包管理-创新互联-成都快上网建站

Linux入门学习之rpm软件包管理-创新互联

Linux入门之软件包管理

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

10多年建站经验, 网站建设、成都网站设计客户的见证与正确选择。创新互联公司提供完善的营销型网页建站明细报价表。后期开发更加便捷高效,我们致力于追求更美、更快、更规范。

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包自身有依赖关系,及安装软件包时需要先安装其依赖的软件包

软件包工具分类:

前段工具:yum,apt-get

后端工具:rpm,dpt

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

#通过rpm2cpio将rpm包生成的文件列表写成数据流传给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里的文件都被删除了,就算重建了,记录是找不回来的,这时就需要对库文件进行备份了

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站题目:Linux入门学习之rpm软件包管理-创新互联
分享网址:http://kswjz.com/article/ichic.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流