一、编程语言与操作系统:
    应用程序
    ____________________
    |lib call |            |
    |-------------------|
    |system call        |
    |———————————----————|
    |各种硬件            |
    ————————————————————|
   

    API:application program interface
    ABI:application binary interface
        Api应用层级兼容,未必abi层次也兼容,有些程序对二进制的识别格式是不相同的
        
        UNix-like:ELF格式的程序
        windows:exe,msi
            linux:wine模拟windows库
            windows:Cywin虚拟出linux运行环境
    系统级开发:C/C++:httpd,vsftpd,nginx
        go编程语言:新贵
        C/C++编程依赖于系统上的标准库
    应用级开发:java/Python/perl/ruby/php
        java:hadoop,hbase,(jvm)运行环境
        Python:openstack 云管理平台,(pvm)
        perl:(perl)perl的解释器
        ruby:(ruby)解释器/虚拟机{运行环境}
        php:(php)
        //一般解释器或者虚拟机{jvm,pvm} 使用C/C++编写
    
        php:世界上最好的语言
c/C++程序格式:    
    源代码:文本格式的程序代码
        编译开发环境:编译器、头文件、开发库
    二进制格式:文本格式的代码-->编译器-->二进制格式(二进制程序、库文件、配置文件)
java/python
    源代码:编译成能够在其虚拟机(jvm/pvm)上运行的格式
        开发环境:编译器、开发库
    二进制:
    
    项目构建工具://不再需要考虑程序编译主次关系,由项目构建关系负责,项目构建工具借助于配置文件实现
        c/c++:make
        java:maven

    程序包管理器:
        源代码 --> 目标二进制格式 -->组织成为一个或有限几个“包”文件;
            安装、升级、卸载、查询、校验等操作
        程序包管理器:
            debian:kali,ubuntu //dpt,dpkg , ".deb"
            redhat:rhel,centos,fedora //redhat package manager,rpm , ".rpm" //perl-C现在使用的是C语言写的
                    //rpm:rpm is package manager;成为标准
            slckware:S.u.S.E:  //rpm,suse的rpm和rhel的是不兼容的,suse为rpm开发了一个重要的库,后期被rhel收纳
                     //rpm:".rpm" 命令rpm
            Gentoo: //采用了freebsd的机制,ports的包机制
            Archlinux //轻量级,
    源代码:name-VERSION.tar.[xz,gz,bz2]
        VERSION:major-minor-release
            major:重大改变
            minor:局部改变
            release:修复bug,小串代码改变
    rpm包命令格式:
        vsftpd-3.0.2-10.el7.x86_64.rpm
        name-VERSION-release.arch.rpm
        release:是制作rpm包的次数
        VERSION.release是源代码的release
        arch:architecture:i386,x64(amd64),ppc(powerpc),noarch(通用平台)
            i386:支持较老版本的32bit cpu
            i686:支持较新版本的32bit cpu
        
        拆包:
            redis-3.0.2.tar.gz--> redis.3.0.2-1.el7.x86_64
            //把一个包的多种功能,拆成多个部分,按需组织rpm包
            //主包和分支包
            主包:name-VERSION-release.arch.rpm
            支包:name-function-VERSION-release.arch.rpm
                function:devel,utils(工具程序),libs,plugins(插件)
    依赖关系:每个程序包的功能都很简单,包之间存在很复杂的依赖关系
        x,y,z
            x-->y,z
                y-->a,c,b
                c-->Y
        前端工具:自动解决依赖关系
            yum:rpm包管理器的前端工具
            apt-get(apt-cache):deb包
            zypper:suse上的rpm包管理器
            dnf:Fedora 22+ 系统上的rpm包管理器的前端工具
    程序包管理:
        功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等操作
        1.程序包的组成清单(每个程序包单独实现)
            文件清单
            安装或卸载时运行的脚本
        2.数据库(公共)
            程序包的名称和版本
            依赖关系
            功能说明
            安装生成的各文件路径及校验码信息
            /var/lib/rpm/ rpm数据库所在
            
二、获取程序包的途径:
    1.系统发行版的光盘或者官方的文件服务器
        http://mirrors.aliyun.com
        http://mirrors.sohu.com
        http://mirrors.163.com
    2.项目官方站点
        apache官网:www.apache.org
        zabbix:www.zabbix.com
    3.第三方组织
        (a)EPEL:
            mirrors.aliyun.com/epel/7/x86_64
        (b)搜索引擎
            pkgs.org
            rpmfind.net
            rpm.pbone.net
    4.自己动手,丰衣足食
            
    建议:校验,检查其合法性
        来源合法性:
        程序包的完整性:

三、Centos上rpm命令管理程序包
(1)安装
    安装,升级,卸载,查询和校验,数据库维护
     rpm {-i|--install} [install-options] PACKAGE_FILE ...
    -i :install
        -v  verbose通用选项,显示过程
        -vv 更详细
        -h 以hash输出进度条
        --test 仅仅是检查一下,测试不安装
        --nodeps //忽略依赖关系,no dependce
        --replacepkgs //替代安装
        --noscripts //有些程序包安装过程中,可能需要运行一段自带脚本,
        rpm可以自带脚本:
            四类:
                preinstall:安装之前,%pre
                postinstall:安装完成之后,%post
                preuninstall:卸载开始前,%preun
                postuninstall :卸载完成之后,%postun
            --noscripts
            --nopre
            --nopost
            --nopreun
            --nopostun
        --nosignature //来源合法性,不检查包签名信息
        --nodigest //不检查包完整幸信息,头文件摘要
    -U :update,-F --freshen//使更新
    -e :--erase
    -q:--query
        -l :list生成文件
    -V:--verify校验
    数据库维护:
        --builddb,--initdb
 
