程序包管理:

常见的软件包管理器

 Debian系列:dpkg (DebianPackager) 管理 以.deb 结尾的软件包。

   “Debian”的“Linux ”发行版都使用 “dpkg”,例如 “Ubuntu”、“Knoppix ”等

 RedHat系列: rpm ( RPM isPackage Manager ) 管理 以.rpm 结尾的软件包。

     以前是RedHat Package Manager的缩写,现在包括OpenLinux、S.u.S.E.以及TurboLinux等

     Linux的分发版本都有采用该包管理器,算是公认的行业标准了。

程序包的组成部分:

   (1)二进制程序:可执行文件

通常安装在 /bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin, /usr/local/sbin 目录之下

   (2)库文件:程序的运行依赖于库文件,Linux的核心库是glibc,某些软件也会将自己的核心文件封装成库文件

通常安装在 /usr/lib, /usr/lib64, /var/lib, /usr/local/lib 目录下分为静态库和动态库,静态库通常以".a"结尾,动态库通常以".so"结尾

   (3)配置文件:通常是纯文本文件,用来定义程序的特性。

通常存放在:/etc, /usr/etc, /usr/local/etc 或指定的路径下(配置文件一般无需额外配置)

   (4)帮助文件:man手册、info文件、README

man 的配置文件: /etc/man.config

包管理器的功能:
   打包、安装、卸载、升级、查询、校验;

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:major.minor.release——主版本号.次版本号.发行号

         主版本号:是程序的主要功能发生了巨大的改变时才使用

         次版本号:是在程序的部分功能有重大改变时使用;

         发行号:是在修复了一些bug,调整了一些属性后进行的升级。

     RELEASE: rpm的制作发行号和源程序本身没有关系,并且这个Release号可能会标明所适用的操作系统平台。

        ARCH:只运行在那种系统架构上。i686、x86_64、amd64

RPM分包机制:

     testapp-VERSION.tar.gz

     核心包:testapp-VERSION
     支包:testapp-devel-VERSION

     VERSION:major.minor.release
      base-4.2.4.tar.gz

     包和包之间:有可能存在依赖关系:

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

获取rpm包方式:
   1、发行版提供的程序包;
   2、Fedora-EPEL
   3、项目的官方站点
   4、搜索引擎
    
http://rpmfind.net
    http://rpm.pbone.net
    http://pkgs.org

   CentOS识别光盘用的设备文件:/dev/cdrom,

基于rpm命令实现程序包管理
  安装:
       rpm {-i|--install} [install-options] PACKAGE_FILE ...
        -i:install
        -v:显示详细过程,-vv, -vvv
        -h:用#号显示程序包安装进度

     每个rpm包都提供一个或多个capabilities

    --nodeps:忽略依赖关系安装
    --replacepkgs:重装程序包

实例:安装程序包

[root@centos6 Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]
[root@centos6 Packages]# rpm -q zsh
zsh-4.3.11-4.el6.centos.x86_64

实例:忽略依赖关系安装

[root@centos6 Packages]# rpm -ivh php-5.3.3-40.el6_6.x86_64.rpm 
error: Failed dependencies:
php-cli(x86-64) = 5.3.3-40.el6_6 is needed by php-5.3.3-40.el6_6.x86_64
php-common(x86-64) = 5.3.3-40.el6_6 is needed by php-5.3.3-40.el6_6.x86_64
[root@centos6 Packages]# rpm -ivh --nodeps php-5.3.3-40.el6_6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:php                    ########################################### [100%]

实例:不卸载重新安装程序包  

