十六、程序包管理之 rpm
c语言程序的构建过程
1.程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接--> 可执行程序
- 开放源码:就是程序码,文本格式的源代码,写给人类看的程序语言,但机器并不认识,所以无法执行;
- 编译器:将程序码转译成为机器看的懂得语言,就类似翻译者的角色,生成二进制文件;
- 链接:在Linux上使用ld工具,将o文件和所需的库文件链接起来组成一个可正常工作的可执行程序。链接了库文件之后就可以发起一些系统调用。
- 静态编译:.a
- 把程序对应的依赖库复制一份到包
- libxxx.a
- 嵌入程序包
- 升级难,需重新编译
- 占用较多空间,迁移容易
- 动态编译:.so
- 只把依赖加做一个动态链接
- libxxx.so
- “连接指向”
- 占用较少空间,升级方便
- 指针指向,软链接
- 静态编译:.a
- 可执行文件:经过编译器变成二进制程序后,机器看的懂所以可以执行的文件。
2.二进制程序的组成部分:二进制文件、库文件、配置文件、帮助文件
查看二进制程序所依赖的库文件:
·ldd /PATH/TO/BINARY_FILE
3.包命名规则:
源代码:name-VERSION.tar.gz | bz2 | xz;
VERSION: major.minor.release
主版本号.次版本号.发行号
rpm包:name-VERSION-ARCH.rpm
例:bash-4.2.46-19.el7.x86_64.rpm bash :软件名称 4.2.46:软件版本号,主版本.次版本.发行号 19 :软件编译的次数
e17 : OS平台
二进制格式: testapp-1.2.3-1.操作系统平台.cpu平台.rpm
源码格式: testapp-1.2.3-1.操作系统平台.src.rpm
源码: testapp-1.2.3.tar.压缩格式(gzip,bzip2,xz,zip)
VERSION: major.minor.release (程序包的release)
ARCH :release.arch (rpm包的release)
release:release.OS
操作系统平台: centos: el6,el7
常见的arch(CPU平台):
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平台无关:noarch----------含有noarch的包说明,你可以在任何平台上安装这个软件包,就是说它并不依赖于哪个特定的linux发布版。
一般,源码都是打包压缩过的文件,其通常以“.gz”、“.bz2”、“.xz”结尾,源码包中包含了源码,还包含了一些有助于制作二进制rpm的文件;rpm包一般以“rpm”结尾,都是已经编译完成的,安装rpm包的过程实际上就是将包中的文件复制到Linux上,有可能还会在复制文件的前后执行一些命令,如创建一个必要的用户,删除非必要文件等。
xxxxxxxxx.rpm <==RPM 的格式,已经经过编译且包装完成的 rpm 档案;
xxxxx.src.rpm <==SRPM的格式,包含未编译的原始码资讯。
4.包管理器:
- debian:deb文件, dpkg包管理器
- redhat: rpm文件, rpm包管理器
- rpm: Redhat Package Manager
- RPM Package Manager
5.包的分类与拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 开发子包
Application-utils-VERSION-ARHC.rpm 其它子包或支包
Application-libs-VERSION-ARHC.rpm 其它子包
注意:包之间可能存在依赖关系,甚至循环关系;
解决依赖包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具
6.获取程序包的途径:
(1) 系统发版的光盘或官方的服务器;
CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 项目官方站点
(3) 第三方组织:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推荐,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
注意:第三方包要检查其合法性、完整性!!
7.库文件
一些查看命令:
ldd /PATH/TO/BINARY_FILE # 查看二进制程序所依赖的库文件
ldconfig -p # 显示本机已经缓存的所有可用库文件名及文件路径映射关系
8.程序的配置文件和缓存文件:
配置文件:
/etc/ld.so.conf 全部放到一个文件中,或
/etc/ld.so.conf.d/*.conf 此文件目录下.cong结尾的文件,方便一个程序写一个配置文件
缓存文件:
/etc/ld.so.cache
一、程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
包文件组成 (每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
数据库(公共):/var/lib/rpm
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息
ll /var/lib/rpm/ total 75612 -rw-r--r--. 1 root root 5521408 Oct 23 18:48 Basenames -rw-r--r--. 1 root root 12288 Oct 23 18:47 Conflictname -rw-r--r--. 1 root root 73728 Dec 4 11:57 __db.001 -rw-r--r--. 1 root root 229376 Dec 4 11:57 __db.002 -rw-r--r--. 1 root root 1318912 Dec 4 11:57 __db.003 -rw-r--r--. 1 root root 753664 Dec 4 11:57 __db.004 # 这个rpm包数据库文件夹中包含着现有已经安装的包的各种信息,包括安装版本,安装时间、升级时间、卸载时间等等非常重要,最好备份
二、rpm命令使用
在CentOS系统上用rpm管理程序包,
实现安装、卸载、查询、校验、升级、数据库维护
2.1、安装:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-v : verbose
-vv:更详细
-h :以#显示程序包管理执行进度,每个#表示2%的进度
rpm -ivh PACKAGE_FILE ... # 安装某程序包 [install-options] --test: 测试安装,但不真正执行安装,即dry run模式 --nodeps:忽略依赖关系 --replacepkgs | replacefiles 重新安装
# 对于已经安装过的包,如果不经过卸载,只是删除其一些文件,就会导致这个程序无法使用,
我们再重新安装这个程序包时,会显示此包已经安装,是因为在/var/lib/rpm这个文件中有该程序的安装记录。
所以这种情况下要想重新安装这个程序包就需要rpm -ivh --replacepkgs 这个选项!
--nosignature: 不检查来源合法性 --nodigest:不检查包完整性 --noscripts:不执行程序包脚本 %pre: 安装前脚本; --nopre %post: 安装后脚本; --nopost %preun: 卸载前脚本; --nopreun %postun: 卸载后脚本; --nopostun
注意:
我们在rpm安装时截图中红框位置显示nokey是因为我们没有导入RPM-GPG-KEY-CentOS-7这个检查工具来检查其合法性,
导入后即可显示rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
(rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 (centos6)
)
导入公钥即可检查,这样在安装来源合法的程序包时就不在显示nokey。
2.2、升级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE... upgrade # 安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装” rpm {-F|--freshen} [install-options] PACKAGE_FILE... freshen # 安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作 rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ... --oldpackage:降级 --force: 强制安装
注意:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留。
(3) 程序包版本升级了,但是旧配置文件和新配置文件一模一样,此时新版本根本不会装进来;只保留旧版本和你修改过版本格式
2.3、查询
rpm {-q|--query} [select-options] [query-options] [select-options] -a: 所有包 (常用) -f: 查看指定的文件由哪个程序包安装生成 (常用) -p rpmfile:针对尚未安装的程序包文件做查询操作 (常用) --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供 --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖 [query-options] --changelog:查询rpm包的changelog -c: 查询程序的配置文件 -d: 查询程序的文档 -i: information (常用) -l: 查看指定的程序包安装后生成的所有文件 (常用)
--scripts:程序包自带的脚本 --provides: 列出指定程序包所提供的CAPABILITY -R: 查询指定的程序包所依赖的CAPABILITY rpm2cpio 包文件|cpio –itv 预览包内文件 rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
2.4、卸载
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
注意:由于我们在安装程序包是会同时安装许多依赖文件,而这种卸载方法只是卸载程序本身,并不同时将依赖文件卸载,所以要想完整卸载的话需要用yum
yum history # 查看历史记录,找到是第几部的操作 yum history undo # # 表示对历史操作中的第#想进行反操作
2.5、校验程序包
rpm -V [selection-option] [verify-options] [PACKAGE_FILE...] 校验的内容 S:大小改变 5:md5 T: modify timestamp D:device,主次设备号不匹配 L:link路径 U:user G:group
导入所需要公钥
rpm -K|checksig rpmfile 检查包的完整性和签名
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*”
在程序包安装前对包的来源合法性及完整性验正
完整性验正: md5,sha1,sha128,sha256,sha384,sh512
来源合法性: RSA
对来源合法性和完整性验正: GPG
加密类型:
对称加密:加解密同一密钥
非对称加密 加解密不同密钥,pk(public key) sk(secre key)
1、用一个密钥加密,只能用与之匹配的另一个密钥解密
2、私钥不能公开,公钥公开
对将要安装的程序包的校验
1、程序包提供的公钥导入至系统: rpm -import RPM-GPG-KEY-CentOS-7
2、程序包安装时,不再出现错误信息
数据库维护
位置;/var/lib 程序的状态信息
当数据库损坏时,重建数据库
--rebuildb 直接重建
--initdb 存在数据库不会重建,不存在时,重建