千家信息网

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

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,Linux入门之软件包管理在linux有很多类的软件包管理机制,但是在redhat、centos这类版本的系统中,都会使用一种相同的机制,就是rpm软件包管理机制,当然,还有其它版本的linux使用的
千家信息网最后更新 2025年01月20日Linux 入门学习之rpm软件包管理

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]# lsCentOS_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_64bind-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 rootwarning: 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/treedrwxr-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/tree132 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  TriggernameConflictname  __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_64bind-9.8.2-0.47.rc1.el6.x86_64

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

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


文件 软件 软件包 查询 命令 信息 数据 库文件 数据库 脚步 升级 版本 管理 公钥 内核 工具 配置 只是 来源 目录 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何停用orical数据库 网络安全员培训证书国家政策 如何登录金蝶云服务器 计算机网络技术开学要带电脑么 云服务器怎么把cd驱动器删除 大量访问攻击服务器的方法 服务器管理图片大全 数据库怎样计算功能点 金华大规模分布式存储数据库 手机软件开发需求分析 服务器能看到登录数据吗 伍加贰网络技术有限公司 分级保护网络安全域 怎么下载服务器的文件 决策树 网络安全 实验 larval 数据库配置 服务器托管和租用区别 全球制裁跟踪数据库 2008无盘服务器 为什么会显示服务器配置信息错误 数据库不完全链接 数据库百万级数据查询时间 西安广联达软件开发岗待遇 南京小型软件开发价格多少 警察要不要网络技术的人 吴中区远程指导软件开发专业服务 杭州网络安全研究所是国企吗 抗ddos攻击服务器 网络安全对强军备战的影响 自己有服务器怎么备案
0