1.12 linux基础(十二)-软件包管理
1.12.1 软件运行和编译
-
ABI: Application Binary Interface(应用程序二进制接口,应用程序和操作系统之间的接口)
-
Windows与Linux不兼容
-
ELF(Executable and Linkable Format)
-
PE(Portable Executable)
-
-
库级别的虚拟化:
-
Linux: WINE
-
Windows: Cygwin
-
-
-
API: Application Programming Interface(应用程序和库之间的接口)
- POSIX: Portable OS
-
程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接
- 静态编译: .a
- 动态编译: .so
-
C程序编译过程
1.12.2 静态和动态链接
链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能
够正确地衔接,分为静态链接和动态链接
-
静态链接:
-
把程序对应的依赖库复制一份到包
libxxx.a -
嵌入程序包
-
升级难,需重新编译
-
占用较多空间,迁移容易
-
-
动态链接:
- 只把依赖加做一个动态链接
- libxxx.so
- 连接指向
- 占用较少空间,升级方便
- 静态和动态链接
- C程序静态链接
- JAVA程序运行
1.12.3.开发语言
-
系统级开发
- C
- C++
-
应用级开发
- java
- Python
- go
- php
- perl
- delphi
- ruby
1.12.4 .包管理器
- 二进制应用程序的组成部分:
- 二进制文件、库文件、配置文件、帮助文件
- 程序包管理器:
- debian: deb文件, dpkg包管理器
- redhat: rpm文件, rpm包管理器
- rpm: Redhat Package Manager
- RPM Package Manager
1.12.5 包命名
- 源代码: name-VERSION.tar.gz|bz2|xz
- VERSION: major.minor.release
- rpm包命名方式:
- name-VERSION-release.arch.rpm
- 例: bash-4.2.46-19.el7.x86_64.rpm
- VERSION: major.minor.release
- release: release.OS
- 常见的arch:
- x86: i386, i486, i586, i686
- x86_64: x64, x86_64, amd64
- powerpc: ppc
- 跟平台无关: noarch包命名和工具
1.12.6 包命名和工具
- 包:分类和拆包
- 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包管理器前端管理工具库文件
1.12.7.库文件
- 查看二进制程序所依赖的库文件
-
ldd /PATH/TO/BINARY_FILE
-
管理及查看本机装载的库文件
-
ldconfig 加载库文件
/sbin/ldconfig -p:
显示本机已经缓存的所有可用库文件名及文件路径映射关系 -
配置文件: /etc/ld.so.conf,/etc/ld.so.conf.d/*.conf
-
缓存文件: /etc/ld.so.cache包管理器
1.12.8.包管理器
-
程序包管理器:
- 功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
-
包文件组成 (每个包独有)
- RPM包内的文件
- RPM的元数据,如名称,版本,依赖性,描述等
- 安装或卸载时运行的脚本
-
数据库(公共): /var/lib/rpm
-
程序包名称及版本
-
依赖关系
-
功能说明
-
包安装后生成的各文件路径及校验码信息
-
1.12.9 程序包的来源
-
管理程序包的方式:
- 使用包管理器: rpm
-
使用前端工具: yum, dnf
-
获取程序包的途径:
- (1) 系统发版的光盘或官方的服务器
CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
- (1) 系统发版的光盘或官方的服务器
-
(2) 项目官方站点
-
(3) 第三方组织:
-
Fedora-EPEL:
- Extra Packages for Enterprise Linux
-
Rpmforge:RHEL推荐,包很全
搜索引擎:
- (4) 自己制作
注意:第三方包建议要检查其合法性
来源合法性,程序包的完整性
1.12.9.rpm包管理
-
CentOS系统上使用rpm命令管理程序包:
-
安装、卸载、升级、查询、校验、数据库维护
-
安装:
-
rpm {-i|--install} [install-options] PACKAGE_FILE…
-
-v: verbose
-
-vv:
-
-h: 以#显示程序包管理执行进度
-
rpm -ivh PACKAGE_FILE ...
-
rpm -ivh /misc/cd/Packages/tree-1.5.3-3.el6.x86_64.rpm
1.12.10.rpm包安装
- [install-options]
--test: 测试安装,但不真正执行安装,即dry run模式
--nodeps:忽略依赖关系
--replacepkgs | replacefiles
--nosignature: 不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
%pre: 安装前脚本 --nopre
%post: 安装后脚本 --nopost
%preun: 卸载前脚本 --nopreun
%postun: 卸载后脚本 --nopostun
1.12.11.rpm包升级
-
升级:
-
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
-
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
- upgrade:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则“安装” - freshen:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则不执行升级操作
- upgrade:安装有旧版程序包,则“升级”
-
rpm -Uvh PACKAGE_FILE ...
-
rpm -Fvh PACKAGE_FILE ...
-
--oldpackage:降级
-
--force: 强制安装
注意:
(1) 不要对内核做升级操作; Linux支持多内核版本并存,因此,对直接安装新版
本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配
置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名
(FILENAME.rpmnew)后保留
1.12.12 包查询(重点)
-
rpm {-q|--query} [select-options][query-options]
-
[select-options]
- -q:查询某包或某些包是否安装
- -qa: 所有包
- -qf: 查看指定的文件由哪个程序包安装生成
- -qpi:查询尚未安装的程序包文件的相关信息,使用-p选项
- --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
- --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
- rpm2cpio 包文件|cpio –itv 预览包内文件
- rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
-
[query-options]
- rpm -q --changelog PACKAGE_NAME:查询rpm包的changelog
- rpm -qc: 查询程序的配置文件
- *rpm -qd: 查询程序的文档
- rpm -qi: information
- rpm -ql: 查看指定的程序包安装后生成的所有文件
- --scripts:程序包自带的脚本
- --provides: 列出指定程序包所提供的CAPABILITY
- -R: 查询指定的程序包所依赖的CAPABILITY
-
常用查询用法:
-
-qi PACKAGE
-
-qf FILE
-
-qc PACKAGE
-
-ql PACKAGE
-
-qd PACKAGE
-
-qpi PACKAGE_FILE
-
-qpl PACKAGE_FILE, ...
-
-qa
1.12.13 包卸载:
- rpm {-e|--erase} [--allmatches][--nodeps] [--noscripts][--notriggers] [--test] PACKAGE_NAME ...
1.12.14 包校验
-
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 -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"
1.12.15 rpm数据库
-
数据库重建:/var/lib/rpm
-
rpm {--initdb|--rebuilddb}
-
initdb: 初始化
- 如果事先不存在数据库,则新建之
否则,不执行任何操作
- 如果事先不存在数据库,则新建之
-
rebuilddb:重建已安装的包头的数据库索引目录