程序包管理是在电脑中自动安装、配制、卸载和升级软件包的工具组合,在各种系统软件和应用软件的安装管理中均有广泛应用。      
在Linux发行版中,几乎每一个发行版都有自己的软件包管理系统。常见有: 管理deb软件包的dpkg以及它的前端apt(使用于Debian、Ubuntu)。 rpm以及它的前端yum(使用于Fedora)、前端ZYpp(使用于openSUSE)、 前端urpmi(使用于Mandriva Linux、Mageia)等。使用软件包管理系统将大大简化在Linux发行版中安装软件的过程。其他软件包管理系统有ArchLinux中使用的Pacman,Gentoo使用的基于源代码的Portage和Mac系统下的Homebrew等。

RPM程序包的命名规则      
Linux程序包管理_应用软件

Name:软件包名

Major:主版本号,如软件的框架做重大更改后才会修改

Minor:次版本号,如软件添加了某些新功能后才会修改

第一个Release:发行号,如软件修复了某些bug后才会修改

第二个Release:修订号,如源码未做过修改,发行商对发行的RPM包进行再次发行后才会修改

Arch:硬件平台架构


RPM程序包管理的主要功能是安装,升级,卸载,查询,验证等。

实验前准备

    实验环境为CentOS 6.6

    把光盘放入虚拟机,挂载光盘      

[root@localhost ~]# mkdir /media/cdrom/
[root@localhost ~]# mount -r /dev/cdrom /media/cdrom/

通用选项

    -v:显示安装的详细信息

    -vv:显示安装时的更详细信息  

    -h:通过50个#号来显示安装进度  

常用查询选项

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

        [select-options]

            PACKAGE_NAME:包名  

            -a:查询已安装的包

            -p PACKAGE_FILE:对未安装包的详细信息查询,与[query-options]配合使用

            -f或--file FILE:查询某文件有哪个包生成

        [query-options]

            --changelog:查询RPM包的变更信息  

            -c, --configfiles:显示包的配置文件

            -d, --docfiles:显示包的帮助文件

            -i, --info:显示包的信息,包含包名,版本和描述

            -l, --list:显示包中的所有文件

            --provides:列出包提供的功能  

            -R或--requires:列出这个包所依赖的功能  

            --scripts:列出包安装和卸载时运行的特定脚本

                    preinstall: 安装前执行的脚本

postinstall: 安装后执行的脚本

preuninstall: 卸载前执行的脚本

postuninstall: 卸载后执行的脚本

                 

    查询某包是否安装

[root@localhost Packages]# rpm -q zsh
package zsh is not installed

 

    查询已安装的所有包

[root@localhost Packages]# rpm -qa

 

    查询某文件由哪个包安装生成的

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

    查询未安装包的相关信息与与[query-options]配合使用  


[root@localhost Packages]# rpm -qpi zsh-4.3.10-7.el6.x86_64.rpm


[root@localhost Packages]# rpm -qpc zsh-4.3.10-7.el6.x86_64.rpm


    查询RPM包的变更信息  

[root@localhost Packages]# rpm -q zsh --changelog
* Mon Aug 05 2013 James Antill <james.antill@redhat.com> - 4.3.10-7
- Change {NAME:OFFSET:LENGTH} substitution feature to ignore KSH_ARRAYS option.
- Fixup tests.
- Resolves: rhbz#820530

    查询所提供的功能  

[root@localhost Packages]# rpm -q xz --provides
xz = 4.999.9-0.5.beta.20091007git.el6
xz(x86-64) = 4.999.9-0.5.beta.20091007git.el6

    查询所依赖的功能  

[root@localhost Packages]# rpm -q xz --requires
/bin/sh  
libc.so.6()(64bit)  
libc.so.6(GLIBC_2.2.5)(64bit)  
libc.so.6(GLIBC_2.3)(64bit)  
libc.so.6(GLIBC_2.3.4)(64bit)  
libc.so.6(GLIBC_2.4)(64bit)  
libc.so.6(GLIBC_2.6)(64bit)  
libc.so.6(GLIBC_2.7)(64bit)  
liblzma.so.0()(64bit)  
libpthread.so.0()(64bit)  
libpthread.so.0(GLIBC_2.2.5)(64bit)  
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)  
xz-libs = 4.999.9-0.5.beta.20091007git.el6
rpmlib(PayloadIsXz) <= 5.2-1

