一、程序包管理基础
1、API接口:
在不同的开发环境中,编写程序时会调用内核kernel或者库文件,不同系统的库文件不同(Linux、Windows等),为了增强开发程序的兼容性,不同库使用统一标准的API接口,使得不同开发环境开发的程序能够兼容
2、源码到程序执行的流程:
源码(文本) ---> 预处理 ---> 编译(编译器) ---> 汇编(汇编代码)---> 机器指令
3、编译方式:
静态编辑:
把编译器封装到程序中,程序执行时不需要依赖外部编译器
兼容性强,但程序体积大
共享编译:
程序内无编译器,而是通过连接到运行环境中的lib共享库里的编译器进行编译
兼容性弱,但程序体积小
4、二进制应用程序的组成部分
二进制文件
库文件
配置文件
帮助文件
5、程序包管理
将编译好的应用程序的各个组件,如二进制文件、库文件、配置文件、帮助文件等程序文件统一打包成为程序包,实现程序的简化安装、安装追踪、查询、升级、拆卸等管理功能
6、程序包管理器的作用
将编译好的应用程序的各个组件,如二进制文件、库文件、配置文件、帮助文件等程序文件统一打包成为程序包,实现程序的简化安装、安装追踪、查询、升级、拆卸等管理功能
程序包的构成:
(1、程序的组成清单
文件清单
安装或者拆卸时运行的脚本
(2、数据库(公共)
程序包名称及版本
依赖关系
功能说明
安装生成的各文件的文件路径及校验码信息
(3、程序数据
程序包管理器:
管理器:rpm
管理器前端工具:yum
7、常见的程序包管理器
debin公司:
管理器:deb
程序包格式:.dpt
redhat公司:
管理器:rpm------redhat packet manager
程序包格式:.rpm
8、源代码文件及rpm包命名格式
源代码文件命名格式:
name-version.tar.gz
name-version.tar.bz2
name-version.tar.xz
version:major.minor.release(主版本.次版本.发行版)
rpm包命名格式:
name-version-release.os.arch.rpm
- version # 版本号(主版本.次版本.发行版)
- release # 包发行号
- os # 操作系统
- arch # 运行平台(x86:i386、i486 、i586 、i686、x86_64、amd64)
- rpm # 文件后缀名
示例:
[root@localhost ~]# rpm -qa | grep python-2.7
python-2.7.5-68.el7.x86_64
python # 包名
2.7.5 # 发行版本号(major:2、minor:7、release:5)
68 # 包的release号
el7 # 操作系统:企业级redhat
x86_64 # 运行平台
9、主包、子包、包依赖关系
主包:用于实现程序主要功能的包
app01-version-release.os.arch.rpm
子包:用于实现程序额外附加功能的包
app01-devel-version-release.os.arch.rpm
包依赖关系:程序运行可能需要依赖于另外一个程序,被依赖的程序包叫依赖包
10、程序包的获取方式:
(1、系统发行版的光盘或者官方的服务器镜像;
(2、第三方服务器镜像
教育服务器镜像(清华、北大)
阿里云镜像:http://mirrors.aliyun.com
搜狐镜像:http://mirrors.sohu.com
163镜像:http://mirrors.163.com
(3、项目官方站点
(4、第三方组织社区站点
Fedora-EPEL
GitHub
(5、搜索引擎
二、ldd命令及ldcongif命令
ldd /path/to/file #查看二进制程序文件所依赖的库文件
示例:
[root@localhost ~]# ldd /bin/cat
linux-vdso.so.1 => (0x00007fff12890000)
libc.so.6 => /lib64/libc.so.6 (0x00007f20eb858000)
/lib64/ld-linux-x86-64.so.2 (0x00007f20ebc25000)
ldconfig -p 或 /sbin/ldconfig -p #显示已经装载到缓存的所有可用库文件及文件路径映射关系
示例:
[root@localhost ~]# ldconfig -p | grep libGL
libGL.so.1 (libc6,x86-64) => /lib64/libGL.so.1
ldconfig 或 /sbin/ldconfig # 根据库文件的缓存配置文件重读缓存
库文件的缓存配置文件:
/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf
库文件的缓存文件:
/etc/ld.so.cache
示例:
[root@localhost ~]# cat /etc/ld.so.conf.d/dyninst-x86_64.conf
/usr/lib64/dyninst
[root@localhost ~]#
[root@localhost ~]# ldconfig
三、rpm包管理器的使用
1、程序包来源合法性及完整性校验
校验文件:
程序包的制作者会使用MD5或者SHA算法对做好的程序包进行计算,得到程序包的特征码,并用私钥加密,安装前用户使用公钥解密并计算比较特征码,若不同则说明包被篡改过,不完整,或被植入病毒(所以进行校验前首先需要信任程序包的制作者)
公钥的导入:
rpm --import /path/to/poblickeyfile公钥
程序包的校验:
使用rpm安装程序包,此时会使用刚刚导入的密钥进行校验
2、程序包的安装及拆卸
格式:rpm 选项 /path/to/file.rpm
常用选项:
-i 或 --install # 安装指定程序包(若有依赖包,需要先逐一安装依赖包)
-v # 显示安装过程
-h # 显示安装进度
-e # 拆卸程序包
--face # 强制安装
--test # 测试程序包是否能被安装,不真正执行安装
--nodeps # 忽略依赖关系强行安装(容易造成安装后程序无法正常运行)
--replacepkgs # 程序安装
--nosignature # 不检查来源合法性
--nodigest # 不检查包的完整性
--noscipts # 安装时不执行程序包脚本
--nopre #不执行安装前脚本%pre
--nopost #不执行安装后脚本%post)
--nopreun # 不执行卸载前脚本%preun)
--nopostun # 执行卸载后脚本%postun)
常用选项搭配:
rpm -i --test /path/to/file.rpm # 测试程序包是否能安装
rpm -ivh /path/to/file.rpm # 安装程序包,并显示进度
rpm -ivh --replacepkgs /path/to/file.rpm # 重新安装程序包,并显示进度
rpm -evh /path/to/file.rpm # 拆卸程序包,并显示进度
示例:
[root@localhost ~]# ll
total 48
-rw-r--r--. 1 root root 47508 Jul 4 2014 tree-1.6.0-10.el7.x86_64.rpm
[root@localhost ~]# rpm -i --test tree-1.6.0-10.el7.x86_64.rpm
[root@localhost ~]# rpm -ivh tree-1.6.0-10.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:tree-1.6.0-10.el7 ################################# [100%]
[root@localhost ~]# rpm -ivh --replacepkgs tree-1.6.0-10.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:tree-1.6.0-10.el7 ################################# [100%]
[root@localhost ~]# rpm -evh tree
Preparing... ################################# [100%]
Cleaning up / removing...
1:tree-1.6.0-10.el7 ################################# [100%]
3、程序包的升级及降级
格式:rpm 选项 /path/to/file.rpm
常用选项:
-U # 升级程序包(若不存在旧的程序包,则重新安装程序包)
-F # 升级程序包(若不存在旧的程序包,则不执行)
--oldpacage # 降级程序包(用旧版的程序包替换新的程序包)
4、程序包安装情况校验
格式:rpm 选项 /path/to/file.rpm
常用选项:
-V # 执行校验操作
--nodeps #不检查依赖关系
--nodigest #不检查完整性
--nofiles #不检查生成文件
--noscripts #不检查脚本模块
--nosignature #不检查来源合法性
--nolinkto #不检查连接
--nofiledigest #不检查MD
--nosize #不检查大小
--nouser #不检查属主
--nogroup #不检查属组
校验结果:
SM5DLUGTP
S:大小改变
M:权限改变(属主、属组)
5:MD5码不同
D:设备文件主次设备号不同
L:路径不同
U:属主不同
G:属组不同
T:最后一次修改时间不同
P:功能不匹配
示例:
[root@localhost ~]# rpm -ivh tree-1.6.0-10.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:tree-1.6.0-10.el7 ################################# [100%]
[root@localhost ~]# rpm -V tree
5、程序包的安装情况查询
格式:rpm 选项 /path/to/file.rpm
常用选项:
-q # 进行程序包安装情况查询操作
-a # 查询所有已安装程序包
-f # 查询指定文件由那个程序包生成
-g # 查询指定包组的程序包
-P # 查询未安装的程序包信息(结合查询选项可查看未安装程序包的详细信息)
--whatprovides # 查询指定功能或文件是由那个程序包提供的
--whatrequires # 查询指定功能或文件有那些依赖程序包
--changelog # 查询rpm包的修改日志
-c # 查询指定程序包有哪些配置文件
--conflicts # 查询指定程序包可能会和那些程序发生冲突
-d # 查询程序包安装生成的文档
-i # 查询查询包的概要信息
-L # 查询包的许可证文件
-l # 查询包安装生成的所有文件
--scripts # 查询程序包的脚本
--triggers # 查询包的触发器脚本
-R # 查询包所依赖的库文件
--provides # 查看程序包所提供的功能
示例:
[root@localhost ~]# rpm -q tree
tree-1.6.0-10.el7.x86_64
[root@localhost ~]# rpm -qa | grep tree
tree-1.6.0-10.el7.x86_64
[root@localhost ~]# rpm -qd tree
/usr/share/doc/tree-1.6.0/LICENSE
/usr/share/doc/tree-1.6.0/README
/usr/share/man/man1/tree.1.gz
[root@localhost ~]# rpm -qi tree
Name : tree
Version : 1.6.0
Release : 10.el7
Architecture: x86_64
Install Date: Tue 03 Mar 2020 02:13:52 PM CST
Group : Applications/File
Size : 89505
License : GPLv2+
Signature : RSA/SHA256, Fri 04 Jul 2014 01:36:46 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : tree-1.6.0-10.el7.src.rpm
Build Date : Tue 10 Jun 2014 03:28:53 AM CST
Build Host : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://mama.indstate.edu/users/ice/tree/
Summary : File system tree viewer
Description :
The tree utility recursively displays the contents of directories in a
tree-like format. Tree is basically a UNIX port of the DOS tree
utility.
[root@localhost ~]# rpm -q -l 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
6、rpm包管理器的数据库
rpm管理程序包时候,会将相关数据存储到数据库文件:/var/lib/rpm
[root@localhost ~]# cd /var/lib/rpm
[root@localhost rpm]# ls
Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5
Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername
如果以上文件损坏,有的查询操作将无法进行,需要读取原程序信息重建数据库
rpm --initdb # 初始化数据库(存在数据库则不进行操作、不存在则进行重建初始化)
rpm --rebuilddb # 重建数据库(无论数据库存在与否,都进行重建)