(2)升级
    -U update
    Uvh /Fvh
    rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... //和安装一样
        -U 升级或者安装,有没有老版本,都会安装
        -F 升级,有老版本才会安装
        --oldpackage :降级安装老的程序包,不兼容
        --force:强制升级
        
        其他和rpm -ivh 一样
    注意:
        (1)不要对内核做升级操作,更新内核需要重启系统
            //linux支持多内核版本并存,因此,直接安装新版本内核即可
        (2)如果某源程序包的配置文件,安装后曾被修改过,升级时,新版本的程序提供的同一个配置那文件不会覆盖原有的
            配置文件,而是把新版本的配置文件,重命名后(filename.rpmnew)后,提供
        
(3)卸载
    -e
        --allmatches //假如存在多版本的话,多版本一并删除
        --nodeps  //忽略依赖关系
        --test  //dry run 仅仅测试
        --noscripts //不执行脚本
        rpm -e zsh //pack_name zsh即可,数据库中有文件保存
        rpm -ivh 文件名
(4)查询

     rpm {-q|--query} [select-options] [query-options]
    -q  zsh //查询指定包zsh是否安装
        select-options:
            -a,--all 不加选项,查询所有已经安装的包
                rpm -qa |grep zsh
            -f /etc/fstab 查询文件的安装包
            -g,--group 组名//查询指定包组中包含的包
            -p,--packaeg package_file:实现查看未安装包的,结合query-optionss实现
                rpm -qpl zsh-5.0.2-14.el7.x86_64.rpm //查询未安装程序包的安装能够生成文件
            --wahtprovice CAPABILITY//查询提供某种能力的包
                rpm -q --whatprovide 'config(bash)'
            --whatrequires CAPABLITY //查询指定的CAPABILITY被哪个程序包所依赖
                
        query-options
            --changelog //查询rpm包的changelog,不是源码的
                rpm -q --changelog zsh //查看zsh的改进日志
                
            -l,--list //程序包安装生成的所有文件列表
                rpm -ql zsh
            -i info,查询程序包相关信息,版本号,大小,所属的包组,等
                rpm —qi bash
            -c ,--configfiles:查询指定的程序包的配置文件
                rpm -qc  bash
            -d,--docfile :查询指定的程序包的帮助文档
                rpm -qd bash
            --provides:列出指定的程序包提供的CAPABILITY
                rpm -q --provides bash //bash提供的
                rpm -q --whatprovides 'config(bash)'
            -R requires//查询指定程序包的所依赖的程序包
                rpm -qR bash
            --scripts //查询脚本
                rpm -q --scripts bash
                rpm -qp --scripts zsh-5.0.2-14.el7.x86_64.rpm
        ql,qf,qc,qi,qd    //qf文档的产生源
(5)校验
    rpm {-V|--verify} [select-options] [verify-options]
    -V //rpm -V zsh //安装完成后,校验

       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 mTime differs
       P caPabilities differ

        rpm -ql zsh //随意修改其中一个文件
        rpm -V zsh //就能看到效果
        select-options:和查询的select-options一样
            -a,-f,-g,-p
        verify-options:
            --nodeps 不校验依赖
            --nodigest 不校验包头,
            --noscripts 不检查脚本
            --nofiles 不检查
            --nosignature 不检查包头签名信息
        //默认检查所有属性
         rpm -V --nofiles zsh
(6)包来源合法性验证和完整性验证
    来源合法性验证:
    数字签名:非对称加密:一个公钥,一个私钥
        包的制作者,
        1.首先使用单项加密,计算出包的特征码,定长输出
        2.然后再用自己的私钥加密特征码,这叫数字签名 ,
        3.把加密后的特征码附加到包后    
    //只要拿到公钥,就能解密
        中间者:能够解密特征码,因为能拿到对方公钥,但是不能再次加密,因为没有作者的私钥
    //用户拿到作者的公钥,进行解密特征码,解密成功,则认为来源合法
    //我用同样的方法,进行单项加密计算特征码,一样则证明包内容没有修改过//完整性
    如何拿到对方的公钥:
        1.从网上下载,不可靠
        2.互联网上是使用CA来实现,可靠手段拿到对方公钥
    rpm --import /mnt/RPM-GPG-KEY-CentOS7 //导入公钥
        /etc/pki/rpm-gpg/ 导入到此地
        对于CentOS发行版:rpm --import
    rpm -ivh zsh-***** //自动进行校验操作
    rpm -K zsh-5.03..... //手动验证
    
    验证:
        安装此组织签名的程序时,会自动执行验证
        手动验证:rpm -K PACKAGE_FILE
        1
    数字签名:保证来源合法性和数据完整性
(7)数据库重建
        rpm管理数据库路径:/var/lib/rpm/
            查询操作:就是基于该数据库查询
            Centos6:man rpm //rpm --initdb|--rebuilddb
            Centos7:man rpmdb
        rpmdb
            --initdb  初始化db,当前无任何数据库时创建一个新的,当前有,不执行任何操作
            --rebuildb 重建db,重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建
            --dbpath 指定db路径
            rpmdb --initdb --dbpath=/tmp/rpm
            
四、rpm命令小结

linux程序包管理器,rpm包管理器

    安装:rpm -ivh ,--nodeps,--replacepkgs
    卸载:-e,--nodeps
    升级:-U|-F vh //F只用于升级,--nodeps,--oldpackage
    查询:-q,-a,f,i,qd,qc,--script,changelog,provides/whatprovides,requires/whatrequires
    校验:-V,
    验证合法性:--import,-K手动验证,--nodigest,--nosignature
    数据库重建:rpmdb --initdb --rebuilddb