Linux 程序包管理-RPM
程序简介:
POSIX(Portable Openratin System)跨平台系统:不同操作系统平台的标准C库(glibc)都是遵循POSIX规范的,这样基于标准库开发程序的源代码可以夸平台编译(API兼容),源代码可以在Linux编译也可以在windows下编译;因为标准库都基于POSIX规范,提供的调用接口一致
API兼容:开发库兼容,因此源代码可跨平台
ABI兼容:编译后的程序可以跨平台运行
同一个源代码程序同时在Windows与Linux上编译完成后,各自可以在对应系统运行,但程序不能夸平台运行,这就是ABI不兼容;现在有一种方法可以达到兼容,就是库级别的虚拟化技术Linux(WINE)、Windows(Cywin)
库:库为函数(function)是可执行程序,本身不能作为程序执行入口,但可以被调用;是编译好的二进制格式
编译程序的过程:预编译、编译、汇编、链接
预编译:预编译又称为预处理,头文件的包含、宏定义的扩展、条件编译的选择等
编译:把源代码翻译成中间代码,即汇编代码
汇编:把作为中间结果的汇编代码翻译成机器代码,即目标代码
连接:链接是处理可重定位文件,把它们的各种符号引用和符号定义转换为可执行文件中的合适信息(一般是虚拟内存地址)的过程
静态链接:将库包含在程序中;程序开发阶段程序员用ld(gcc实际上在后台调用了ld)静态链接器手动链接的过程
动态链接:程序运行期间系统调用动态链接器(ld-linux.so)自动链接的过程;windows下为dll(dynamic link library)、linux下为so(shared object)
查看二进制程序所依赖的库文件:
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载的库文件:
ldconfig -p 显示本机已经缓存的所有可用库文件名及文件路径映射关系;
ldconfig默认搜寻/lilb、/lib64、/usr/lib64、/usr/lib以及配置文件/etc/ld.so.conf、 /etc/ld.so.conf.d/*.conf内所定义目录下的库文件,搜索出可共享的动态链接库,库文件的格式为:lib***.so.**,进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,该文件保存已排好序的动态链接库名字列表。
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令刷新缓存。
软件包的组成部分:
二进制程序:/bin,/sbin,/usr/sbin,/usr/local.bin,/usr/local/sbin
库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64(开发时调用API,运行时调用ABI)
配置文件:/etc或者无须额外配置就没有配置文件
帮助文件:man文件、info文件、README、INSTALL、ChangeLog(/usr/share/{man|doc})
程序包管理:是将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级、校验、数据库管理等管理操作;
程序包管理器对程序进行管理所需要信息:
数据库:程序包名称及版本、安装生成的各文件路径及校验码信息、依赖关系、功能说明(各软件包公共)
程序组成清单:文件清单、安装卸载时运行的脚本(各软件包独有)
程序包管理方式:
使用包管理器:
RedHat:rpm(包格式.rpm)
Debian:dpkg(包格式.deb)
SUSE:rpm(与RedHat不同,二者rpm包不通用)
使用前端工具:
RedHat:yum
Fedora22+:dnf
SUSE:zypper
Debian:apt-get
RPM包命名方式:
一个程序有多个RPM包的原因:例如一个源码程序有10个功能;大多数用户只用其6个功能,余下的4个呢?把一个大的程序打包制作成多个包,6个功能作为主包,其它4个功能可以做成分包
name-version-release.rpm
name-version-releaseNumber.OS.arch.rpm
ftp-0.17-54.el6.x86_64.rpm
软件包命名格式:软件名-软件版本-发行信息
name:软件包的名字(如果有分段表示主程序的分包)
version:软件的版本号,版本号的格式通常为"主版本号.次版本号.修正号"(如:2.2.3)
release:rpm包的发行信息又包括发布版本号、OS平台、硬件平台
releaseNumber:发布版本号,表示这个RPM包是第几次编译生成的
OS:el6:redhat enterprise linux 6
arch:X86_64、i386,i586,i686、ppc(Power PC)、noarch(与平台无关)
注意:软件版本号指的是软件自身版本号,发布版本号是指发行商在将软件制作为RPM包发布时的发布版本号
包来源合法性验证:
源码程序:通过md5或sha1校验码验证;
rpm包:发行商提供的包是否合法可信的
验证包完整性:校验码
验证来源合法:公钥加密算法
获取RPM包的途径:
1、发行商的光盘或站点服务器
CentOS镜像:
http://mirrors.163.com
http://mirrors.aliyun.com
2、第三方组织:
Fedora-EPEL
https://fedoraproject.org/wiki/EPEL/zh-cn
http://repoforge.org
搜索引擎站点:
http://rpmfind.net
http://rpm.pbone.net
http://pkgs.org
https://sourceforge.net
3、项目的官方站点
4、自己制作
CentOS系统上RPM命令管理程序包:
安装:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-i 安装程序
-v 显示安装详细过程
-vv 显示更详细的调试信息
-h 以#显示程序包管理执行进度,每个#表示2%的进度
rpm -ivh PACKAGE_FILE ...
[install-options]
--test 测试安装,但不真正执行安装过程;dry run模式
--prefix 指定安装路径
--nodeps 忽略依赖关系
--replacefiles 安装程序要创建的文件已存在直接覆盖
--replacepkgs 某个包已安装直接重新安装
--nosignature 不检查来源合法性
--nodigest 不检查包完整性
--noscipts 不执行程序包脚本片断
--nopre 不执行安装前脚本
--nopost 不执行安装后脚本
--nopreun 不执行卸载前脚本
--nopostun 不执行卸载后脚本
--force 强行安装
升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
upgrade 安装有旧版程序包则"升级";如果没有安装旧版程序包则"安装"
freeshen 安装有旧版程序包则"升级";如果没有安装旧版程序包则不执行升级操作
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
[install-options]
--oldpackage 降级
--force 强行升级
注意:
1、不要对内核做升级操作;Linux支持多内核版本可以并存,直接安装新版本内核
2、如果原程序包的配置文件安装后被修改过,升级新版本后提供的配置文件并不会直接覆盖老版本的配置文件,新版本配置文件重命名(FileName.rpmnew)后保留
查询:
rpm {-q|--query} [select-options] [query-options] PACKAGE_Name
[select-options]选择查询的包
-q 仅查询后面接的软件名称是否有安装
-a 所有系统当中所有安装包
-f 查询指定的文件由哪个程序包安装生成
-p /PATH/TO/PACKAGE_FILE 针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY 查询指定的CAPABILITY(文件或功能)由哪个包所提供
--whatrequires CAPABILITY 查询指定的CAPABILITY(文件或功能)被哪个包所依赖
[query-options]选择查询那些信息
--changelog 查询rpm包的修改日志(不是程序包的修改日志)
-c 查询程序的配置文件
-d 查询程序的文档(与man有关的文件)
-i 查询程序包的信息(information)
-l 查看指定的程序包安装后生成的所有文件
--scripts 查询程序包自带的脚本片断
-R 查询指定的程序包所依赖的CAPABILITY;
--provides 列出指定程序包所提供的CAPABILITY;
用法:
rpm -qi PACKAGE_Name 查询已安装程序包描述信息
rpm -qc PACKAGE_Name 查询已安装程序包的配置文件
rpm -ql PACKAGE_Name 查询已安装程序包生成的所有文件
rpm -qd PACKAGE_Name 查询已安装程序包的文档
rpm -qf FILE_Name 查询指定的文件由哪个程序包安装生成
rpm -qpi PACKAGE_FILE 查询未安装的程序包描述信息
rpm -qpl PACKAGE_FILE 查询未安装的程序包在被安装后会生成的文件
rpm -qa 查询当前系统安装的所有RPM包
演示:
[root@centos7 ~]# rpm -q tree
tree-1.6.0-10.el7.x86_64
[root@centos7 ~]# rpm -ql 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
[root@centos7 ~]# rpm -qf /etc/fstab
setup-2.8.71-6.el7.noarch
[root@centos7 ~]# rpm -qc bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
[root@centos7 ~]# rpm -qi bash
Name : bash
Version : 4.2.46
Release : 19.el7
Architecture: x86_64
Install Date: 2016年11月06日 星期日 18时31分30秒
Group : System Environment/Shells
Size : 3663618
License : GPLv3+
Signature : RSA/SHA256, 2015年11月25日 星期三 22时14分53秒, Key ID 24c6a8a7f4a80eb5
Source RPM : bash-4.2.46-19.el7.src.rpm
Build Date : 2015年11月20日 星期五 13时04分53秒
Build Host : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://www.gnu.org/software/bash
Summary : The GNU Bourne Again shell
Description :
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.
[root@centos7 ~]# rpm -qc httpd
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
[root@centos7 ~]# rpm -qd httpd
/usr/share/doc/httpd-2.4.6/ABOUT_APACHE
/usr/share/doc/httpd-2.4.6/CHANGES
/usr/share/doc/httpd-2.4.6/LICENSE
/usr/share/doc/httpd-2.4.6/NOTICE
/usr/share/doc/httpd-2.4.6/README
/usr/share/doc/httpd-2.4.6/VERSIONING
/usr/share/doc/httpd-2.4.6/httpd-dav.conf
/usr/share/doc/httpd-2.4.6/httpd-default.conf
/usr/share/doc/httpd-2.4.6/httpd-info.conf
/usr/share/doc/httpd-2.4.6/httpd-languages.conf
/usr/share/doc/httpd-2.4.6/httpd-manual.conf
/usr/share/doc/httpd-2.4.6/httpd-mpm.conf
/usr/share/doc/httpd-2.4.6/httpd-multilang-errordoc.conf
/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
/usr/share/doc/httpd-2.4.6/proxy-html.conf
/usr/share/man/man8/apachectl.8.gz
/usr/share/man/man8/fcgistarter.8.gz
/usr/share/man/man8/htcacheclean.8.gz
/usr/share/man/man8/httpd.8.gz
/usr/share/man/man8/rotatelogs.8.gz
/usr/share/man/man8/suexec.8.gz
卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME
rpm -evh PACKAGE_NAME
选项:
--allmatches 卸载所有匹配名称的程序包各版本
--nodeps 忽略依赖关系
--test 测试卸载,dry run 模式
注意:卸载和查询是包的名,因为包已经存在了;而安装和升级,包是不存在的,所以是包的文件路径
校验:检查程序包安装后生成的文件是否被修改过
rpm {-V|--verify} [select-options] [verify-options] PACKAGE_Name
rpm -V PACKAGE_Name
-Va 列出目前系统上面所有可能被修改的文件
-Vp 后面跟RPM包文件名,列出该软件内可能被修改过的文件
-Vf 列出某个文件是否被修改过
检查出来的结果对应标志位解释(标志位存在就表示相关信息已经发生改变)
S file Size differs 文件大小是否改变
M Mode differs (includes permissions and file type) 文件的类型或文件权限属性是否被改变
5 digest (formerly MD5 sum) differs MD5检验和是否不同
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 功能是否改变
获取的RPM包来源合法性验证及完整性验证:
GNU计划的GPG(GNU Privacy Guard),防止软件被修改
公钥文件一般放在/etc/pki/rpm-gpg/目录下面,不同发行版可能路径有所不同;发布版本的光盘中也用对应的公钥文件
完整性验证:SHA256(包提供方会提供相应的校验码)
来源合法性验证:RSA
对称加密:加密、解密使用同一密钥;
非对称加密:密钥是成对儿的,
public key:公钥,公开所有人
secret key:私钥, 不能公开
制作RPM包者完成后,通过SHA256算法得出校验码附加在RPM包中,在通过私钥加密整个RPM包,发布程序包时提供对应的公钥文件;获得RPM包和公钥后解密RPM包得到相应SHA256的校验码,并验证校验码是否一致;这样既验证了来源合法信和完整性
导入所需要公钥:系统发布都有一个密钥(公钥)
rpm --import /PATH/FROM/GPG-PUBKEY-FILE
检查RPM安装包的完成性和来源合法性
rpm -K PACKAGE_FILE
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
删除导入的公钥(导入公钥类似于安装了个RPM包,通过-e卸载就可以)
rpm -q gpg-pubkey 查询当前系统导入的所有秘钥
rpm -e --allmatches gpg-pubkey-16ca1a56-4a100959
数据库重建:
RPM的查询就是去读取相关数据库信息
/var/lib/rpm/ 存储RPM管理工具相关状态信息数据库文件夹
rpm {--initdb|--rebuilddb}
--initdb 初始化数据库(如果不存在数据库则新建,否则不执行任何操作)
--rebuilddb 重建数据库(无论当前数据库是否存在,直接重新创建数据库)
获取帮助
CentOS6 man rpm
CentOS7 man rpmdb
Linux 程序包管理-RPM的更多相关文章
- Linux程序包管理rpm与yum
Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...
- Linux程序包管理之yum及源代码安装
第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...
- 程序包管理rpm、yum与简单编译安装程序
Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...
- 程序包管理rpm和yum
Linux程序包管理: API:Application Programming Interface源码包 POSIX:Portable OS 程序源代码 --> 预处理 --> 编译 -- ...
- linux基础之程序包管理(rpm,yum)
一.rpm 安装:rpm { -i | --install } [ install-options ] PACKAGE_FILE... -v: 显示安装时的详细信息 -vv: 显示许多难以阅读的调试信 ...
- Linux程序包管理初步-rpm的使用
在Linux系统上,一般而言,对于程序包管理器来说分为三类: debian:dpt,dpkg; (程序包后缀.deb) rhel:rpm (程序包后缀.rpm) suse:rp ...
- Linux 程序包管理-YUM
前端工具YUM管理程序包: rpm管理软件虽然方便,但是需要手工解决软件包的依赖关系:很多时候安装一个软件需要首先安装一个或多个(有时多达上百个)其它软件,手工解决很复杂:使用yum可以解决这个问题 ...
- Linux程序包管理之rpm
rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...
- 【程序包管理】Linux程序包管理之rpm安装总结
rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...
随机推荐
- bootstrap fileinput控件 + django后台上传、回显简单使用
一.控件下载:https://github.com/kartik-v/bootstrap-fileinput/ 官网:http://plugins.krajee.com/file-input 需要引入 ...
- laravel :Call to undefined function App\Http\Controllers\success() 解决方法
今天在调用方法时,报错如下:Call to undefined function App\Http\Controllers\success():方法已定义好了,所以我怀疑是未引入function.ph ...
- UVA10082-WERTYU(紫书例题3.2)
A common typing error is to place the hands on the keyboard one row to the right of the correct posi ...
- SQL的运算符优先级
注: 1.乘除的优先级高于加减: 2.同一优先级运算符从左向右执行: 3.括号内的运算先执行.
- ASP.NET-AJAX.FORM提交附件失败
尝试了不少时间在AJAX.FORM提交附件,发现完全不行,经过下面的这个博客的介绍,使用ajax.form.js插件提交成功,记录一下该博文网址和结论: 相关网址:http://www.cnblogs ...
- elasticsearch的javaAPI之index
Index API 原文:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/index_.html ...
- bzoj1293: [SCOI2009]生日礼物(stl堆)
1293: [SCOI2009]生日礼物 题目:传送门 题解: 据说这道题乱搞随便就水过了 本蒟蒻想到了一个用堆的水法(还专门学了学queue): 如果把每一种颜色的下一个位置都记录一下的话,一开始就 ...
- NVMe到底是什么?
转:http://www.expreview.com/42142.html 有关注SSD的朋友应该今年听到NVMe这个词的频率应该不低,随着高端SSD的战场已经抛弃SATA向PCI-E转移,老旧的AH ...
- 理解class.forName()(good--字节码层面)
使用jdbc方式连接数据库时会使用一句代码Class.forName(String className).这句话是什么意思呢?首先说一点Class.forName(String className)这 ...
- Linux基础02
** Linux基本操作常用命令(二) ** 用户名与主机名 当你进入Linux终端时,你会看到如下样式的图片: 其中[z@z01]方括号内的z表示当前系统登录操作的用户名,@后的z01表示当 ...