一、简介
我们知道在操作系统上所使用的程序都是由程序员通过开发工具得来,程序员直接编写的纯文本的文档我们称之为源代码,由于计算机识别的是二进制程序,因此在完成源代码编写之后,就必须要经过编译成为操作系统可以看得懂的二进制程序,这里的编译就是通过编译器来进行的操作,编译器的功能就是将源代码程序转换成二进制程序,然后通过一定的安装步骤安装到操作系统上来,进而被系统用户使用。
二、程序包管理器
目前Linux系统之上软件安装方式最常见的两种,分别是:
dpkg:
这个机制最早是由Debian Linux社区所开发出来的,透过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时还能提供安装后的资讯,实在非常不错。只要是衍生于Debian的其它Linux发行版,大多使用dpkg机制来管理软件,文件后缀为.deb结尾的,包括B2D,Ubuntu等。
rpm:
这个机制最早是由Redhat这家公司开发出来的,后来实在很好用,因此很多发行版就使用这个机制来作为软件安装的管理方式,文件后缀为.rpm结尾的,包括Centos,Fedora,SuSE等知名的发行厂商。
程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、 升级和校验等管理操作;
1、包文件组成 (每个包独有)
RPM包内的文件;
PM的元数据;
如名称,版本,依赖性,描述等;
安装或卸载时运行的脚本;
2、数据库(公共)
程序包名称及版本;
依赖关系;
功能说明;
包安装后生成的各文件路径及校验码信息;
三、包命名和工具
1.rpm包命名方式:
name-VERSION-release.arch.rpm
例:bash-4.2.46-19.el7.x86_64.rpm
bash:软件名称
4.2.46:软件版本号,分为主板本和次版本,4为主版本,2为次版本
19:软件编译的次数
VERSION: major.minor.release
release:release.OS
常见的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平台无关:noarch
2.包分类和拆包:
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 开发子包
Application-utils-VERSION-ARHC.rpm 工具子包
Application-libs-VERSION-ARHC.rpm 库子包
3.包之间可能存在依赖关系,甚至循环依赖;
4.解决依赖包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具
四、库文件
1.查看二进制程序所依赖的库文件:
ldd /PATH/TO/BINARY_FILE
2.管理及查看本机装载的库文件:
ldconfig
3.显示本机已经缓存的所有可用库文件 名及文件路径映射关系:
/sbin/ldconfig -p
4.配置文件:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf
5.缓存文件:/etc/ld.so.cache
五、程序包的来源
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum,dnf
获取程序包的途径:
(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推荐,包很全
rpm包搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net
六、rpm包管理
centos系统上使用rpm命令管理程序包:安装、升级、查询、卸载、检验、数据库维护。
rpm包安装:
语法:rpm {-i|--install} [install-options] PACKAGE_FILE…
OPTION:
-v:--verbose:显示安装过程中的详细信息
-vv:更详细的信息
-h: 以#显示程序包管理执行进度
示例: rpm -ivh PACKAGE_FILE ... rpm -ivh tree-1.6.0-10.el7.x86_64.rpm
[install-options]:
- -test: 测试安装,但不真正执行安装,而仅报告依赖关系及冲突信息等;
- -nodeps:忽略依赖关系
- -replacepkgs:覆盖安装(重新安装并覆盖原有的文件)
- -replacefiles:覆盖文件(不同的rpm包文件,个别相同文件冲突)
- -nosignature: 不检查来源合法性
- -nodigest:不检查包完整性
- -noscipts:不执行程序包脚本片断
%pre: 安装前脚本;- -nopre
%post: 安装后脚本;- -nopost
%preun: 卸载前脚本; - -nopreun
%postun: 卸载后脚本;- -nopostun
示例: rpm -ivh vsftpd-3.0.2-21.el7.x86_64.rpm rpm -q vsftpd rpm -ivh - -test vsftpd-3.0.2-21.el7.x86_64.rpm rpm -ivh - -nodeps httpd-2.4.6-45.el7.centos.x86_64.rpm rpm -ivh --replacepkgs vsftpd-3.0.2-21.el7.x86_64.rpm rpm -ivh --replacepkgs --nosignature vsftpd-3.0.2-21.el7.x86_64.rpm
rpm包升级:
语法:
rpm {-U|--upgrade} [install-options]PACKAGE_FILE...
rpm {-F|--freshen} [install-options]PACKAGE_FILE...
upgrade:安装有旧版程序包,则“升级” 如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级” 如果不存在旧版程序包,则不执行升级操作
示例:
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
OPTION:
- -oldpackage:降级;
- -force: 强行升级;
升级注意事项:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,可以直接安装多个不同版本内核;
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本 的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
rpm包查询:
语法:rpm {-q|--query} [select-options] [query-options]
[select-options]
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成
-p rpmfile:针对尚未安装的程序包文件做查询操作;
- -whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
- -whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
rpm2cpio 包文件|cpio–itv 预览包内文件
rpm2cpio 包文件|cpio–id “*.conf” 释放包内文件
示例:删除/usr/bin/tree,使用rpm2cpio恢复
[query-options]
- -changelog:查询rpm包的changelog;
-c: 查询某包安装完成后生成的所有配置文件;
-d: 查询某包安装完成后生成的所有帮助文件;
-i: information(查询某包简要说明信息);
-l: 查看指定的程序包安装后生成的所有文件;
- -scripts:程序包自带的脚本片断;
-R: 查询指定的程序包所依赖的CAPABILITY;
- -provides: 列出指定程序包所提供的CAPABILITY;
查询用法: -qi PACKAGE_NAME -qf FILE -qc PACKAGE_NAME -ql PACKAGE_NAME -qd PACKAGE_NAME -qpi PACKAGE_FILE -qpl PACKAGE_FILE -qa -q - -wathprovides bash -q - -wathequires bash -q - -changelog bash -q - -scripts bash -q -R bash -q - -provides bash
rpm包卸载:
语法:rpm {-e|- -erase} [- -allmatches] [- -nodeps][--noscripts] [- -notriggers] [--test] PACKAGE_NAME ...
简单用法:rpm -e PACKAGE_NAME...
OPTION:
- -nodeps:忽略依赖关系;
- -test:测试卸载;dry-run模式;
- -allmatches:如果一个程序包同时安装多个版本,则此选项一次全部卸载;
- -noscripts:不执行程序包脚本片段;
rpm包校验:
1.查询包安装之后生成的文件是否发生了改变;
2.语法:rpm {-V|--verify} [select-options][verify-options]
3.常见用法:rpm -V PACKAGE_NAME
4.当没有输出结果时表示软件包完整OK,当有相应的结果输出表妹对应的内容有修改,具体如下:
示例:
S:file Size differs(文件的容量大小是否被改变) M:Mode differs(文件的类型或文件的属性(rwx)是否被改变?如是否可运行等参数已被改变) 5:MD5 sum differs(MD5这一种指纹码的内容已经不同) D:Device major/minor number mismatch(装置的主/次代码已经改变) L:readLink(2) path mis-match(link路径一倍改变) U:User ownership differs(文件的所有者已被改变) G:Group ownership differs(文件的所属组已被改变) T:mTime differs(文件的创建时间已被改变) P:capabilities differ(功能改变)
5.包来源合法性验正及完整性验正: 完整性验正:SHA256 来源合法性验正:RSA 6.公钥加密: 对称加密:加密、解密使用同一密钥; 7.非对称加密:密钥是成对儿的 public key: 公钥,公开所有人 secret key: 私钥, 不能公开 8.导入所需要公钥: 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* 查看公钥文件
示例:
七、rpm数据库
1.rpm数据库文件:/var/lib/rpm
2.数据库重建:
语法:rpm {--initdb|--rebuilddb}
initdb: 初始化
如果事先不存在数据库,则新建之;否则,不执行任何操作;
rebuilddb:重建
无论当前存在与否,直接重新创建数据库;