rpm

软件运行环境

API:Application Programming Interface
    POSIX:Portable OS

程序源代码--> 预处理--> 编译--> 汇编--> 链接
    静态编译:
    共享编译:.so

ABI:Application Binary Interface
    Windows与Linux不兼容
        ELF(Executable and Linkable Format)
        PE(Portable Executable)
    库级别的虚拟化:
        Linux: WINE
        Windows: Cywin

linux 软件的组成

二进制程序

共享库--给别应用程序用的
    共享库,把程序的某些功能做成库。

配置文件
帮助文件

/etc
/bin
/lib
/usr/share/man

/usr/local/
/usr/
也有类似的层级结构

包管理器:

二进制应用程序的组成部分:
    二进制文件、库文件、配置文件、帮助文件

程序包管理器:
    debian:deb文件, dpkg包管理器

    redhat: rpm文件, rpm包管理器
    rpm: RedhatPackage Manager
    RPM Package Manager

包命名

源代码: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, amd64powerpc: ppc
        跟平台无关:noarch

包命名和工具

包:分类和拆包
    Application-VERSION-ARCH.rpm: 主包
    Application-devel-VERSION-ARCH.rpm开发子包
    Application-utils-VERSION-ARHC.rpm其它子包
    Application-libs-VERSION-ARHC.rpm其它子包

包名+版本号+发行号+平台

注安装过程中不要装错rpm包。一般情况都是需要装主包的,其他包看需要。

包之间:可能存在依赖关系,甚至循环依赖

安装软件的时候会有提示依赖关系,但是仅提示该软件的依赖关系,可能所依赖的软件包还有依赖关系。

解决依赖包管理工具:
    yum:rpm包管理器的前端工具
    apt-get:deb包管理器前端工具
    zypper: suse上的rpm前端管理工具

    dnf: Fedora 18+ rpm包管理器前端管理工具,未来的包管理工具。

库文件

查看二进制程序所依赖的库文件:
    ldd /PATH/TO/BINARY_FILE
        [root@localhost ~]# ldd /bin/cat
        linux-vdso.so.1 =>  (0x00007ffc0f7e8000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f2fbfc85000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2fc005b000)

