Linux 入门学习之rpm软件包管理

Linux入门之软件包管理

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

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

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

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

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

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

[[email protected] ~]# 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文件夹

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

#cd进入/mnt/iso目录

[[email protected] ~]# cd /mnt/iso/
[[email protected] iso]# pwd
/mnt/iso

#查看软件包存放在Packages中

[[email protected] iso]# ls
CentOS_BuildTag  EULA  images    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目录中

[[email protected] iso]# cd Packages/

#找出tree软件

[[email protected] Packages]# find ./ -name "tree-1.5.3-3.el6.x86_64.rpm" 
./tree-1.5.3-3.el6.x86_64.rpm

#发现已经安装

[[email protected] 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

#那就先卸载此文件

[[email protected] Packages]# rpm -e tree

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

[[email protected] Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm 
Preparing...                 ########################################### [100%]
   1:tree             ########################################### [100%]

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

[[email protected] 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强制安装并覆盖之前的安装

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

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

[[email protected] 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 包

[[email protected] 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

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

[[email protected] 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%)

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

[[email protected] 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%]

#卸载刚才安装的软件

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

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

[[email protected] 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

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

[[email protected] 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

#通过命令导入密钥:

[[email protected] Packages]# rpm --import /mnt/iso/RPM-GPG-KEY-CentOS-6

#查看刚才安装的密钥

[[email protected] Packages]# rpm -qa | grep ‘gpg.*key‘
gpg-pubkey-c105b9de-4e0fd3a3

#卸载此密钥

[[email protected] Packages]# rpm -e gpg-pubkey

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

#查看tree执行文件的路径

[[email protected] Packages]# which tree
/usr/bin/tree

#删除出tree执行文件

[[email protected] Packages]# rm -f /usr/bin/tree

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

[[email protected] Packages]# tree
-bash: tree: command not found

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

[[email protected] 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

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

#那么我们切换到家目录

[[email protected] Packages]# cd

#只展开出tree命令

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

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

[[email protected] ~]# cp usr/bin/tree /usr/bin/tree

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

[[email protected] ~]# tree
.
├── anaconda-ks.cfg
├── checkdisk.sh


重建库文件

#查询库文件

[[email protected] ~]# 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

#备份移动库文件

[[email protected] ~]# mkdir backup
[[email protected] ~]# mv /var/lib/rpm/* backup/

#已经没有任何库文件

[[email protected] ~]# ls /var/lib/rpm/

#初始化库文件

[[email protected] ~]# rpm --initdb
[[email protected] ~]# ls /var/lib/rpm/
__db.001  __db.002  __db.003  __db.004  Packages

#重建库文件

[[email protected] ~]# rpm --rebuilddb
[[email protected] ~]# ls /var/lib/rpm/
Packages

#查询已经失效

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

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

[[email protected] ~]# mv -f backup/* /var/lib/rpm/

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

[[email protected] ~]# 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里的文件都被删除了,就算重建了,记录是找不回来的,这时就需要对库文件进行备份了

时间: 2024-10-07 07:01:51

Linux 入门学习之rpm软件包管理的相关文章

Linux学习之CentOS(二十三)--Linux软件管理之源代码以及RPM软件包管理

在Linux系统下,对于软件包的管理有多种机制,有源代码方式.RPM软件包管理方式以及YUM软件管理方式,本篇随笔将详细讲解CentOS下源代码形式安装软件以及RPM软件包管理机制 一.源代码形式 首 先我们先来看一下源代码的方式.我们知道,在开源的环境下,大多数的开源软件都是以源代码的形式来发布,通常将源代码打包成tar.gz的归档压缩文件发 布到网上供我们下载使用.但是我们下载下来的源代码方式我们还不能够直接使用,不像在windows系统上直接下载下来可执行的二进制文件,我们需要将下 载好的

Linux rpm 软件包管理命令

RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序” rpm 执行安装包二进制包(Binary)以及源代码包(Source)两种.二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译.安装.源代码包经常以src.rpm作为后缀名. 常用命令组合: -ivh:安装显示安装进度--install--verbose--hash-Uvh:升级软件包--Update:-qpl:列出RPM软件包内的文件信息[Query Pac

linux软件包的安装之----rpm软件包管理工具

程序语言开发的程序:系统调用:库,动态库(开发时指向的库) 程序:只要Windows上开的程序所指向的库遵循POSIX规范将源码拿到linux上编译时没问题的,运行应该也没有问题,能否运行还要看依赖的库文件是否存在:因为linux.Windows的ABI不同,Windows上编译好的程序无法在linux上正常运行,即使程序源码遵循POSIX规范. API:POSIX(可移植os规范) ABI:应用二进制接口 linux发行商:32bit:i386,预先编译好以后提供给用户二进制程序 64bit:

Linux软件管理之源代码以及RPM软件包管理与YUM软件包管理

在Linux系统下,对于软件包的管理有多种机制,有源代码方式.RPM软件包管理方式以及YUM软件管理方式 一.源代码形式 首先我们先来看一下源代码的方式.我们知道,在开源的环境下,大多数的开源软件都是以源代码的形式来发布,通常将源代码打包成tar.gz的归档压缩文件发布到网上供我们下载使用.但是我们下载下来的源代码方式我们还不能够直接使用,不像在windows系统上直接下载下来可执行的二进制文件,我们需要将下载好的源码编译成可执行的二进制文件才能运行使用,源代码形式安装流程一般如下: ①./co

Linux - rpm 软件包管理

rpm 是 Red-Hat Package Manager(rpm 软件包管理器)的缩写 rpm 的命名规则: 第一部分为 rpm 软件包的名称,第二部分是版本号,第三部分是版本发布次数,第四部分是软件包适用的平台 -i:安装该软件包 -v:显示安装的详细信息 -h:显示安装的进度 [[email protected] test]# rpm -ivh python-tox-1.4.2-8.el7.noarch.rpm 也可以直接安装网络上的软件包 [[email protected] test]

linux常用命令---rpm软件包管理

rpm软件包管理 原文地址:https://www.cnblogs.com/open-yang/p/11253278.html

CentOS软件管理之源代码以及RPM软件包管理

在Linux系统下,对于软件包的管理有多种机制,有源代码方式.RPM软件包管理方式以及YUM软件管理方式,本篇随笔将详细讲解CentOS下源代码形式安装软件以及RPM软件包管理机制 一.源代码形式 首先我们先来看一下源代码的方式.我们知道,在开源的环境下,大多数的开源软件都是以源代码的形式来发布,通常将源代码打包成tar.gz的归档压缩文件发布到网上供我们下载使用.但是我们下载下来的源代码方式我们还不能够直接使用,不像在windows系统上直接下载下来可执行的二进制文件,我们需要将下载好的源码编

Linux入门学习教程:虚拟机体验之KVM篇

在上一篇中,我展示了虚拟机软件QEMU的使用.效果及其性能,同时也分析了不同用户对虚拟机的不同追求.但是不管是桌面用户还是企业级用户,对虚拟机 软件的追求有一点是共同的,那就是性能.QEMU是一个强大的虚拟机软件,它可以完全以软件的形式模拟出一台完整的电脑所需的所有硬件,甚至是模拟出不同 架构的硬件,在这些虚拟的硬件之上,可以安装完整的操作系统.QEMU的运行模式如下图: 很显然,这种完全以软件模拟硬件的形式虽然功能强大,但是性能难以满足用户的需要.模拟出的硬件的性能和物理硬件的性能相比,必然会

好程序员云计算学习路线分享软件包管理

好程序员云计算学习路线分享软件包管理,安装/查询/卸载 一.软件的类型A. 源码包 需要编译 nginx-1.12.1.tar.gz B. 二进制包 已编译 mysql-community-common-5.7.12-1.el7.x86_64.rpm 常见二进制包系统平台 包类型 工具 在线安装(自动解决依赖关系)RedHat/Centos RPM rpm,rpmbuild yumUbuntu/Debian DPKG dpkg apt注意: 不管是源码包,还是二进制包,安装时都可能会有依赖关系!