包管理器的功能:打包,包管理(安装,升级,卸载,查询及验证)
       打包:将源码包中的各种组成文件放在一个单一的归档文件中
       安装:相当于将打包文件中的各个文件放到对应的目录中去
       卸载:将安装的文件收集起来,然后删除
       升级:更新已经安装的包,新版本替换老版本
       查询:查询程序包的信息
       验证:验证包安装后生成的文件是否被改变
   
Linux常用的包管理器
       dpkg:debian 下的包管理器
       rpm:redhat package manager
                RPM is Package Manager


程序包的组成部分及存放目录:
        二进制程序:一般存放于/bin,/sbin,/usr/bin,/usr/sbin
        库文件:一般存放于/lib64,/usr/lib64
        配置文件:一般存放于/etc
       帮助文件:manual,info-->一般存放于/usr/share/doc, /usr/share/man
      
rpm包:
       rpmbuild: 打包工具,依赖specs文件打包,生成 .rpm 包
       10:5,3,2
               rpm包制作时分包机制:按照功能划分
                       testapp-VERSION.tar.gz,源码压缩程序包,做成rpm包后被分成不同功能的.rpm包
                       核心rpm包命名格式:testapp-VERSION-RELEASE.ARCH.rpm
                       支rpm包命名格式:testapp-devel-VERSION-RELEASE.ARCH.rpm
                       VERSION的格式一般为:major.minor.release
                       如:bash-4.2.4.tar.gz
       
rpm包的命名机制解释:
        name-VERSION-RELEASE.ARCH.rpm
                bash-4.2.4-1.el7.x86_64.rpm
                bash-devel-4.2.4-1.el7.x86_64.rpm
       VERSION:如4.2.4 ,包括应用源程序的主版本,次版本,和release
       RELEASE:如1.el7 ,rpm 包制作者的release版本
       ARCH:如x86_64 为平台架构
    

包和包之间,有可能存在依赖关系:
     x包--->Y包 
         rpm数据库目录:/var/lib/rpm/
   
如何获取rpm包:
   1、发行版提供的程序包
   2、Fedora-EPEL项目仓库提供的程序包
   3、项目的官方站点,也通常提供rpm包
   4、搜索引擎,第三方发行商,可能被植入恶意程序,使用的时候要特别小心
        http://rpmfind.net
        http://rpm.pbone.net
        http://pkgs.org
     
CentOS识别光盘用的设备文件:/dev/cdrom
 
