相关理论介绍


为什么需要RPM包来管理程序?

由于Linux真正可以执行的程序一定是二进制文件,因为机器只能识别二进制数字,而程序员在开发时多是使用高级语言进行编程的,所以要想这些程序能够在Linux上运行,源代码必须最终被编译成二进制文件。但是二进制应用程序的文件的构成也是复杂的,如果单独安装管理应用程序,并记录程序相关的文档,配置文件,会很不方便,所以需要对这些编译后的二进制文件打包处理,因此就有了RPM包和PRM包管理器。


二进制应用程序的组成部分:

    二进制文件:/bin, /sbin, /usr/bin, /usr/sbin

    库文件:/linb, /lib64, /usr/lib6

    配置文件:/etc

    帮助文件:manaul, info,README.txt, INSTALL.txt

    

常见程序包管理器有:

    debian:deb, dpt

    redhat: rpm, 

    rpm: Redhat Package Manager

wKioL1YHzlCDzPFOAADWXAgaMXY941.jpg

wKiom1YHzkmj83szAAGv5cF6cNM685.jpg


RPM程序包管理


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

1、程序的组成清单 (每个包独有)

    文件清单

    安装或卸载时运行的脚本

2、数据库(公共)

    程序包名称及版本

    依赖关系;

    功能说明;

    安装生成的各文件的文件路径及校验码信息;


管理程序包的方式:

    使用包管理器:rpm

    使用前端工具:yum, dnf


获取程序包的途径:

(1) 系统发的光盘或官方的服务器;

    CentOS镜像:

    http://mirrors.aliyun.com

    http://mirrors.sohu.com

    http://mirrors.163.com

(2) 项目官方站点,如apache官方站点www.apache.org

(3) 第三方组织:

    Fedora-EPEL

    搜索引擎:

    http://pkgs.org

    http://rpmfind.net

    http://rpm.pbone.net

RPM程序包管理器

RPM主要能实现对rpm包安装、升级、卸载、查询、校验等功能。 


安装:


rpm {-i|--install} [install-options] PACKAGE_FILE ...
    -ivh:安装包, v显示安装进度, 
    -ivvh: vv的作用是详细显示安装了哪些文件, 还有vvv
    --nodeps:忽略依赖关系强制安装, 可能导致软件功能不正常
    --test:测试安装,但不会正真安装;dry run模式
    --replacepkgs:强制重新安装
    --no scripts: 不执行程序包脚本片段
    %pre: 安装前脚本;--nopre
    %post: 安装后脚本; --nopost
    %preun: 卸载前脚本; --nopreun
    %postun: 卸载后脚本; --nopostun
    
[root@node2 Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm 
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]   
   1:zsh                    ########################################### [100%]  #显示进度
   
[root@node2 Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm         #重新安装
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]
   
