RPM(RedHat Package Manager)

    RPM安装包管理器作为redhat开发的用于在互联网或者是cd上进行下载包安装和管理,非常好用的。在CentOS上来说,它通常生成以.rpm结尾的文件。

    通常这些程序包由下列四部分组成

    part1、一些二进制格式的程序(这是指编译完成的)

    它们在CentOS5、6等环境下通常在/bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin等目录下,还有一些第三方的二进制应用也安装在/opt下。其实对于RPM包管理我们也可以自己创建一个目录,比如说在/usr/local/你要安装的程序名字/bin或者sbin

    part2、库文件! (这些库文件没有办法直接运行,只能靠其他程序进行调用它们来贡献力量)  

    这些库文件通常在linux下是以.so文件结尾的。库文件从编译角度上来分为两种。

    1.静态编译的库文件,编译后将所有的代码、函数都嵌入到程序中。

    2.动态编译的库文件,这些动态链接库是程序运行时加载的库。

在CentOS为例,它们在/lib64(我这里是64位主机)若是32位主机则是/lib或/usr/lib64 /usr/local/lib64 /usr/local/你要安装的程序名字/lib64下

    part3、配置文件

    这些文件通常记录RPM程序包的配置信息,它们在CentOS环境下通常在/etc 或者/usr/local/你要安装的程序名字/etc or /conf

    part4、帮助文件

    这些帮助文件记录RPM程序的帮助信息,它们在CentOS环境下通常在/usr/share/man或者是/usr/local/share/man下。

    这里告诉大家一个查看命令的库依赖关系的命令

    ldd

    ldd [OPTION]... FILE...

    选项有多个,后面的文件也可以接几个。如

   

 
[root@localhost lib64]# ldd /bin/ls /bin/grep
    
/bin/ls:
   
 
linux-vdso.so.1
 =>  (0x00007fff907ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003842a00000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003841a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003844a00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x000000384be00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003841200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003840e00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003840a00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003841600000)
    libattr.so.1 => /lib64/libattr.so.1 (0x0000003851200000)
 
   
/bin/grep:
    
linux-vdso.so.1 
=>  (0x00007fff12308000)
    libpcre.so.0 => /lib64/libpcre.so.0 (0x0000003474000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003841200000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003840a00000)

    大家发现没有这里有一个linux-vdso.so.1的库文件,它并没有显示后面有任何链接的库文件,但是几乎哪个命令都会出现它,它其实是链接其他库文件的库文件。大家可以使用这个命令,查看各个库文件之间的依赖关系。

    而RPM包里面的程序是有依赖关系的,这个只能借助yum,它的前端工具自行消除这些依赖关系。所谓依赖关系,就是在你安装A.rpm的时候,提醒你还要安装B.rpm才可以,反反复复直至你安装完这个程序,假如你打算安装一个几百K的小程序时候,你发现其实没有你想那么简单,还要安装这个,那个。最后费时费力的安装完成以后发现十几M。

    

    下面让我们来看看rpm包什么样子

    前提:本人是在CentOS6.5环境下,把系统光盘挂载到/media/cdrom


   

[root@localhost cdrom]# ll    total 682
-r--r--r-- 2 root root     14 Nov 29  2013 CentOS_BuildTagdr-xr-xr-x 3 root root   2048 Nov 29  2013 EFI-r--r--r-- 2 root root    212 Nov 28  2013 EULA-r--r--r-- 2 root root  18009 Nov 28  2013 GPLdr-xr-xr-x 3 root root   2048 Nov 29  2013 p_w_picpathsdr-xr-xr-x 2 root root   2048 Nov 29  2013 isolinuxdr-xr-xr-x 2 root root 655360 Nov 29  2013 Packages-r--r--r-- 2 root root   1354 Nov 28  2013 RELEASE-NOTES-en-US.htmldr-xr-xr-x 2 root root   4096 Nov 29  2013 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 Nov 29  2013 TRANS.TBL 
大家主要看标红的Packages的安装包目录,这里存放着系统程序安装所需要的安装包。让我们cd到该目录下,查看。
-r--r--r-- 2 root root    52300 Mar 22  2013 qt-sqlite-4.6.2-26.el6_4.i686.rpm-r--r--r-- 2 root root    52192 Mar 22  2013 qt-sqlite-4.6.2-26.el6_4.x86_64.rpm-r--r--r-- 2 root root 12866892 Mar 22  2013 qt-x11-4.6.2-26.el6_4.i686.rpm-r--r--r-- 2 root root 12704556 Mar 22  2013 qt-x11-4.6.2-26.el6_4.x86_64.rpm-r--r--r-- 2 root root  1109204 Sep 13  2012 quagga-0.99.15-7.el6_3.2.x86_64.rpm-r--r--r-- 2 root root   205420 Nov 25  2013 quota-3.17-20.el6.x86_64.rpm-r--r--r-- 2 root root    76828 Jul  3  2011 radvd-1.6-1.el6.x86_64.rpm-r--r--r-- 2 root root   178316 Jul  3  2011 rasqal-0.9.15-6.1.el6.i686.rpm-r--r--r-- 2 root root   176872 Jul  3  2011 rasqal-0.9.15-6.1.el6.x86_64.rpm-r--r--r-- 2 root root   177564 Jul  3  2011 rcs-5.7-37.el6.x86_64.rpm-r--r--r-- 2 root root    19052 Jul  3  2011 rdate-1.4-16.el6.x86_64.rpm
........