基于rpm命令实现程序包管理:
        安装
        rpm {-i|--install} [install-options] PACK_FILES...
             -i:表示安装
             -v:显示详细过程,vv,vvv显示的信息更详细
             -h:安装过程打印#号和进度百分比
             每个rpm包都提供一个或多个capabilities,若某个包安装时,依赖其它包,则需要先安装被依赖的包
             --nodeps:安装或升级之前不做包依赖性检测,但强行安装完后软件包不一定能正常工作
             --replacepkgs:如果包已经存在,可以重装程序包, rpm -ivh --replacepkgs name-VERSION-release.ARCH.rpm


       升级
       rpm {-U|--upgrade} [install-options] PACK_FILES...
       rpm {-F|--freshen} [install-options] PACK_FILES...
             -Uvh:如果有老版本的包,怎升级之,如果没有,则安装
             -Fvh:如果有老版本的包,怎升级之,如果没有,则不安装
     
             --nodeps:忽略包的依赖关系强行升级安装,安装升级之前不做包依赖性检测
             --oldpackage:降级,安装一个比现有版本低的程序版本, rpm -Uvh --oldpackage *.rpm, 降级不能用-Fvh
             --force:强制升级,若被升级的程序包,被其他程序包依赖,可能不可以直接升级。
                       Same as using --replacepkgs, --replacefiles, and --oldpackage

       卸载
       rpm {-e|--erase} [--nodeps] [--noscripts] [--notriggers] [--test] PACK_NAME...
             --nodeps
             --noscripts                      do not execute package scriptlet(s)
             --notriggers                     do not execute any scriptlet(s) triggered by this package
     
        --test                  don't install, but tell if it would work or not,可用于安装,升级,卸载过程中的测试,不进行实际的操作
   
     查询
      rpm {-q|--query} [select-options] [query-options]
              select选项:
             -qa:查询本机安装的所有程序包
             -qf /PATH/TO/SOMEFILE:查询此处的文件是由哪个程序包安装生成
     
             -qc PACK_NAME:查询指定程序包安装生成的配置文件
             -qd PACK_NAME:查询指定程序包安装生成的文档
             -qi PACK_NAME:查询已安装的指定程序包相关信息
             -ql PACK_NAME:查询程序包安装生成的所有文件列表
             -qR PACK_NAME:查询安装包所依赖的功能文件
                      -R, --requires    List capabilities on which this package depends
             -q --provides PACK_NAME:  查询某个包提供的capabilites
                      --provides        list capabilities that this package provides
             -q --scripts PACK_NAME:查询程序包相关的脚本
                      preinstall:安装前脚本
                      postinstall:安装后脚本
                      preuninstall:卸载前脚本
                      postuninstall:卸载后脚本
      
             -p:查询针对的是*.rpm程序包文件
   
    验证:检查程序包安装的文件是否被改变
    rpm {-V|--verify} [select-options] [verify-options] PACK_FILE...
    默认结果一般显示以下内容:
        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 --import /PATH/TO/KEY_FILE ,KEY_FILE一般在/etc/pki/rpm-gpg目录下
               校验:rpm -K /PATH/TO/RPM_FILE
                    [root@apache ~]# rpm -K ftp-0.17-53.el6.x86_64.rpm
                    ftp-0.17-53.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
   
YUM:Yellowdog Updater Modifier
         yum repositories:
         文件服务器:
                 ftp://hostname/PATH/TO/REPO
                 http://hostname/PATH/TO/REPO
                 file:///PATH/TO/REPO


         yum程序的配置文件
                  /etc/yum.conf
                           定义全局配置,对所有仓库都使用的配置
                  /etc/yum.repos.d/*.repo
                           一个文件通常用于一个或一组功能相关的仓库
   
           定义一个仓库指向:
                [REPO_ID]
                name=
                baseurl=
                # mirrorlist=SCHEME://HOSTNAME/PATH/TO/MIRROR_LIST_FILE
                enable={1|0},1表示启用仓库
                gpgcheck={1|0},是否校验包,一般只要上面4行即可
                gpgkey=:当gpgcheck=1时,要该项指定用于校验的gpgkey
                cost=:用户指明仓库的开销
    
           定义仓库指向可用的变量
                $releasever:引用当前系统的主版本号
                $basearch:引用当前系统的基本架构
                     如i386,i486,i586,i686,x86_64
            示例:http://mirrors.edu.com/CentOS/$releasever/os/$basearch
    
         yum 命令:
         yum [options] [command] [packages]
         软件包命令:
                安装:install
                卸载:remove
                升级:update
                         yum -y update:升级所有包,改变软件设置和系统设置(有待验证),系统版本内核都升级
                         yum -y upgrade升级所有包,不改变软件设置和系统设置,系统版本升级,内核改变
                查询:info
                         search KEYWORD
                         list all | installed | available
                         provides /PATH/TO/SOMEFILE:查询指定文件由那个安装包生成
                重行安装:reinstall
                降级:downgrade
                清理缓存:clean all
                生成缓存:makecache
    
       包组命令:
                 grouplist: 列出所有包组
                 groupinfo "GRP_NAME":显示某个包组信息
                 groupinstall "GRP_NAME":安装某个包组
                 grroupremove "GRP_NAME":删除组包

                 groupupdate "GRP_NAME":   升级组包
       仓库命令:
                  repolist [all|enabled|disabled]

     
使用光盘当作本地仓库:
          挂在光盘至某目录
          定义仓库,使用baseurl=file:///指明其访问路径
 

如何创建本地仓库,把下载的程序包组做成仓库:
          yum install createrepo
          createropo /PATH/TO/RPMFILES/
  
 DNF:yum 升级版,下一代包管理器