管理及查看本机装载的库文件:
    ldconfig
    /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系

    配置文件:有时候需要编写配置文件,使系统识别第三方软件带的库文件。

            /etc/ld.so.conf  #主配置文件,不用管
            /etc/ld.so.conf.d/*.conf  #如果自己安装的软件,自己带库文件。需要用户自定编写库配置文件。让操作系统识别。
            自己创建一个.conf结尾的文件。只需要把放库文件的路径(目录)写进去,再执行 ldconfig 使系统重新读取配置文件。               

                ldconfig -p 查看系统识别到的库文件。

    缓存文件:/etc/ld.so.cache

程序包管理器:

功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验、数据库的重建等管理操作

    1、包文件组成(每个包独有)

        RPM包内的文件
        RPM的元数据,如名称,版本,依赖性,描述等
        安装或卸载时运行的脚本

    2、数据库(公共)--系统生成的  /var/lib/rpm
        程序包名称及版本
        依赖关系
        功能说明
        包安装后生成的各文件路径及校验码信息

    rpm --intdb | --rebuiddb 初始化或重建数据库

该数据库非常重要需要备份,如损坏的话即使重建也是空的。

程序包的来源

管理程序包的方式:
    使用包管理器:rpm
    使用前端工具:yum, dnf

获取程序包的途径:

    (1) 系统发版的光盘或官方的服务器;
        CentOS镜像:
        https://www.centos.org/download/
        http://mirrors.aliyun.com
        http://mirrors.sohu.com
        http://mirrors.163.com

    (2) 项目官方站点
        http://httpd.apache.org/

    (3) 第三方组织:
        Fedora-EPEL:
            Extra Packages for Enterprise Linux
以上方式推荐使用。除非都找不到,而且非关键性业务的可以使用如下方式

        Rpmforge:RHEL推荐,包很全

    搜索引擎:rpm包搜索引擎,不是百度也不谷歌。
        http://pkgs.org
        http://rpmfind.net
        http://rpm.pbone.net
        https://sourceforge.net/
    (4) 自己制作

    注意:检查其合法性:来源合法性,程序包的完整性

软件使用一定不要用盗版,包括管理软件

CentOS系统上使用rpm命令管理程序包:

安装、卸载、升级、查询、校验、数据库维护
安装:
    rpm {-i|--install} [install-options] PACKAGE_FILE…
    -v: verbose
    -vv: 更详细的信息
    -h: 以#显示程序包管理执行进度

    rpm -ivh PACKAGE_FILE ...

[install-options]

    --test: 测试安装,但不真正执行安装;dry run模式
    --nodeps:忽略依赖关系
    --replacepkgs 覆盖安装(重新安装包名,版本号都一样的) 原来的配置文件 会改名。不会覆盖。

    --replacefiles 安装程序生成的文件可能和的软件的文件冲突,安装的位置和名称都一样,rpm会有提示,不能进行安装,这事需要使用replacefiles

    --nosignature: 不检查来源合法性
    --nodigest:不检查包完整性  

    --noscipts:不执行程序包脚本片断
        %pre: 安装前脚本;--nopre
        %post: 安装后脚本;--nopost
        %preun: 卸载前脚本;--nopreun
        %postun: 卸载后脚本;--nopostun

升级:意味着老版本删除,只留一个版本的该程序。

rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...

    upgrade:安装有旧版程序包,则“升级”
        如果不存在旧版程序包,则“安装”

    freshen:安装有旧版程序包,则“升级”
        如果不存在旧版程序包,则不执行升级操作

    rpm -Uvh PACKAGE_FILE ...
    rpm -Fvh PACKAGE_FILE ...

    --oldpackage:降级  与i配合使用。 
    rpm -ivh --oldpackgage PACKAGE-FILE

    --force: 可与 安装 -i 或 升级 -U -F配合使用。


升级注意项

注意:

(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核

(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

包查询 -q

rpm {-q|--query} [select-options] [query-options]


[select-options]
    -a: 所有包
    -f: 查看指定的文件由哪个程序包安装生成
        系统上已经安装生成的文件,是由那个软件安装包生成的

    -p rpmfile:针对尚未安装的程序包文件做查询操作;
    --whatprovidesCAPABILITY:查询指定的CAPABILITY由哪个包所提供
    --whatrequiresCAPABILITY:查询指定的CAPABILITY被哪个包所依赖

    rpm2cpio 包文件|cpio –itv预览包内文件

        [root@localhost Packages]# rpm2cpio tree-1.6.0-10.el7.x86_64.rpm |cpio -itv
        -rwxr-xr-x   1 root     root        62768 Jun 10  2014 ./usr/bin/tree
        drwxr-xr-x   2 root     root            0 Jun 10  2014 ./usr/share/doc/tree-1.6.0
        -rw-r--r--   1 root     root        18009 Aug 13  2004 ./usr/share/doc/tree-1.6.0/LICENSE
        -rw-r--r--   1 root     root         4628 Jun 24  2011 ./usr/share/doc/tree-1.6.0/README
        -rw-r--r--   1 root     root         4100 Jun 24  2011 ./usr/share/man/man1/tree.1.gz
        177 blocks

    rpm2cpio 包文件 | cpio –id “*.conf”释放包内文件   

        [root@localhost ~]# rpm2cpio tree-1.6.0-10.el7.x86_64.rpm |cpio -id ./usr/bin/tree
        177 blocks

        [root@localhost ~]# tree /root
        /root
        ├── anaconda-ks.cfg
        ├── fenge.sh
        ├── old
        ├── tree-1.6.0-10.el7.x86_64.rpm
        └── usr
            └── bin
                └── tree
        可能会出现的一个问题是权限属主或属组的问题。可能需要修改。

3 directories, 4 files

[query-options]
    --changelog:查询rpm包的changelog
    -c: 查询程序的配置文件
    -d: 查询程序的文档
    -i: information
    -l: 查看指定的程序包安装后生成的所有文件;列表

    --scripts:程序包自带的脚本片断

    -R: 查询指定的程序包所依赖的CAPABILITY;  ##查询软件都依赖那些文件或程序
    --provides: 列出指定程序包所提供的CAPABILITY;##列出该软件都能提供哪些能力。

查询用法:

-qi PACKAGE, -qfFILE, -qc PACKAGE, -qlPACKAGE, -qdPACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
-qa

卸载:

    rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

    --allmatches 安装了多个版本的同名软件,全部卸载
    --notriggers 触发器,多是脚本
    --test 测试不真实卸载

    ##卸载时,如有该程序为其他程序所依赖,不能卸载,忽略依赖关系强行卸载,可以。但是会影响到其他软件的运行。

安装过的软件–校验

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 mTimediffers
    P capabilities differ

    rpm -V PACKAGEFILE  ##安装过的软件的包名不带版本号例如 tree
    rpm -Va 检查系统所有软件的完整性。比较耗时间和系统资源。

包来源合法性验正及完整性验正:

完整性验正:SHA256
来源合法性验正:RSA

公钥加密:
    对称加密:加密、解密使用同一密钥;
    非对称加密:密钥是成对儿的
    public key: 公钥,公开所有人
    secret key: 私钥, 不能公开

导入所需要公钥:
    rpm -K|checksigrpmfile检查包的完整性和签名
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7
    rpm -qa gpg-pubkey* 查询安装的key

常用选项

rpm数据库

数据库重建:
    /var/lib/rpm

rpm {--initdb|--rebuilddb}

    initdb: 初始化
    如果事先不存在数据库,则新建之
    否则,不执行任何操作

    rebuilddb:重建
    无论当前存在与否,直接重新创建数据库

rpm常用用法:

安装 [root@yangyouwei ~]# rpm -ivh /media/CentOS6.8Final/Packages/tree-1.5.3-3.el6.x8664.rpm warning: /media/CentOS6.8Final/Packages/tree-1.5.3-3.el6.x8664.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing… ########################################### [100%] 1:tree ########################################### [100%] 升级

    rpm -uvh FILEPACKAGE...
    rpm -fvh FILEPACKAGE...

卸载

    [root@yangyouwei ~]# rpm -e  tree

查询 查询已经安装的软件包。后面跟的是包名 [root@localhost ~]# rpm -q tree #必须是准确的包名 tree-1.6.0-10.el7.x86_64 #已经安装的软件的版本

    使用正则表达式查询已经安装的软件
    [root@localhost ~]# rpm -qa | grep "^tr" #配合grep使用正则表达式查询
    trousers-0.3.13-1.el7.x86_64
    traceroute-2.0.19-5.el7.x86_64
    tree-1.6.0-10.el7.x86_64

    查询文件系统上的文件是由那个rpm包生成的
    [root@yangyouwei ~]# rpm -qf /etc/ssh/ssh_config 
    openssh-clients-5.3p1-117.el6.x86_64

    查询已经安装的软件包是由哪些文件构成的。一个列表。后面跟的是包名
    [root@yangyouwei ~]# rpm -ql tree
    /usr/bin/tree
    /usr/share/doc/tree-1.5.3
    /usr/share/doc/tree-1.5.3/LICENSE
    /usr/share/doc/tree-1.5.3/README
    /usr/share/man/man1/tree.1.gz

    查询rpm包内都有哪些文件
    [root@yangyouwei ~]# rpm -qpl /media/CentOS_6.8_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm
    /usr/bin/tree
    /usr/share/doc/tree-1.5.3
    /usr/share/doc/tree-1.5.3/LICENSE
    /usr/share/doc/tree-1.5.3/README
    /usr/share/man/man1/tree.1.gz

校验 导入公钥 rpm –import /media/CentOS6.8Final/RPM-GPG-KEY-CentOS-6 查询安装的公钥,用于来源和完整性校验

    rpm包校验
    [root@yangyouwei ~]# rpm -K /media/CentOS_6.8_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm
    /media/CentOS_6.8_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

    查询已经安装导入的key
    [root@yangyouwei ~]# rpm -qa gpg-pubkey*
    gpg-pubkey-c105b9de-4e0fd3a3

原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/37893

(0)
yywyyw
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • Linux 基础(三)——用户管理&正则表达式

    1、  列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who | cut -d " " -f1 | uniq 2、  取出最后登录到当前系统的用户的相关信息。 last -1 | cut -d " " -f1 | head -1 | id 3、  …

    Linux干货 2016-11-08
  • Linux文件权限及ACL

    1、文件权限:          文件的权限主要针对三类对象进行定义:                owner:属主,u表示  …

    Linux干货 2016-08-05
  • LVM 逻辑卷管理

    一、概述: LVM: logical Volumn Manager  LVM是建立在硬盘和分区之上的一个逻辑层。可以将多个物理分区整合起来,无需停机,可以对文件系统的大小进行调整。同时,还提供快照功能 二、概念及实现过程: PE :每一个物理卷PV被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的…

    Linux干货 2015-10-05
  • 计算机操作系统简史 以及 终端类型

    计算机及操作系统发展史 1.计算机的主要部件 :ENIARC         Cpu:运算器  控制器(控制内存,IO总线)      存储器是寄存器(锁存数据)  缓存(加速功能)    内存:ram (random access mem…

    Linux干货 2016-10-19
  • 8.16

    for 循环是相对比较简单的循环,任何一个循环里面都可以嵌套循环,用for可以解决简单逻辑上的任何循环 。 有两种基本格式:for i in " ";do         或者dor((i=0;i<=9;i++))可以嵌套if或者while等循环 if循环。最重要的是判断的条件,if意为如果什…

    Linux干货 2016-08-19
  • Centos6系统救援模式

    CentOS 6系统救援模式 在学习了CentOS 5、6系统启动流程与启动故障排除之后,为了加深印象进行了如下破坏性尝试。 删除/boot目录与/etc/fstab文件后尝试修复系统 1. 首先是第一步删除/boot目录与/etc/fstab 删除/boot /etc/fstab 可以看到虽然boot目录无法删除但是目录中的文件已经全部删掉了。 2. 重新…

    Linux干货 2016-11-24