下面会列出很多,这里篇幅有限,不再一一列举

这里我们随便拿一个安装包举例子吧

比如说这个 radvd-1.6-1.el6.x86_64.rpm

它的组成格式是radvd是程序包名字,1.6是radvd源代码的发行号,后面的-1.是radvd这个RPM程序包自身的发行号。后面的el6是指RHEL,这个行业版本的简称。el6是指RHEL下的6.x的系列发行号。x86_64.指的是在x86_64这个硬件平台上。当然有些包会显示noarch,表示没有硬件平台需要虚拟机支持的。

而我们获取RPM包的途径是多种多样的,这里我用的发行版的光盘镜像。下面列举几个常用途径供大家参考

1、某些国内知名的站点服务器

    http://mirrors.163.com
    http://mirrors.sohu.com

2、该程序包的官网上会贡献出rpm包或者是源代码写的rpm包

3、很多第三方机构或个人公布的rpm包

如 http://rpmfind.net
   http://rpm.pbone.net

而网上这么多rpm包,难免良莠不齐。为了避免有些不怀好意的篡改rpm的合法性和完整性。建议朋友们通常要验证一下,以我的光盘镜像为例,在这里

-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 Nov 29  2013 TRANS.TBL
[root@localhost cdrom]# pwd
/media/cdrom

这里标红的就叫RPM-GPG-KEY-CentOS-6则是这个光盘的公钥。通常包的制作者会使用单向加密的方法提取数据的特征码然后使用自己的私钥进行加密这段验证码。


下面我们来说说rpm包的常用步骤:

安装步骤

随便以我们上述一个rpm包为例

我们使用 rpm -i(表示install)

             -v 显示详细安装信息

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

             -vvv 显示更更详细的安装信息

             -h 用哈希格式#来表示2%的安装符号来显示

这里随便找一个安装包进行实验

[root@localhost Packages]# rpm -ivh yelp-2.28.1-17.el6_3.x86_64.rpm
Preparing...                ########################################### [100%]
    package yelp-2.28.1-17.el6_3.x86_64 is already installed

它告诉我们yelp这个程序包已经安装过了。

再挑选一个

[root@localhost Packages]# rpm -ivh wsdl4j-1.5.2-7.8.el6.noarch.rpm
Preparing...                ########################################### [100%]
   1:wsdl4j                 ########################################### [100%]

显示100%安装好了

rpm包安装格式:rpm -iv(vv|vvv)h 程序包名称(前提是路径一定要在安装包目录下)

如果我们仅是测试安装可以加--test选项,例

[root@localhost Packages]# rpm -ivh --test zsh-4.3.10-7.el6.x86_64.rpm
Preparing...                ########################################### [100%]
[root@localhost Packages]# zsh
-bash: zsh: command not found

这里仅是装模做样的安装了一下, 其实我们还是无法使用zsh命令的。

通常程序包的纷繁复杂让我们头疼,我们想重新安装怎么办?

使用rpm -i --replacepkgs 程序包的名称(路径一定要在安装包目录下)

[root@localhost Packages]# rpm -i --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm
[root@localhost Packages]# zsh
[root@localhost]/media/cdrom/Packages# echo $?
0

shell变成了zsh了!

这里注意一点,当我用rpm -ql zsh 去看它生成的文件里,这里有个叫/etc/zprofile的文件,我们进行编辑

#
# /etc/zprofile and ~/.zprofile are run for login shells
#
PATH="$PATH:$HOME/bin"
export PATH
_src_etc_profile()
{
    #  Make /etc/profile happier, and have possible ~/.zshenv options like
    # NOMATCH ignored.
    #
    emulate -L ksh
    # source profile
    if [ -f /etc/profile ]; then
            source /etc/profile
    fi
}
_src_etc_profile
unset -f _src_etc_profile

#cool!

在尾行我们编辑个注释行叫cool!这里保存退出,让我们再重新安装一下zsh

