程序简介:
  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. Python基础数据类型list,tuple

    列表是有序的可变的元素集合.列表中的每个元素可以使任何数据类型,包括列表本身. 列表生成 Python3中的列表通过定义,for循环,列表推导式等几种方式生成 定义 直接通过中括号`[]`定义一个列表 ...

  2. CSS变量实用指南及注意事项

    近年来,一些动态特性已经开始成为 CSS 语言本身的一部分. CSS变量 – 官方的术语为 "自定义属性" – 已经已经加入规范并且具有很好的浏览器支持,而 CSS mixins ...

  3. 如何让myeclipse左边选中文件后自动关联右边树

    在左侧项目树的右上角下拉菜单里有link with editor 点击即可

  4. SpringBoot2.0中使用自定义properties文件

    一.在resources目录下添加自定义的test.properties文件 test.properties内容如下: host=127.0.0.1 port=8080 二.编写一个读取配置文件内容的 ...

  5. ANY和ALL

    8.在WHERE中使用ANY和ALL条件   字段 >ANY(值1,值2,值3...):字段值大于集合任何一个       值就算满足条件.     字段 >ALL(值1,值2,值3... ...

  6. 【转】Visual Studio單元測試小應用-測執行時間

    [转]Visual Studio單元測試小應用-測執行時間 Visual Studio的單元測試會記錄每一個測試的執行時間,如果有幾個Method要測效能,以前我會用Stopwatch,最近我都改用單 ...

  7. mysql数据实时同步到Elasticsearch

    业务需要把mysql的数据实时同步到ES,实现低延迟的检索到ES中的数据或者进行其它数据分析处理.本文给出以同步mysql binlog的方式实时同步数据到ES的思路, 实践并验证该方式的可行性,以供 ...

  8. (转)Linux内核 TCP/IP、Socket参数调优

    Doc1: /proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失) ...

  9. Linux网络编程(3)——多进程、多线程

    在我的里面已经介绍了linux以下c的进程.线程接口,这里就不做过多阐述了. 多进程 这里多进程採用传统的多进程模型.每当有client发来的连接时创建一个进程来处理连接,一个子进程相应一个连接. 有 ...

  10. Partition(hdu4651)2013 Multi-University Training Contest 5----(整数拆分一)

    Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...