[root@node2 Packages]# rpm -ivh php-5.3.3-38.el6.x86_64.rpm 
warning: php-5.3.3-38.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
error: Failed dependencies: #由于被依赖的包没有安装,所以导致安装失败,此时需先安装被其依赖的包,才可继续安装;或强制忽略依赖关系
php-cli(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64
php-common(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64

[root@node2 Packages]# rpm -ivh --nodeps  php-5.3.3-38.el6.x86_64.rpm             #强制忽略后,可以完成安装,但程序不一定可以正常运行
warning: php-5.3.3-38.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
   1:php                    ########################################### [100%]
   
[root@node2 Packages]# rpm -ivh --test  httpd-2.2.15-39.el6.centos.x86_64.rpm     #测试安装不会真正安装程序包
warning: httpd-2.2.15-39.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
package httpd-2.2.15-39.el6.centos.x86_64 is already installed

[root@node2 Packages]# rpm -q httpd-2.2.15-39.el6.centos.x86_64.rpm #测试安装并没有正真安装程序包
package httpd-2.2.15-39.el6.centos.x86_64.rpm is not installed

    

升级:

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
    upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”(有则升级,无则安装);
    freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作(有则升级,无则不管);
格式:选项和普通安装时的选项一致:

rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
    --oldpackage:降级;
    --force: 强行升级;


注意:

(1) 不要对内核做升级操作(防止升级失败后,无法启动系统);Linux支持多内核版本并存,因此,可直接安装新版本内核;

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


查询


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

[select-options]:查询选项

    -a: 所有
    -f: 查看指定的文件由哪个程序包安装生成
    -p: /PATH/TO/PACKAGE_FILE 针对未安装的程序包做查询操作
    --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
    --whatrequires CAPABILITY: 查询指定的CAPABILITY被谁所依赖

[root@node2 Packages]# rpm -qa  #可查看系统安装过的所有的包

[root@node2 Packages]# rpm -qf /etc/passwd    #查看/etc/passwd 由那个包提供
setup-2.8.14-20.el6_4.1.noarch

[root@node2 Packages]# rpm -q --whatprovides passwd    #查询那个包提供了passwd功能
passwd-0.77-4.el6_2.2.x86_64

[root@node2 Packages]# rpm -q --whatrequires passwd    #查询passwd功能被谁依赖
usermode-1.102-3.el6.x86_64

[root@node2 //]# rpm -q php-com      #查询php-com有否安装
package php-com is not installed

[root@node2 //]# rpm -ql -p /mnt/cdrom/Packages/php-common-5.3.3-38.el6.x86_64.rpm #指定路径,查找还未安装的php-common包
warning: /mnt/cdrom/Packages/php-common-5.3.3-38.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
/etc/php.d
/etc/php.d/curl.ini
/etc/php.d/fileinfo.ini
/etc/php.d/json.ini
/etc/php.d/phar.ini
/etc/php.d/zip.ini
/etc/php.ini
/usr/lib64/php

常用组合

 -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE

 -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...

 -qa


卸载

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE

[root@node2 ~]# rpm -q zsh
zsh-4.3.11-4.el6.centos.x86_64
[root@node2 ~]# rpm -e zsh    #卸载zsh程序包,如果成功卸载不会有任何输出
[root@node2 ~]# rpm -q zsh    #已经卸载成功
package zsh is not installed


校验

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


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

    完整性验正:SHA256

    来源合法性验正:RSA


数据库重建

[root@centos7 rpm]# ls /var/lib/rpm  #数据库相关文件
Basenames     __db.001  __db.003  Group       Name          Packages     Requirename  Sigmd5
Conflictname  __db.002  Dirnames  Installtid  Obsoletename  Providename  Sha1header   Triggername

rpm {--initdb|--rebuilddb}
    initdb: 初始化
      如果事先不存在数据库,则新建之;否则,不执行任何操作;
    rebuilddb:重建
      无论当前存在与否,直接重新创建数据库;
      
[root@node2 //]# echo '###' >> /etc/httpd/conf/httpd.conf #向httpd.conf末尾追加一行
[root@node2 //]# rpm -V httpd   #对比httpd安装包的元数据,查看httpd相关文档是否有变化
S.5....T.  c /etc/httpd/conf/httpd.conf  #S, 5,T 表明其有改动过

[root@node2 Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm #未导入gpgkey,安装时候会有warning提示信息
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]
   
[root@node2 Packages]# rpm --import /mnt/cdrom/RPM-GPG-KEY-CentOS-6 #导入gpgkey
[root@node2 Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm #不再有warning 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]


Yum介绍


RPM包管理器在安装rpm包时,如果有包的安装存在依赖关系,则得首先安装被其依赖的包,有时候包与包之间的依赖关系复杂,使用RPM来手动安装包,就变得非常痛苦和低效。

Yum(Yellowdog Updater Modified): 是一前端包管理软件,基于RPM包管理,能够从指定服务器下载PRM包,并且自动判断依赖关系,并自动安装所有被依赖的包,无需频繁的一次次下载,安装。


yum repository: yum repo(yum仓库)

存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata,所以repodata所在的目录就是yum 仓库要指向的路径)

每次启动yum命令时,都连接yum服务器调取取元数据(通过对比校验码确认是否有数据更改,决定是否要下载,更新本地过时的缓存)


yum客户端

配置文件:

/etc/yum.conf:为所有仓库提供公共配置 ,一般无需修改

/etc/yum.repos.d/*.repo:为仓库的指向提供配置,如果文件名字不以.repo结果,则该仓库不会被应用


仓库指向的定义

[repositoryID]  #仓库ID
name=name for this repository     #仓库名称
baseurl=url://path/to/repository/    #指定仓库的路径
enabled={1|0}  #1代表启用
gpgcheck={1|0}#是否检查源的合法性,验证签名信息
gpgkey=ur1 #指明密钥文件
enablegroups={1|0}
failovermethod={roundrobin|priority}
默认为:roundrobin,意为随机挑选;priority 从第一个开始查找
cost=
默认为1000
相关命令:
显示仓库列表:
    repolist [all|enabled|disabled]


显示程序包

list

# yum list [all | glob_exp1] [glob_exp2] [...]

# yum list {available|installed|updates} [glob_exp1] [...]

[root@node2 ~]# yum list httpd
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Installed Packages
httpd.x86_64                                                                               2.2.15-39.el6.centos                                                                                @LocalCD/$releasever
Available Packages
httpd.x86_64                                                                               2.2.15-45.el6.centos

安装程序包:

install package1 [package2] [...]

reinstall package1 [package2] [...]  (重新安装)


升级程序包:

update [package1] [package2] [...]

downgrade package1 [package2] [...] (降级)


检查可用升级:

check-update


卸载程序包:

remove | erase package1 [package2] [...]


查看程序包information:

info [...]


包组管理的相关命令:

* groupinstall group1 [group2] [...]

* groupupdate group1 [group2] [...]

* grouplist [hidden] [groupwildcard] [...]

* groupremove group1 [group2] [...]

* groupinfo group1 [...]


yum grouplist #查看源里面的所有包组

yum groupinstall "Development tools"

yum groupinfo "Development tools"


清理本地缓存

    yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] 

    常用yum clean all, yum通常会自动删除已安装的包的缓存


构建缓存:

makecache


yum的命令行选项

    --nogpgcheck:禁止进行gpg check;

    -y: 自动回答为“yes”;

    -q:静默模式;

    --disablerepo=repoidglob:临时禁用此处指定的repo,(即便配置文件中已经启用,命令模式优先于配置文件)

    --enablerepo=repoidglob:临时启用此处指定的repo;

    --noplugins:禁用所有插件;


练习:使用本地光盘搭建一个Yum仓库,利用Yum安装程序包


第一步:挂载光盘,找到Repodata目录

[root@node2 /]# mount /dev/cdrom /mnt/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@node2 /]# ls /mnt/cdrom/  #Repodata所在的目录就是仓库要指向的路径,里面定义了包与包之间的依赖关系
[root@node2 /]# ll /mnt/cdrom/
total 712
-r--r--r-- 2 root root     14 Oct 24  2014 CentOS_BuildTag
dr-xr-xr-x 3 root root   2048 Oct 24  2014 EFI
-r--r--r-- 2 root root    212 Nov 28  2013 EULA
-r--r--r-- 2 root root  18009 Nov 28  2013 GPL
dr-xr-xr-x 3 root root   2048 Oct 24  2014 p_w_picpaths
dr-xr-xr-x 2 root root   2048 Oct 24  2014 isolinux
dr-xr-xr-x 2 root root 686080 Oct 24  2014 Packages
-r--r--r-- 2 root root   1354 Oct 20  2014 RELEASE-NOTES-en-US.html
dr-xr-xr-x 2 root root   4096 Oct 24  2014 repodata
-r--r--r-- 2 root root   1706 Nov 28  2013 RPM-GPG-KEY-CentOS-6
-r--r--r-- 2 root root   1730 Nov 28  2013 RPM-GPG-KEY-CentOS-Debug-6
-r--r--r-- 2 root root   1730 Nov 28  2013 RPM-GPG-KEY-CentOS-Security-6
-r--r--r-- 2 root root   1734 Nov 28  2013 RPM-GPG-KEY-CentOS-Testing-6
-r--r--r-- 1 root root   3380 Oct 24  2014 TRANS.TBL
[root@node2 /]#


第二步:自定义xxx.repo文件,并配置,并禁用系统自带的.repo文件

[root@node2 yum.repos.d]# cat local.repo 
[LocalCD]
name="local CD"
baseurl=file:///mnt/cdrom #定义了yum仓库的路径
gpgcheck=no    #不做包合法性检查
enabled=1    #启用此yum源,如果没有此行,也会默认启用

[root@node2 yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-fasttrack.repo  CentOS-Media.repo  CentOS-Vault.repo  local.repo
[root@node2 yum.repos.d]# mv CentOS-Base.repo{,.bak}  #J将系统自带的仓库配置文件改名后,就可以停用它


第三步:检查yum仓库能否正常使用    

[root@node2 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
repo id                                                                      repo name                                                                       status
LocalCD                                                                      "local CD"                                                                      6,518
repolist: 6,518
[root@node2 yum.repos.d]# yum install zsh    #尝试yum install zsh, 出现如下信息即代表正常
Loaded plugins: fastestmirror, refresh-packagekit, security
Setting up Install Process
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package zsh.x86_64 0:4.3.10-7.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================================================
 Package                                  Arch                                        Version                                             Repository                                    Size
=============================================================================================================================================================================================
Installing:
 zsh                                      x86_64                                      4.3.10-7.el6                                        LocalCD                                      2.1 M
Transaction Summary
=============================================================================================================================================================================================
Install       1 Package(s)
Total download size: 2.1 M