[root@localhost Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm Preparing...                ########################################### [100%]   1:zsh                    ########################################### [100%]
让我们再查看下[root@localhost Packages]# vim /etc/zprofile
unset -f _src_etc_profile

#cool!

尾行还存在着cool信息呢!这是为什么?重新安装有可能保留原有配置文件的修改。


卸载步骤

让我们卸载一个已安装的程序包

 我们使用rpm -e(erase)程序包的名字即可

[root@localhost Packages]# rpm -e zsh
[root@localhost Packages]# echo $?
0

这里我们将zsh卸载了。如果我们想使用zsh将不太可能

[root@localhost Packages]# zsh
-bash: zsh: command not found

再次提醒,卸载需谨慎!!

因为rpm包是存在程序间的依赖关系,假设我们想忽略依赖关系,就用--nodeps选项(不建议使用,有可能导致一些有关联的程序无法正常运行)

对于上述的zsh我们进行再次卸载,!!!发现warning

[root@localhost Packages]# rpm -e zsh
warning: /etc/zprofile saved as /etc/zprofile.rpmsave

提醒你,配置文件进行过修改,我们不会直接卸载你的配置文件,而是另存为.rpmsave的新文件。文件内容不会修改。

升级步骤

rpm -Uvh/-Fvh 程序包的名字(路径一定要在安装包目录下)

    --force 强制升级

查询步骤

任何时候我们都相信查询是万分有用的

1、查询某程序包是否被安装

rpm -q 程序包的名字

这里楼主举个例子:

[root@localhost Packages]# rpm -q zsh-4.3.10-7.el6.x86_64.rpm
package zsh-4.3.10-7.el6.x86_64.rpm is not installed
[root@localhost Packages]# rpm -q grep
grep-2.6.3-4.el6.x86_64

你们发现了么zsh被我删除了,显示not installed,而grep则显示出完整的程序名称,因为虚拟机安装CentOS时,grep是被直接安装进去的。

2、如何查询我们都安装过什么程序包呢?

使用rpm -qa(a有all的意思) 会刷出很多你已经安装过程序包

这个实验做出来基本会刷屏的,楼主很懒的,不展示了。但是如果我们想查询某一项,可以结合grep命令抓取出来,例如:

[root@localhost Packages]# rpm -qa | grep "find"
findutils-4.4.2-6.el6.x86_64

3、查询某个程序包的描述信息

我们使用rpm -qi 程序包名字(不用加.rpm)

如:

[root@localhost Packages]# rpm -qi grep(这里直接键入grep)
Name        : grep                         Relocations: (not relocatable)
Version     : 2.6.3                             Vendor: CentOS
Release     : 4.el6                         Build Date: Tue 25 Jun 2013 10:52:30 PM CST
Install Date: Sat 26 Jul 2014 01:42:17 PM CST      Build Host: c6b8.bsys.dev.centos.org
Group       : Applications/Text             Source RPM: grep-2.6.3-4.el6.src.rpm
Size        : 803774                           License: GPLv3+
Signature   : RSA/SHA1, Wed 26 Jun 2013 10:15:56 AM CST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.gnu.org/software/grep/
Summary     : Pattern matching utilities
Description :
The GNU versions of commonly used grep utilities. Grep searches through
textual input for lines which contain a match to a specified pattern and then
prints the matching lines. GNU's grep utilities include grep, egrep and fgrep.
GNU grep is needed by many scripts, so it shall be installed on every system.


4、我们来查询某个包生成了什么文件

rpm -ql 程序包名字
例如:[root@localhost Packages]# rpm -ql grep/bin/egrep/bin/fgrep/bin/grep/usr/share/doc/grep-2.6.3/usr/share/doc/grep-2.6.3/ABOUT-NLS/usr/share/doc/grep-2.6.3/AUTHORS/usr/share/doc/grep-2.6.3/README/usr/share/doc/grep-2.6.3/THANKS/usr/share/doc/grep-2.6.3/TODO
....这里还有很多,不进行赘述。
如果仅仅想查看生成那些配置文件、帮助文件、或者是什么脚本。
rpm -qc 程序包名字 配置文件的信息
[root@localhost Packages]# rpm -qc zsh/etc/skel/.zshrc/etc/zlogin/etc/zlogout/etc/zprofile/etc/zshenv/etc/zshrc 以上都是zsh生成的配置文件信息啦
rpm -qd 程序包名字 帮助文件的信息
[root@localhost Packages]# rpm -qd grep/usr/share/doc/grep-2.6.3/ABOUT-NLS/usr/share/doc/grep-2.6.3/COPYING/usr/share/doc/grep-2.6.3/README/usr/share/doc/grep-2.6.3/THANKS/usr/share/doc/grep-2.6.3/TODO/usr/share/info/grep.info.gz/usr/share/man/man1/egrep.1.gz/usr/share/man/man1/fgrep.1.gz/usr/share/man/man1/grep.1.gz

可以看出grep的帮助文件很很多。

rpm -q--scripts 查看程序文件生成的脚本

查询某文件由哪个程序包安装的可以用

rpm -qf 文件名如/bin/ls

# rpm -qf /bin/ls
coreutils-8.4-31.el6.x86_64

最后对于尚未安装的程序包执行查看操作就在上述选项中加入-p即可

如 rpm -qpi 一个尚未安装的程序包名字(要确保在程序包目录下或者是链接可用)

   rpm -qpl/c/d 分别查看尚未安装程序包生成文件、配置文件以及帮助文件。


RPM是linux程序包管理器的重要工具。以上陈述,希望对读者有所帮助,当然楼主也会及时查看,回头有时间把RPM的前端工具yum分享给大家!