常用安装选项

   rpm {-i|--install} [install-options] PACKAGE_FILE ...

        [install-options]

            --test    测试安装  

            --nodeps    忽略依赖关系  

            --replacepkgs    重新安装RPM包

    软件包的安装  

[root@localhost 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@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm --replacepkgs
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]

 

    测试安装

[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm --test
Preparing...                ########################################### [100%]
[root@localhost Packages]# rpm -q zsh
package zsh is not installed

 

    忽略依赖关系

[root@localhost Packages]# rpm -ivh gcc-4.4.7-11.el6.x86_64.rpm 
error: Failed dependencies:
	cloog-ppl >= 0.15 is needed by gcc-4.4.7-11.el6.x86_64
	cpp = 4.4.7-11.el6 is needed by gcc-4.4.7-11.el6.x86_64
[root@localhost Packages]# rpm -ivh gcc-4.4.7-11.el6.x86_64.rpm --nodeps
Preparing...                ########################################### [100%]
   1:gcc                    ########################################### [100%]

 

常用卸载选项

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

    卸载程序,如卸载程序的配置文件被修改过,卸载是被更改的配置文件将被重命名为***.rpmsave

[root@localhost Packages]# rpm -e zshwarning: /etc/zlogin saved as /etc/zlogin.rpmsave

 

常用升级选项

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

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

    [install-options]  

        --oldpackage:降级安装

        --force: 忽略冲突,强制执行过程

    升级安装,U 选项:如果有较旧版本程序包,则升级安装;否则,则执行安装操作

[root@localhost Packages]# rpm -Uvh zsh-4.3.10-7.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]
[root@localhost Packages]# rpm -q zsh
zsh-4.3.10-7.el6.x86_64

 

    级安装, F 选项:如果有较旧版本程序包,则升级安装;否则,中止

[root@localhost Packages]# rpm -q bash
bash-4.1.2-15.el6_4.x86_64
[root@localhost Packages]# rpm -Fvh bash-4.1.2-29.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:bash                   ########################################### [100%]
[root@localhost Packages]# rpm -q bash
bash-4.1.2-29.el6.x86_64
 
[root@localhost Packages]# rpm -Fvh zsh-4.3.10-7.el6.x86_64.rpm 
[root@localhost Packages]# rpm -q zsh
package zsh is not installed

    降级安装


常用校验选项

rpm {-V|--verify} [select-options] [verify-options]

     [select-options]  

            PACKAGE_NAME:包名

            -a:查询已安装的包

            -p PACKAGE_FILE:对未安装包的详细信息查询,与[query-options]配合使用

            -f或--file FILE:查询某文件有哪个包生成

    [verify-options]

            --nosignature: 不检查来源合法性      

            --nodigest: 不检查完整性

    对程序进行校验,/etc/zlogin更改后,校验信息如下

[root@localhost Packages]# vim /etc/zlogin
[root@localhost Packages]# rpm -V zsh
S.5....T.  c /etc/zlogin

  开始的9个选项分别表示如下:

       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

后面的c选项位置有如下选项,被更改的文件类型:

       c %config configuration file.  

       d %doc documentation file.

       g %ghost file (i.e. the file contents are not included in the package payload).

       l %license license file.

       r %readme readme file.   

其他相关

为了验证程序包来源和合法性和完成性,安装的时候需要对程序包进行校验。密钥存放位置/etc/pki/rpm-gpg/

当有warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY 提示时,可以导入光盘中的公钥或到官网下在相关公钥。  

    导入PUBKEY rpm --import PUBKEY ...

[root@localhost 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@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-6 
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm --replacepkgs
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]

    PUBKEY的查询与删除   

[root@localhost base]# rpm -q gpg-pubkey
package gpg-pubkey is not installed
[root@localhost base]# rpm --import /media/cdrom/RPM-GPG-KEY-CentOS-6
[root@localhost base]# rpm -q gpg-pubkey
gpg-pubkey-c105b9de-4e0fd3a3

 

[root@localhost base]# rpm -q gpg-pubkey
gpg-pubkey-c105b9de-4e0fd3a3
[root@localhost base]# rpm -e gpg-pubkey-c105b9de-4e0fd3a3
[root@localhost base]# rpm -q gpg-pubkey
package gpg-pubkey is not installed

    RPM数据库  

为了能有效管理系统上的软件,RPM有一个数据库,存放在/var/lib/rpm文件夹下。RPM文件尝尝会安装,移除,升级等操作,某些动作可能导致RPM数据损坏,可以通过以下来初始化和重建  

[root@localhost ~]# rpm --initdb
 
[root@localhost ~]# rpm --rebuilddb

 

YUM全名Yellow dog Updater,是一个基于RPM包管理的字符前端软件包管理器。能够从指定的服务器自动下载RPM包并且安装,可以处理依赖性关系(安装A-->B,B-->C,B和C就需要一起安装),并且一次安装所有依赖的软件包,无需繁琐地一次次下载、安装。

如下图,一个程序有这么多的rpm包,为什么不打包在一个中呢?

Linux程序包管理_系统软件_02

1、为了重复利用既有的软件功能,因此很多软件都会以函数库的方式释放出部分功能,以方便其他软件的调用

2、节省磁盘空间,不必为了调用相应的库而把整个软件都安装上

3、安全,功能越多,BUG的可能性就越大


YUM客户端相关配置

主配置文件/etc/yum.conf


[main]               

cachedir=/var/cache/yum/$basearch/$releasever    缓存存放路径,如安装包    

keepcache=0    安装成功后是否保存缓存和包,默认1保存,0不保存

debuglevel=2    调试级别0-10,默认为2

logfile=/var/log/yum.log    日志目录

exactarch=1    默认为1,不会更新i686的包到i386的包

obsoletes=1   

gpgcheck=1    是否检查GPG签名

plugins=1    是否支持插件,0关闭,1启用

installonly_limit=5   

bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum

distroverpkg=centos-release


 

接下来就是定义软件仓库位置的配置文件,目录为/etc/yum.repos.d,可以有1个或多个,文件由以下主要参数构成

[repository_ID]:在所有配置文件中必须唯一

name:一个通俗易懂的名字

baseurl:指向YUM仓库的链接

$releasever   This is replaced with the package's version, as listed in distroverpkg. This defaults to the version of the redhat-release package.

$arch  This is replaced with your system's architecture, as listed by os.uname() in Python.

$basearch   This is replaced with your base architecture. For example, if $arch=i686 then $basearch=i386.

$YUM0-9    This is replaced with the value of the shell environment variable of the same name. If the shell environment variable does not exist, then the configuration file variable will not be replaced.

为让不同的系统获取相应版本的软件,可以通过一下替换来实现:

http://mirrors.sohu.com/centos/6/os/x86_64/

http://mirrors.sohu.com/centos/$releasever/os/$basearch

enabled:是否启用YUM仓库,0启用,1禁用

gpgcheck:GPG签名检查,1启用,0不检查    http://mirrors.sohu.com/centos/6/os/x86_64/

gpgkey:Public Key存放位置

cost:开销默认为1000,越小优先级越高


YUM的相关命令

    选项

--enablerepo=  启用repo
--disablerepo= 禁用repo    注意:优先级高于/etc/yum.repos.d/*.repo配置文件中定义的属性;
-y: 自动回答为yes
--nogpgcheck

    列出所有仓库,程序包,包组

# yum repolist	列出所有仓库
# yum list all	列出所有的软件(包含未安装仓库上可用的)
# yum list installed	列出所有已安装的软件
# yum list available	列出仓库上的软件
# yum grouplist	列出包组

    安装程序包  

# yum install PACKAGE_NAME ...    安装程序包
# yum install PACKAGE-VERSION    如果要安装指定的版本的程序
# yum reinstall PACKAGE_NAME    重装指定的程序包	

    升级程序包  

yum update PACKAGE_NAME   升级程序包
yum update PACKAGE-VERSION    如果有多个版本的升级包可用,且仅期望升级到指定版本:
yum downgrade PACKAGE_NAME    降级
yum check-update    检查可用升级

    卸载程序包

yum remove|erase PACKAGE_NAME    卸载程序包依赖于指定程序包的其它包,会被一并卸载

 

    查询程序包  

yum list    列出所有包
yum info PACKAGE_NAME   显示包的信息
yum search KEYWORD    根据关键字模糊查询包名或包的sumary信息包含此KEYWORD的相关列表;
yum provides|whatprovides /path/to/somefile    查询包所提供的功能

    包组管理  

yum grouplist    显示所有包组
yum groupinfo "GROUP_NAME"    显示某包组的相关信息:
yum groupinstall "GROUP_NAME"    安装包组
yum install @GROUP_NAME	
yum groupremove "GROUP_NAME"    卸载包组
yum remove @"GROUP_NAME"
yum groupupdate "GROUP_NAME"    升级包组:

    安装本地rpm包  

yum localinstall /path/to/rpm_package_file ...
yum install /path/to/rpm_package_file ...    CentOS7上使用

YUM导入PUBKEY,在/etc/yum.repos.d下新建sohu.repo

[Sohu]  

name=SohuRepo

baseurl=http://mirrors.sohu.com/centos/$releasever/os/$basearch

gpgcheck=1

gpgkey=http://mirrors.sohu.com/centos/6/os/x86_64/RPM-GPG-KEY-CentOS-6

cost=900

Downloading Packages:
zsh-4.3.10-7.el6.x86_64.rpm                                                     
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Retrieving key from http://mirrors.sohu.com/centos/6/os/x86_64/RPM-GPG-KEY-CentO
Importing GPG key 0xC105B9DE:
 Userid: "CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>
 From  : http://mirrors.sohu.com/centos/6/os/x86_64/RPM-GPG-KEY-CentOS-6
Is this ok [y/N]: n

本地创建YUM仓库  

新建相应的文件夹,挂载光驱,拷贝文件到可以读写的文件夹

[root@localhost Packages]# mkdir /tmp/CentOS6.6 /media/cdrom
 
[root@localhost Packages]# mount -r /dev/cdrom /media/cdrom
 
[root@localhost Packages]# cp /media/cdrom/Packages/* /tmp/CentOS6.6/

 

创建YUN仓库

[root@localhost Packages]# createrepo /tmp/CentOS6.6/
Spawning worker 0 with 4184 pkgs
Workers Finished
Gathering worker results
 
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

 

生成相应的文件

[root@localhost repodata]# ls
2492566dbeda19963c5a8a638185aa1e858aa6dea5f145b7090a7816fa63162e-filelists.sqlite.bz2
280947c3ee9847a2312ddb02e6b91ecacbbc29bde81d4c094e2e9f25e210ead7-primary.sqlite.bz2
73d30f44b66092492893e3ce0bbf8c20ffd625b7eca70b04c6776e216e1149a4-filelists.xml.gz
858abeedbb1e06aacfff0cd8d90f7948fdcd232f82e1dfb3c4f308cb7d79b314-other.xml.gz
970f7ec74fbca72ff525949a31dcfae8fd98a5ed27674b978e441593b2dddf5d-other.sqlite.bz2
aa9011cf9321a5b1eab983fba6612218dab558a2618a1ad5a5a0d0f6f0026446-primary.xml.gz
repomd.xml
 
[root@localhost repodata]# pwd
/tmp/CentOS6.6/repodata

对默认的YUM仓库改名,创建自己的地址

[root@localhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak
[root@localhost yum.repos.d]# pwd
/etc/yum.repos.d
 
[root@localhost yum.repos.d]# cat my.repo 
[myrepo]
name=myrepo
baseurl=file:///tmp/CentOS6.6
gpgcheck=0

创建成功

[root@localhost yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
myrepo                                                   | 2.9 kB     00:00 ... 
myrepo/primary_db                                        | 3.4 MB     00:00 ... 
repo id                              repo name                            status
myrepo                               myrepo                               4,184
repolist: 4,184