程序简介:
  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的更多相关文章

  1. Linux程序包管理rpm与yum

    Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...

  2. Linux程序包管理之yum及源代码安装

    第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...

  3. 程序包管理rpm、yum与简单编译安装程序

    Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...

  4. 程序包管理rpm和yum

    Linux程序包管理: API:Application Programming Interface源码包 POSIX:Portable OS 程序源代码 --> 预处理 --> 编译 -- ...

  5. linux基础之程序包管理(rpm,yum)

    一.rpm 安装:rpm { -i | --install } [ install-options ] PACKAGE_FILE... -v: 显示安装时的详细信息 -vv: 显示许多难以阅读的调试信 ...

  6. Linux程序包管理初步-rpm的使用

    在Linux系统上,一般而言,对于程序包管理器来说分为三类: debian:dpt,dpkg;             (程序包后缀.deb) rhel:rpm (程序包后缀.rpm) suse:rp ...

  7. Linux 程序包管理-YUM

    前端工具YUM管理程序包:  rpm管理软件虽然方便,但是需要手工解决软件包的依赖关系:很多时候安装一个软件需要首先安装一个或多个(有时多达上百个)其它软件,手工解决很复杂:使用yum可以解决这个问题 ...

  8. Linux程序包管理之rpm

    rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...

  9. 【程序包管理】Linux程序包管理之rpm安装总结

    rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...

随机推荐

  1. bootstrap fileinput控件 + django后台上传、回显简单使用

    一.控件下载:https://github.com/kartik-v/bootstrap-fileinput/ 官网:http://plugins.krajee.com/file-input 需要引入 ...

  2. laravel :Call to undefined function App\Http\Controllers\success() 解决方法

    今天在调用方法时,报错如下:Call to undefined function App\Http\Controllers\success():方法已定义好了,所以我怀疑是未引入function.ph ...

  3. 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 ...

  4. SQL的运算符优先级

    注: 1.乘除的优先级高于加减: 2.同一优先级运算符从左向右执行: 3.括号内的运算先执行.

  5. ASP.NET-AJAX.FORM提交附件失败

    尝试了不少时间在AJAX.FORM提交附件,发现完全不行,经过下面的这个博客的介绍,使用ajax.form.js插件提交成功,记录一下该博文网址和结论: 相关网址:http://www.cnblogs ...

  6. elasticsearch的javaAPI之index

    Index API 原文:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/index_.html ...

  7. bzoj1293: [SCOI2009]生日礼物(stl堆)

    1293: [SCOI2009]生日礼物 题目:传送门 题解: 据说这道题乱搞随便就水过了 本蒟蒻想到了一个用堆的水法(还专门学了学queue): 如果把每一种颜色的下一个位置都记录一下的话,一开始就 ...

  8. NVMe到底是什么?

    转:http://www.expreview.com/42142.html 有关注SSD的朋友应该今年听到NVMe这个词的频率应该不低,随着高端SSD的战场已经抛弃SATA向PCI-E转移,老旧的AH ...

  9. 理解class.forName()(good--字节码层面)

    使用jdbc方式连接数据库时会使用一句代码Class.forName(String className).这句话是什么意思呢?首先说一点Class.forName(String className)这 ...

  10. Linux基础02

    ** Linux基本操作常用命令(二) ** 用户名与主机名 当你进入Linux终端时,你会看到如下样式的图片:     其中[z@z01]方括号内的z表示当前系统登录操作的用户名,@后的z01表示当 ...