在没有软件包管理器前,用户都是通过源代码的方式来安装软件。但是我们很容易发现,在每次安装软件时都必须对操作系统的境、编译的参数进行对应的编译,并且操作过程很是复杂,这对于不熟悉操作系统的朋友来说真心困难,那么有没有一款软件能让用户能很简单的安装所需的软件呢?Linux开发商将固定的硬件平台和操作系统需要安装或升级的软件编译好,并且将这些软件通过特定的打包方式将软件打包成一个特殊格式的文件,这些软件的文件含有能检测操作系统环境和软件依赖性的脚本,并提供记载该软件提供的所有文件信息等,最后将这个软件发布出去供用户使用。那么用户得到这个软件包,通过特定的命令,就能执行检测系统环境,根据环境所需的要求,对软件进行安装。
知识要点总结
1、了解软件包管理器的来源与使用
2、熟悉RPM包的命名格式 name-version-release.arch.rpm
3、熟悉打包和分包机制
4、熟悉RPM命令的使用 ,包括 安装、卸载、查询、升级、校验、公钥导入、合法性的检验、RPM数据库重建
虽然在安装软件时还有其他更好的命名,比如yum(日后再介绍),但是yum也是基于RPM而衍生出来的,解决了包的依赖性,而且在查询软件包很有用,日后也会经常使用这个命令,所以必须要对RPM命令非常熟悉,尤其是查询命令,对日后维护Linux系统帮助很大。
一、程序包管理器
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现 程序包的安装、卸载、查询、升级和校验等管理操作
• 包文件组成 (每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
• 数据库(公共):/var/lib/rpm
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息
二、rpm介绍
RPM(RedHat Package Manager),RPM通过以一个种数据库记录的方式来将你所需的软件安装到你的Linux系统上的。在你所安装的软件前先通过编译完成,打包成RPM格式的文件,数据库记录的方式搜索对应需要具备的依赖关系的软件,那么当你在安装该软件的时候,RPM会查看你系统环境和依赖性关系来判定你是否能安装此软件。若能满足,则允许安装。否则将不给予安装。并且在安装的时候将该软件的信息写入RPM的数据库中,以便日后查询、检验和升级。
三、获取rpm包途径
(1) 系统发版的光盘或官方的服务器;
CentOS镜像:
(2) 项目官方站点
源代码
rpm包
(3)很多第三方机构或个人制作并公开发布许多的rpm包
Fedora-EPEL: Extra Packages for Enterprise Linux
Rpmforge:RHEL推荐,包很全
搜索引擎:
(4) 自己制作
注意:第三方包建议要检查其合法性 来源合法性,程序包的完整
四、打包工具的分包机制:
假设一个程序有20个功能:常用功能有8个,特殊功能A:3个,特殊功能B:6个,二次开发相关功能:3个。那如果用户只需要常用功能,可是必须要全部安装,那么就会很占用空间,而且其他功能根本不会使用,这时就会分包机制了。
分包机制:
核心包(主包) + 子包(分包)组成
核心包:命令与源程序一致
子包:(安装子包前必须安装核心包)
五、rpm包使用
安装、卸载、升级、查询、校验、数据库维护
1.安装
rpm [option] Package_file
-i: install安装操作
-v: 安装时显示详细信息
-vv: 安装时显示更详细信息
-h: hash码,在安装过程中使用#号来显示安装进度
[root@localhost ~]# rpm -ivh /media/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm Preparing... ################################# [100%]Updating / installing... 1:vsftpd-3.0.2-22.el7 ################################# [100%]
--test:仅作测试,不做安装操作
[root@localhost ~]# rpm -ivh /media/Packages/tree-1.6.0-10.el7.x86_64.rpm --testPreparing... ################################# [100%][root@localhost ~]# rpm -ql treepackage tree is not installed
--nodeps:忽略依赖关系,强制安装
如果某包依赖于其他包,要么解决所有的依赖关系,要么忽略依赖关系,强制安装。但是如果强制安装完成后,软件未必能正常使用
[root@localhost ~]# rpm -ivh /media/Packages/httpd-2.4.6-80.el7.centos.x86_64.rpm --nodepsPreparing... ################################# [100%]Updating / installing... 1:httpd-2.4.6-80.el7.centos ################################# [100%][root@localhost ~]# rpm -ivh /media/Packages/httpd-2.4.6-80.el7.centos.x86_64.rpmerror: Failed dependencies: /etc/mime.types is needed by httpd-2.4.6-80.el7.centos.x86_64 httpd-tools = 2.4.6-80.el7.centos is needed by httpd-2.4.6-80.el7.centos.x86_64
–replacepkgs:重新安装程序包 备注:如果原有配置文件作了修改,很有可能不执行替换文件,而是将新生成的配置文件重命名后缀为 .rpmnew
2.卸载
rpm [option] Package_name
-e:erase删除
卸载的时候也会存在依赖关系的
如果被其他包所依赖:
1、将依赖于此包的所有包一并卸载
2、忽略依赖关系,能卸载,但依赖于此包程序包可能会运行不正常
--nodeps
[root@localhost ~]# rpm -e httpd[root@localhost ~]# rpm -ql httpdpackage httpd is not installed
3.升级
rpm [option] Package_file
(1)、升级或安装 (如果有老版本就升级,如果没有就安装)
组合 -Uvh
(2)、直接升级 (如果有老版本就安装新版本)
组合 -Fvh
升级的时候也可能会出现版本冲突等问题,所以如果想强制升级可以使用 –force
注意:不应该对内核执行升级操作,而是安装(因为Linux系统允许多内核并存)
4.查询
(1)、查询某包是否安装
rpm -q package_name…..
[root@localhost ~]# rpm -q sambapackage samba is not installed
(2)、查询所有已经安装的包
rpm -qa a表示all
按条件过滤: rpm -qa | grep 'PATTERN'
[root@localhost ~]# rpm -qa |grep pythonpython2-cryptography-1.7.2-2.el7.x86_64python-nss-0.16.0-3.el7.x86_64python-ethtool-0.8-5.el7.x86_64python2-hawkey-0.6.3-4.el7.x86_64python-javapackages-3.4.1-11.el7.noarch
(3)、查询包的表述信息
rpm -qi package_name (这里查询仅查询已安装的包)
[root@localhost ~]# rpm -qi treeName : treeVersion : 1.6.0Release : 10.el7Architecture: x86_64Install Date: Fri 03 Aug 2018 02:30:37 AM CSTGroup : Applications/FileSize : 89505License : GPLv2+Signature : RSA/SHA256, Fri 04 Jul 2014 01:36:46 PM CST, Key ID 24c6a8a7f4a80eb5Source RPM : tree-1.6.0-10.el7.src.rpmBuild Date : Tue 10 Jun 2014 03:28:53 AM CST
(4)、查询某包生成了哪些文件
rpm -ql package_name
[root@localhost ~]# rpm -ql tree/usr/bin/tree/usr/share/doc/tree-1.6.0/usr/share/doc/tree-1.6.0/LICENSE/usr/share/doc/tree-1.6.0/README/usr/share/man/man1/tree.1.gz
①查询某包生成了哪些配置文件
rpm -qc package_name
[root@localhost ~]# rpm -qc vsftpd/etc/logrotate.d/vsftpd/etc/pam.d/vsftpd/etc/vsftpd/ftpusers/etc/vsftpd/user_list/etc/vsftpd/vsftpd.conf
②查询某包生成了哪些帮助文件
rpm -qd package_name
[root@localhost ~]# rpm -qd vsftpd/usr/share/doc/vsftpd-3.0.2/AUDIT/usr/share/doc/vsftpd-3.0.2/BENCHMARKS/usr/share/doc/vsftpd-3.0.2/BUGS/usr/share/doc/vsftpd-3.0.2/COPYING/usr/share/doc/vsftpd-3.0.2/Changelog
③查询程序包的相关脚本
rpm –q --scripts package_name
[root@localhost ~]# rpm -q --scripts vsftpdpostinstall scriptlet (using /bin/sh):if [ $1 -eq 1 ] ; then # Initial installation systemctl preset vsftpd.service >/dev/null 2>&1 || : fipreuninstall scriptlet (using /bin/sh):
(5). 查询某文件是由哪个包安装生成的
rpm -qf /path/to/some_file
[root@localhost ~]# rpm -qf /usr/share/docfilesystem-3.2-25.el7.x86_64
-qp [ilcd……] rpm路径 查询信息的数据来自于rpm包
[root@localhost ~]# rpm -qi -p /media/Packages/samba-python-4.7.1-6.el7.x86_64.rpm Name : samba-pythonEpoch : 0Version : 4.7.1Release : 6.el7Architecture: x86_64Install Date: (not installed)Group : Unspecifie- q --provides 查询某个包提供了哪些能力 -qa --provides 查询当前系统提供的所有能力
[root@localhost ~]# rpm -qa --provides treetree = 1.6.0-10.el7tree(x86-64) = 1.6.0-10.el7-q --whatprovides webserver 查询某个能力由哪一个rpm包提供
[root@localhost ~]# rpm -q --whatprovides httpdhttpd-2.4.6-80.el7.centos.1.x86_64-q --whatrequires webserver 查询某个能力或文件被哪个rpm包所依赖
[root@localhost ~]# rpm -q --whatrequires webserverno package requires webserver-q --changelog httpd 查询更新日志
[root@localhost ~]# rpm -q --changelog httpd* Tue Jun 26 2018 CentOS Sources- 2.4.6-80.el7.centos.1- Remove index.html, add centos-noindex.tar.gz- change vstring- change symlink for poweredby.png- update welcome.conf with proper aliases
5 、校验(用于检查包装后文件属性是否发生变化)
rpm -V Package_name
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 能力发生变化(可以理解为功能)
[root@centos6 ~]#cd /etc/httpd/conf[root@centos6 conf]#lshttpd.conf magic[root@centos6 conf]#vim httpd.conf [root@centos6 conf]#rpm -V httpdS.5....T. c /etc/httpd/conf/httpd.conf
6、RPM数据库重建
小贴士:rpm 的数据库目录 /var/lib/rpm
rpm –initdb:初始化
如果事先没有库,会新建一个;如果有,则不覆盖
rpm –rebuilddb:重建
直接重建,覆盖原有的数据库
7、校验RPM包来源合法性及完整性
前言:包制作者制作完成之后会附加数字签名于包上;
包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特征码,附加原始数据后面。
验证包来源合法性和完整性的过程:
前提:必须有可靠机制获取到包制作者的公钥
1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法
2、使用与制作者同样的一样加密算法提取原始数据的特征码,并与解密出来的特征码比对,相同,则意味着完整性没问题
所以我们必须在当前系统上导入包的制作者的公钥
导入公钥:
rpm –import /path/to/key_file
小贴士:centos6的密钥是在光盘里的“RPM-GPG-KEY-CentOS-6 ”文件
[root@centos6 ~]#mount /dev/cdrom /mediamount: block device /dev/sr0 is write-protected, mounting read-only[root@centos6 ~]#cd /media[root@centos6 media]#lsCentOS_BuildTag images repodata RPM-GPG-KEY-CentOS-Testing-6EFI isolinux RPM-GPG-KEY-CentOS-6 TRANS.TBLEULA Packages RPM-GPG-KEY-CentOS-Debug-6GPL RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-Security-6
显示所有已导入的gpg格式的公钥
rpm -qa gpg-pubkey*
[root@localhost media]# rpm -import /media/RPM-GPG-KEY-CentOS-7[root@localhost media]# rpm -qa gpg-pubkey*gpg-pubkey-f4a80eb5-53a7ff4b
显示公钥的详细信息
rpm -qi gpg-pubkey-name
[root@localhost media]# rpm -qa gpg-pubkey*gpg-pubkey-f4a80eb5-53a7ff4b[root@localhost media]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4bName : gpg-pubkeyVersion : f4a80eb5Release : 53a7ff4bArchitecture: (none)Install Date: Thu 02 Aug 2018 04:25:17 AM CSTGroup : Public Keys
检查包:安装过程中会自动执行,若要自动检测请如下操作
手动检查:
rpm -K /path/to/package_file
rpm –checksig /path/to/package_file
不检查包完整性:
rpm -K –nodigest
不检查来源合法性:
rpm -K –nosignature