Linux程序包管理
在早期我们使用源代码的方式安装软件时,都需要先把源程序代码编译成可执行的二进制应用程序,然后进行安装。意味着每次安装软件都需要经过 预处理
–> 编译 –> 汇编–> 链接, 这个复杂的过程。为简化安装步骤,程序提供商就在特定的系统上面编译好相关程序的安装文件并进行打包,提供给人们下载,我们只需要根据自己的系统去下载相应的安装包进行安装即可,这里可以对比理解,windows和linux在程序包方面有类似的方面,都是由程序开发者将应用程序编译好打包供需要的人下载,不同的地方是windows平台应用程序的开发者是将应用程序编译打包成二进制格式的可执行程序,而linux平台应用程序开发者则是将应用程序编译打包成rpm格式的软件包。
那么既然应用程序都被打包,肯定需要一样工具来管理程序包,这个工具就叫做程序包管理器.
什么是程序包管理器?
顾名思义“程序包管理器”,主要作用肯定是对软件程序包进行管理的一种工具,那么我们在学习的时候就这理解。在Linux上,程序包管理器是用于管理Linux下软件包的软件,其主要功能是:
将编译好的程序好的程序打包成一个文件或多个文件,可用于实现软件的安装、卸载升级、查询等功能。
常见的程序包管理器有哪些?
两大主流:
debian:deb,dpt。debian系。deb管理器,程序包以dpt结尾。
edhat:rpm,rpm。rhel系。 rpm管理器,程序包以rpm结尾。
程序包的组成部分以及安装之后的存放路径
– 二进制程序
存放路径:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
– 库文件
存放路径:/lib64,/usr/lib64,/usr/local/lib64等
– 配置文件
存放路径:/etc或者conf目录中
– 帮助文件
存放路径:/usr/share/man,/usr/local/share/man等
rpm包命名方式
-
name-VERSION-release.arch.rpm
-
VERSION:major.minor.release 依次是主版本号.次版本号.发行号
release.arch:rpm自身的发行号.平台编号 -
常见的arch:
x86(32位):i386,i486,i586,i686
x86_64(64位):x64,x86_64,amd64
eg:
zsh-5.0.2-14.el7.x86_64.rpm
5.0.2:5(主版本号).0(次版本号).2(发行号)
14.el7.x86_64:14(rpm自身的发行号).el7(表示适用redhat 7).x86_64(适用64位操作系统) -
分包机制:对于一个程序来说,其可能有很多功能,包括常用功能和非常用功能,弱把所有的功能打包到一块儿,无疑程序包增大许多,一些普通用户无需使用的功能都需一并下载安装,无形之中造成了资源的浪费,所以,程序包在打包时就出现了分包机制,主要分为主包和支包。
eg:
zlib-1.2.7-15.el7.x86_64.rpm –>主包
zlib-devel-1.2.7-15.el7.x86_64.rpm –>支包
zlib-static-1.2.7-15.el7.x86_64.rpm –>支包
管理程序包的方式:
使用报管理器:rpm
使用前端管理工具:yum,dnf
获取程序包的途径
-
系统发行版的光盘或官方的服务器
CentOS镜像:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com -
项目官方站点
-
第三方组织
Fedora-EPEL
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net -
自己制作
CentOS系统上rpm命令管理程序包:
包括安装、卸载、升级、查询、校验、数据库维护
-
安装:
rpm {-i|–install} [install-options] PACKAGE_FILE …
-v: verbose
-vv:
-h: 以#显示程序包管理执行进度;每个#表示2%的进度
rpm -ivh PACKAGE_FILE…
[root@Daniel Packages]# rpm -qa lshw [root@Daniel Packages]# echo $? 0 [root@Daniel Packages]# rpm -ivh lshw-B.02.17-5.el7.x86_64.rpm 准备中... ################################# [100%] 正在升级/安装... 1:lshw-B.02.17-5.el7 ################################# [100%] [root@Daniel Packages]# rpm -qa lshw lshw-B.02.17-5.el7.x86_64 [root@Daniel Packages]# rpm -e lshw [root@Daniel Packages]# rpm -qa lshw [root@Daniel Packages]# echo $? 0 [root@Daniel Packages]#
[install-options] --test: 测试安装,但不真正执行安装过程;dry run模式; --nodeps:忽略依赖关系; --replacepkgs: 重新安装; --nosignature: 不检查来源合法性; --nodigest:不检查包完整性; --noscipts:不执行程序包脚本片断; %pre: 安装前脚本; --nopre %post: 安装后脚本; --nopost %preun: 卸载前脚本; --nopreun %postun: 卸载后脚本; --nopostun
[root@Daniel Packages]# rpm -ivh --test unixODBC-2.3.1-11.el7.x86_64.rpm 准备中... ################################# [100%] [root@Daniel Packages]# rpm -qa unixODBC [root@Daniel Packages]# rpm -ivh --test unixODBC-2.3.1-11.el7.x86_64.rpm 准备中... ################################# [100%] [root@Daniel Packages]# rpm -qa unixODBC [root@Daniel Packages]# rpm -ivh unixODBC-2.3.1-11.el7.x86_64.rpm 准备中... ################################# [100%] 正在升级/安装... 1:unixODBC-2.3.1-11.el7 ################################# [100%] [root@Daniel Packages]# rpm -qa unixODBC-2.3.1-11.el7.x86_64 [root@Daniel Packages]#
-
升级
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;
freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作;
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
[root@Daniel Packages]# rpm -Uvh unixODBC-2.3.1-11.el7.x86_64.rpm 准备中... ################################# [100%] 正在升级/安装... 1:unixODBC-2.3.1-11.el7 ################################# [100%] [root@Daniel Packages]# rpm -fvh unixODBC-2.3.1-11.el7.x86_64.rpm rpm:--hash (-h) 选项只能在软件包安装和擦除时指定 [root@Daniel Packages]# rpm -Fvh unixODBC-2.3.1-11.el7.x86_64.rpm [root@Daniel Packages]# echo $? 0 [root@Daniel Packages]#
--oldpackage:降级; --force: 强行升级;
注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核;
(2) 如果原程序包的配置文件安装后曾被修改,长级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
-
查询:
rpm {-q|--query} [select-options] [query-options] [select-options] -a: 所有包 -f: 查看指定的文件由哪个程序包安装生成 -p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作 --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供; --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖; [query-options] --changelog:查询rpm包的changlog -c: 查询程序的配置文件 -d: 查询程序的文档 -i: information -l: 查看指定的程序包安装后生成的所有文件; --scripts:程序包自带的脚本片断 -R: 查询指定的程序包所依赖的CAPABILITY; --provides: 列出指定程序包所提供的CAPABILITY; 用法: -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ... -qa
[root@Daniel Packages]# rpm -qi time Name : time Version : 1.7 Release : 45.el7 Architecture: x86_64 Install Date: 2016年02月21日 星期日 19时41分51秒 Group : Applications/System Size : 47926 License : GPLv2+ Signature : RSA/SHA256, 2014年07月04日 星期五 13时33分47秒, Key ID 24c6a8a7f4a80eb5 Source RPM : time-1.7-45.el7.src.rpm Build Date : 2014年06月12日 星期四 21时29分00秒 Build Host : worker1.bsys.centos.org Relocations : (not relocatable) Packager : CentOS BuildSystem < Vendor : CentOS URL : Summary : A GNU utility for monitoring a program's use of system resources Description :The GNU time utility runs another program, collects information aboutthe resources used by that program while it is running, and displaysthe results. [root@Daniel Packages]# rpm -qf /etc/grub.d/ grub2-tools-2.02-0.29.el7.centos.x86_64 [root@Daniel Packages]# rpm -ql time /usr/bin/time/usr/share/doc/time-1.7 /usr/share/doc/time-1.7/AUTHORS /usr/share/doc/time-1.7/COPYING /usr/share/doc/time-1.7/ChangeLog /usr/share/doc/time-1.7/NEWS /usr/share/doc/time-1.7/README /usr/share/info/time.info.gz
-
卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ... -e:表示擦除,卸载 --allmatcher:表示所有匹配到的 --nodeps:不依赖,表示仅卸载当前包 --noscripts:卸载时不执行脚本 --notriggers:卸载时不执行触发器 --test:卸载测试,并不真正卸载
[root@Daniel Packages]# rpm -qa unixODBC unixODBC-2.3.1-11.el7.x86_64 [root@Daniel Packages]# rpm -e --test unixODBC 错误:依赖检测失败: libesoobS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libmimerS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libnn.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbccr.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcdrvcfg1S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcdrvcfg2S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcminiS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcnnS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbctxtS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 liboplodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 liboraodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libsapdbS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libtdsS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libtemplate.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 unixODBC(x86-64) = 2.3.1-11.el7 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 [root@Daniel Packages]# rpm -e --test unixODBC --nodeps [root@Daniel Packages]# rpm -qa unixODBC [root@Daniel Packages]# rpm -e unixODBC 错误:依赖检测失败: libesoobS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libmimerS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libnn.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbccr.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcdrvcfg1S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcdrvcfg2S.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcminiS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbcnnS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libodbctxtS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 liboplodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 liboraodbcS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libsapdbS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libtdsS.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 libtemplate.so.2()(64bit) 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 unixODBC(x86-64) = 2.3.1-11.el7 被 (已安裝) unixODBC-devel-2.3.1-11.el7.x86_64 需要 [root@Daniel Packages]# rpm -e unixODBC --nodeps [root@Daniel Packages]# echo $? 0
-
校验:
rpm {-V|–verify} [select-options] [verify-options]
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
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
包来源合法性验正及完整性验正:
完整性验正:SHA256
来源合法性验正:RSA
公钥加密:
对称加密:加密、解密使用同一密钥;
非对称加密:密钥是成对儿的,
public key: 公钥,公开所有人
secret key: 私钥, 不能公开
导入所需要公钥:
rpm –import /PATH/FROM/GPG-PUBKEY-FILE
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
原创文章,作者:Daniel-W,如若转载,请注明出处:http://www.178linux.com/17055
评论列表(2条)
已置顶,欢迎加入免检家庭
@stanley:感谢老师