[root@centos6 Packages]# rpm -ivh php-5.3.3-40.el6_6.x86_64.rpm 
error: Failed dependencies:
php-cli(x86-64) = 5.3.3-40.el6_6 is needed by php-5.3.3-40.el6_6.x86_64
php-common(x86-64) = 5.3.3-40.el6_6 is needed by php-5.3.3-40.el6_6.x86_64
[root@centos6 Packages]# rpm -ivh --nodeps php-5.3.3-40.el6_6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:php                    ########################################### [100%]

  升级:

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

        -Uvh: 如果有旧版程序包,则升级之;如果没有,则安装之;
        -Fvh: 如果有旧版程序包,则升级之;如果没有,则不安装;

        --nodeps:忽略依赖关系
        --oldpackage:降级;安装现有程序包的旧版本程序包时使用
        --force:强制

   卸载:
         rpm {-e|--erase} [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ... 

实例:卸载程序包

[root@centos6 Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]
[root@centos6 Packages]# rpm -q zsh
zsh-4.3.11-4.el6.centos.x86_64
[root@centos6 Packages]# rpm -e zsh
[root@centos6 Packages]# rpm -q zsh
package zsh is not installed

  查询:

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

         查询选项:
          -qa: 查询本机已经安装的所有程序包;

         -qf:/PATH/TO/SOMEFILE: 查询此处的文件由哪个程序包安装生成;

          -qc: 查询指定程序包安装生成的配置文件

         -qd: 查询指定的程序包安装生成的文档

         -qi: 查询指定的程序包的相关信息;

          -ql: 查询程序包安装生成的所有文件的列表;

         -q --scripts:查询程序包相关的脚本:

           preinstall: 安装前脚本
           postinstall:安装后脚本
           preuninstall: 卸载前脚本
           postuninstall: 卸载后脚本

         -p: 查询针对是未安装的程序包文件;

实例:查询本机已经安装的程序包

[root@centos6 Packages]# rpm -qa | grep php
php-common-5.3.3-46.el6_6.x86_64
php-cli-5.3.3-46.el6_6.x86_64

实例:查询此处的文件由哪个程序包安装生成

[root@centos6 Packages]# rpm -qf /etc/fstab 
setup-2.8.14-20.el6_4.1.noarch

实例:查询指定程序包安装生成的配置文件

[root@centos6 Packages]# rpm -qc zsh-4.3.11-4.el6.centos.x86_64
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc

实例:查询程序包安装生成的所有文件的列表

[root@centos6 Packages]# rpm -ql zsh-4.3.11-4.el6.centos.x86_64 | wc -l
927

实例:查询指定的程序包安装生成的文档

[root@centos6 Packages]# rpm -qd zsh-4.3.11-4.el6.centos.x86_64 | wc -l
35

实例:查询程序包相关的脚本

[root@centos6 Packages]# rpm -q --scripts  zsh-4.3.11-4.el6.centos.x86_64
postinstall scriptlet (using /bin/sh):
if [ ! -f /etc/shells ] ; then
    echo "/bin/zsh" > /etc/shells
else
    grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
fi
if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \
  --entry="* zsh: (zsh).An enhanced bourne shell."

实例:查询程序包的描述信息

[root@centos6 Packages]# rpm -qi zsh
Name        : zsh                          Relocations: (not relocatable)
Version     : 4.3.11                            Vendor: CentOS
Release     : 4.el6.centos                  Build Date: Fri 24 Jul 2015 05:41:25 PM CST
Install Date: Sun 13 Sep 2015 01:52:52 PM CST      Build Host: c6b8.bsys.dev.centos.org
Group       : System Environment/Shells     Source RPM: zsh-4.3.11-4.el6.centos.src.rpm
Size        : 5283457                          License: BSD
Signature   : RSA/SHA1, Sat 25 Jul 2015 04:41:32 AM CST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://zsh.sunsite.dk/
Summary     : A powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor.  Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements.  Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.
Name:软件名称      
Relocations:在安装时是否可指定安装路径(重定位)
Version:版本号                       
Vendor:提供商
Release:rpm的发行号
BuildDate:rpm包的制作日期
InstallDate:安装时间
Build Host:在哪个系统上制作的rpm包                                                               
Group:包组        
SourceRPM:源码的rpm包
Size:包大小
License:许可证
Signature:数字签名(验证来源合法性和包完整性)
Packager:包的制作者
URL:获取源码的网址
Summary:简要说明
Description:略详细的说明

  校验:

         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 mTime differs文件最近一次修改的时间戳发生了改变
         P caPabilities differ

  包校验:
       
来源合法性验证:非对称加密(使用成对的公钥和私钥解密)
       完整性验证:单向加密

       导入密钥:rpm --import /PATH/TO/KEY_FILE
       校验:rpm -K /PATH/TO/RPM_FILE

例:导入公钥验证软件包的来源合法性和完整性

[root@centos6 Packages]# rpm --import /root/package/RPM-GPG-KEY-CentOS-6
[root@centos6 Packages]# rpm -K zsh-4.3.11-4.el6.centos.x86_64.rpm 
zsh-4.3.11-4.el6.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

前端管理器

     Debian:apt-get

     RedHat:yum (Yellowdog Update Modifed)

     dnf:下一代解决依赖关系的程序包前端管理器

YUM: Yellowdog Updater Modified

  yum repositories:YUM 仓库
  文件服务器:
   
ftp://hostname/PATH/TO/REPO
   http://hostname/PATH/TO/REPO
   file:///PATH/TO/REPO

  yum程序的配置文件:
  /etc/yum.conf

[root@CentOS-6 ~]# cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever   #缓存目录
keepcache=0   #删除缓存中已安装的rpm包
debuglevel=2   #调试级别
logfile=/var/log/yum.log  #日志文件
exactarch=1   #必须跟当前主机的版本完全精确匹配才安装
obsoletes=1   #过去的,废弃的
gpgcheck=1   #是否检验其来源合法性及数据包完整性
plugins=1   #是否支持插件
installonly_limit=5   #
bugtracker_url=   #追踪bug保存的位置
distroverpkg=centos-release

  定义全局配置:对所有仓库都适用的配置

  /etc/yum.repos.d/*.repo
   一个文件通常用于一个或一组功能相近或相关的仓库

   定义一个仓库指向:
    [REPO_ID]
    name=仓库描述信息
    baseurl=仓库访问路径
    # mirrorlist=SCHEME://HOSTNAME/PATH/TO/MIRROR_LIST_FILE
    enabled={1|0}是否生效
    gpgcheck={1|0}是否校验
    gpgkey=公钥文件(可以放在本地也可放在远程服务器)
    cost=定义次仓库的开销默认为1000

   定义仓库指向可用变量:
    $releasever: 引用当前系统的主版本号;
    $basearch: 当前系统的基本架构;
     i386, i486, i586, i686: i386

    http://mirrors.magedu.com/CentOS/$releasever/os/$basearch


 yum命令:
  yum [options] [command] [package ...]

   命令:
    安装:install
    卸载:remove
    升级:update
    查询:
     check-update:检查可升级的程序包

     info :列出包的详细信息
     search KEYWORD:基于关键字搜索程序包
     list all|installed|availiable:列出rpm包

     (列出所有|列出已安装的|尚未安装可以安装的包)
     provides /PATH/TO/SOMEFILE: 查询指定文件由哪个包安装生成
    重新安装:reinstall
    降级:downgrade
    清理缓存:clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
    生动生成缓存:makecache

    包组:
     grouplist:列出所有包组
     groupinfo "GRP_NAME":显示包组相关信息
     groupinstall "GRP_NAME":安装包组
     groupremove "GRP_NAME":卸载包组

    三个跟开发相关的包组:

     Desktop Platform Development :有图形程序时需安装此组

     Server Platform Development :服务器平台开发包组

     Developmetn tools:开发包组

    仓库:

     repolist [all|enabled|disabled]
     repoinfo [all|enabled|disabled]

 如何使用光盘当做本地仓库:
  挂载光盘至某目录
  定义仓库,使用
file:///指明其访问路径;

 创建本地仓库:
  yum install createrepo

  createrepo /PATH/TO/RPMFILES/


实例一:建立阿里云YUM仓库

[root@centos6 yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak 重命名之前仓库
[root@centos6 yum.repos.d]# vim CentOS-Base-aliyun.repo 进入vi编辑器新建仓库
[CentOS6Base]   
name=CentOS 6 aliyum
baseurl=http://mirrors.aliyun.com/centos/6/os/x86_64/
enable=1
gpgcheck=0
[root@centos6 yum.repos.d]# yum repolist  查询系统上可使用的仓库
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
CentOS6Base                                                        | 3.7 kB     00:00     
CentOS6Base/primary_db                                             | 4.6 MB     00:01     
repo id                                 repo name                                   status
CentOS6Base                             CentOS 6 aliyum                             6,575
repolist: 6,575

实例二:安装和卸载程序包

[root@centos6 yum.repos.d]# yum install finger
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package finger.x86_64 0:0.17-40.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================
 Package           Arch              Version                 Repository              Size
==========================================================================================
Installing:
 finger            x86_64            0.17-40.el6             CentOS6Base             22 k
Transaction Summary
==========================================================================================
Install       1 Package(s)
Total download size: 22 k
Installed size: 27 k
Is this ok [y/N]: y
Downloading Packages:
finger-0.17-40.el6.x86_64.rpm                                      |  22 kB     00:00     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing : finger-0.17-40.el6.x86_64                                              1/1 
  Verifying  : finger-0.17-40.el6.x86_64                                              1/1 
Installed:
  finger.x86_64 0:0.17-40.el6                                                             
Complete!
[root@centos6 yum.repos.d]# yum remove finger
Loaded plugins: fastestmirror
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package finger.x86_64 0:0.17-40.el6 will be erased
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================
 Package           Arch              Version                Repository               Size
==========================================================================================
Removing:
 finger            x86_64            0.17-40.el6            @CentOS6Base             27 k
Transaction Summary
==========================================================================================
Remove        1 Package(s)
Installed size: 27 k
Is this ok [y/N]: u^Hy
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Erasing    : finger-0.17-40.el6.x86_64                                              1/1 
  Verifying  : finger-0.17-40.el6.x86_64                                              1/1 
Removed:
  finger.x86_64 0:0.17-40.el6                                                             
Complete!

实例三:使用光盘建立本地YUM仓库

挂在光驱至某目录

定义仓库使用file:///指明访问路径

1、插入光盘并挂载
[root@centos6 ~]# mount /dev/cdrom /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
2、在/etc/yum.repo.d/目录下创建repo配置文件local-media.repo,并编辑
[CentOS_6_ISO]
name=CentOS 6.7 x86_64 release iso file
baseurl=file:///media/cdrom/
enabled=1
gpgcheck=1
gpgky=file:///RPM-GPG-KEY-CentOS-6
3、使用yum repolist验证
[root@centos6 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
CentOS_6_ISO                                                       | 4.0 kB     00:00 ... 
CentOS_6_ISO/primary_db                                            | 4.6 MB     00:00 ... 
repo id                        repo name                                            status
CentOS6Base                    CentOS 6 aliyum                                      6,575
CentOS_6_ISO                   CentOS 6.7 x86_64 release iso file                   6,575
repolist: 13,150