zoukankan      html  css  js  c++  java
  • Linux软件包管理 RMP包管理

    概述

    RPM 包的命名一般都会遵守统一的命名规则,例如:

    httpd-2.2.15-15.el6.centos.1.i686.rpm

    其中的各项代表的含义如下:

    • httpd:软件包名。
    • 2.2.15:软件版本。
    • 15:软件发布的次数。
    • el6:软件发行商。el6 是由 Red Hat 公司发布的,适合在 RHEL 6.x (Red Hat Enterprise Unux) 和 CentOS 6.x 上使用。
    • i686:适合的硬件平台。RPM 包可以在不同的硬件平台上安装,选择适合不同 CPU 的软件版本,可以最大限度地发挥 CPU 性能,所以出现了所谓的 i386(386 以上的计算机都可以安装)、i586 (586 以上的计算机都可以安装)、i686(奔腾II以上的计算机都可以安装,目前所有的 CPU 是奔腾II以上的,所以这个软件版本居多)、x86_64 (64 位 CPU 可以安装)和 noarch(没有硬件限制)等文件名。
    • rpm:RPM 包的扩展名。我们说过,Linux 下的文件不是靠扩展名区分文件类型的,也就是说 Linux 中的扩展名没有任何含义。可是这里怎么又出现了扩展名呢?原因很简单,如果不把 RPM 包的扩展名叫作".rpm",那么管理员很难知道这是一个 RPM 包,当然也就无法正确安装了。换句话说,如果 RPM 包不用".rpm"作为扩展名,那么系统可以正确识别,但是管理员很难识别这是一个什么样的软件。

    注意,我们把 httpd-2.2.15-15.el6.centos.1.i686.rpm 叫作包全名,而把 httpd 叫作包名。为什么要做出特殊说明呢?因为有些命令后面一定跟的是包全名,如安装和升级;而有些命令后面一定跟的是包名,如查询和卸载。如果弄错,命令就会报错。

    RPM 包默认安装路径

    RPM 包一般采用系统默认路径安装,而源码包一般通过手工指定安装路径(一般安装到 /usr/local/ 中)安装。
    RPM 包默认安装路径是可以通过命令査询的,一般安装在如表 1 所示的目录中。

    表 1 RPM包默认安装路径
    安装路径含 义
    /etc/ 配置文件安装目录
    /usr/bin/ 可执行的命令安装目录
    /usr/lib/ 程序所使用的函数库保存位置
    /usr/share/doc/ 基本的软件使用手册保存位置
    /usr/share/man/ 帮助文件保存位置


    RPM 包也可以手工指定安装路径,但是一旦手工指定安装路径,所有的安装文件就会安装到手工指定位置,而不会安装到系统默认位置。而系统的默认搜索位置并不会改变,依然会去默认位置之下搜索,当然系统就不能直接找到所需的文件,也就失去了作为系统默认安装路径的一些好处。所以我们一般不会指定 RPM 包的安装路径,而使用默认安装路径。

    RPM包的安装

    [root@localhost ~]# rpm -ivh 包全名
    #注意一定是包全名。如果是跟包全名的命令,则要注意路径,因为软件包在光盘当中

    选项:

    • -i:安装(install);
    • -v:显示更详细的信息(verbose);
    • -h:打印 #,显示安装进度(hash);

    例如,安装 apache 软件包,注意出现两个 100% 才是正确安装,第一个 100% 仅是在准备,第二个 100% 才是正确安装。如下所示:

    [root@localhost ~]# rpm -ivh
    /mnt/cdrom/Packages/httpd-2.2.15-15.el6.centos.1.i686.rpm
    Preparing...
    ####################
    [100%]
    1:httpd
    ####################
    [100%]

    如果打算同时安装多个软件包呢?可以用一条命令同时安装,将多个软件包用空格分开就可以了。

    [root@localhost ~]# rpm -ivh a.rpm b.rpm c.rpm
    #一次安装多个软件包

    如果还有其他安装要求,比如想强制安装某个软件包而不管它是否有依赖性,就可以通过选项进行调整:

    • -nodeps:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意:这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
    • -replacefiles:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报"某个文件已经存在"的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。
    • -replacepkgs:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
    • -force:强制安装。不管是否已经安装,都重新安装。也就是-replacefiles和-replacepkgs的综合。
    • -test:测试安装。不会实际安装,只是检测一下依赖性。
    • -prefix:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。注意:如果指定了安装路径,软件没有安装到系统默认路径中,那么系统会找不到这些安装的软件,需要进行手工配置才能被系统识别。所以,我们一遍采用默认路径安装RPM包。

    注意,RPM 包默认保存在系统光盘的 Packages(注意 P 大写)目录中,所以在安装软件前需要挂载光盘。例如:

    mkdir/mnt/cdrom <-建立挂载点
    mount /dev/cdrom /mnt/cdrom <-挂载光盘

    我们一直在说依赖性很麻烦,那么依赖性报错是什么样呢?我们来继续说说 gcc 这个软件,刚刚我们在写 hello.c 的时候假设这个软件已经安装成功了。其实,如果采用"基本服务器"方式安装 Linux 系统,那么 gcc 这个软件是没有安装的,需要我们手工安装,但是安装这个软件是会报依赖性错误的。

    [root@localhost ~]# rpm -ivh /mnt/cdrom/Packages/ gcc-4.4.6-4.el6.i686.rpm
    error: Failed dependencies: <―依赖性错误
    cloog-ppi >= 0.15 is needed by gcc-4.4.6-4.el6.i686
    cpp = 4.4.6-4.el6 is needed by gcc-4.4.6-4.el6.i686
    glibc-devel >= 2.2.90-12 is needed by gcc-4.4.6-4.el6.i686

    这里的依赖性很明显,需要我们先安装 cloog-ppl、cpp 和 glibc-devel 三个软件,其中:

    • ">="表示版本要大于或等于所显示版本;
    • "<="表示版本要小于或等于所显示版本;
    • "="表示版本要等于所显示版本;


    我们当然可以手工安装,只是比较麻烦。那么,有办法让它自动解决依赖性,直接安装吗?有,我们可以使用 yum 在线安装工具,它会自动安装依赖的软件,帮助我们解决依赖性。所以,再卖一个关子,我们不在这里安装 gcc,留到安装 yum 的时候让 gcc 自动安装。

    RPM包的升级

    [root@localhost ~]# rpm -Uvh 包全名

    选项:

    • -U(大写):升级安装。如果没有安装过,则系统直接安装。如果安装过的版本较低,则升级到新版本(upgrade);

    [root@localhost ~]# rpm -Fvh 包全名

    选项:

    • -F(大写):升级安装。如果没有安装过,则不会安装。必须安装有较低版本才能升级(freshen);

    RPM包卸载

    卸载是有依赖性的。比如,在安装的时候,要先安装 httpd 软件包,再安装 httpd 的功能模块 mod_ssl 包。那么,在卸载的时候,一定要先卸载 mod_ssl 软件包,再卸载 httpd 软件包,否则就会报错。软件包卸载和拆除大楼是一样的,你要拆除 2 楼和 3 楼,一定要先拆除 3 楼。

    删除格式非常简单,如下:

    [root@localhost ~]# rpm -e 包名

    选项:

    • -e 卸载(erase);


    如果不按依赖性卸载,就会报依赖性错误。例如:

    [root@localhost ~]# rpm -e httpd
    error: Failed dependencies:
    httpd-mmn = 20051115 is needed by (installed) mod_wsgi-3.2-1.el6.i686
    httpd-mmn = 20051115 is needed by (installed) php-5.3.3-3.el6_2.8.i686
    httpd-mmn = 20051115 is needed by (installed) mod_ssl-1:2.2.15-15.el6.
    centos.1.i686
    httpd-mmn = 20051115 is needed by (installed) mod_perl-2.0.4-10.el6.i686
    httpd = 2.2.15-15.el6.centos.1 is needed by (installed) httpd-manual-2.2.
    15-15.el6.centos.1 .noarch
    httpd is needed by (installed) webalizer-2.21_02-3.3.el6.i686
    httpd is needed by (installed) mod_ssl-1:2.2.15-15.el6.centos.1.i686
    httpd=0:2.2.15-15.el6.centos.1 is needed by(installed)mod_ssl-1:2.2.15-15.el6.centos.1.i686

    当然,卸载命令是支持"--nocteps"选项的,可以不检测依赖性直接卸载。但是,如果这样做,则很可能导致其他软件包无法正常使用,所以并不推荐这样卸载。

    Linux rpm命令查询软件包

     RPM 包管理系统是非常强大和方便的包管理系统,它比源码包的方便之处就在于可以使用命令查询、升级和卸载。在查询的时候,其实是在查询 /var/lib/rpm/ 这个目录下的数据库文件,那为什么不直接查看这些文件呢?你可以尝试使用 Vim 查看这些文件,会发现都是乱码。也就是说,这些文件其实都是二进制文件,不能直接用编辑器查看,所以才需要使用命令查看。

    查询命令的格式

    RPM 查询命令采用如下格式:

    [root@localhost ~]# rpm 选项 查询对象

    查询软件包是否安装

    可以查询软件包是否安装,命令格式如下:

    [root@localhost ~]# rpm -q 包名

    选项:

    • -q:查询(query)


    例如,查看一下 apache 包是否安装,可以执行如下命令:

    [root@localhost ~]# rpm -q httpd
    httpd-2.2.15-15.el6.centos.1.i686

    因为 apache 是已经安装完成的包,所以只需要给出"包名",系统就可以识别。而没有安装的包就必须使用"绝对路径+包全名"格式才可以确定包。前面一直强调的包名和包全名不能写混乱就是这个原因。

    查询系统中的所有安装软件包

    可以查询 Linux 系统中所有已经安装的软件包,命令格式如下:

    [root@localhost ~]# rpm -qa
    libsamplerate-0.1.7-2.1.el6.i686
    startup-notification-0.10-2.1.el6.i686
    gnome-themes-2.28.1-6.el6.noarch
    fontpackages-filesystem-1.41-1.1.el6.noarch
    gdm-libs-2.30.4-33.el6_2.i686
    gstreamer-0.10.29-1.el6.i686
    redhat-lsb-graphics-4.0-3.el6.centos.i686
    …省略部分输出…

    当然,可以用管道符来查看所需的内容,比如:

    [root@localhost ~]# rpm -qa | grep httpd
    httpd-devel-2.2.15-15.el6.centos.1.i686
    httpd-tools-2.2.15-15.el6.centos.1.i686
    httpd-manual-2.2.15-15.el6.centos.1.noarch
    httpd-2.2.15-15.el6.centos.1.i686

    你会发现,使用"rpm-q包名"只能查看这个包是否安装,但是使用"rpm-qa|grep 包名"会把包含包名称的所有包都列出来。

    查询软件包的详细信息

    可以查询已经安装的某个软件包的详细信息,命令格式如下:

    [root@localhost ~]# rpm -qi 包名

    选项:

    • -i:查询软件信息(information)


    例如,查看 apache 包的安装信息,可以使用以下命令:

    [root@localhost ~]# rpm -qi httpd
    Name : httpd Relocations:(not relocatable)
    #包名
    Version : 2.2.15 Vendor:CentOS
    #版本和厂商
    Release : 15.el6.centos.1 Build Date: 2012年02月14日星期二 06时27分1秒
    #发行版本和建立时间
    Install Date: 2013年01月07日星期一19时22分43秒
    Build Host:
    c6b18n2.bsys.dev.centos.org
    #安装时间
    Group : System Environment/Daemons Source RPM:
    httpd-2.2.15-15.el6.centos.1.src.rpm
    #组和源RPM包文件名
    Size : 2896132 License: ASL 2.0
    #软件包大小和许可协议
    Signature :RSA/SHA1,2012年02月14日星期二 19时11分00秒,Key ID
    0946fca2c105b9de
    #数字签名
    Packager:CentOS BuildSystem <http://bugs.centos.org>
    URL : http://httpd.apache.org/
    #厂商网址
    Summary : Apache HTTP Server
    #软件包说明
    Description:
    The Apache HTTP Server is a powerful, efficient, and extensible web server.
    #描述

    通过这条命令可以看到包名、版本、发行版本、安装时间,软件包大小等信息。

    不仅如此,还可以查询还没有安装的软件包的详细信息,命令格式如下:

    [root@localhost ~]# rpm -qip 包全名

    选项:

    • -p:查询没有安装的软件包(package)


    注意,没有安装的软件包是存放在光盘中的,而且因为没有安装,所以需要使用包全名。

    查询软件包中的文件列表

    可以查询已经安装的软件包中的文件列表和安装的完整目录,命令格式如下:

    [root@localhost ~]# rpm -ql 包名

    选项:

    • -l:列出软件包中所有的文件列表和软件所安装的目录(list)


    例如,想要查看一下问 apache 包文件的安装位置,可以执行如下命令:

    [root@localhost ~]# rpm -ql httpd

    那么,可以查询还没有安装的软件包中的文件列表和打算安装的位置吗?答案是可以,命令格式如下:

    [root@localhost ~]# rpm -qlp 包全名

    选项:

    • -p:查询没有安装的软件包信息(package)


    想要查询还没有安装的 bind 软件包中的文件列表和打算安装的位置,可以执行如下命令:

    [root@localhost ~]# rpm -qlp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm

    查询系统文件属于哪个RPM包

    既然可以知道每个 RPM 包中的文件的安装位置,那么可以查询系统文件属于哪个 RPM 包吗?当然可以,不过需要注意的是,手工建立的文件是不能查询的,因为这些文件不是通过 RPM 包安装的,当然不能反向查询它属于哪个 RPM 包。

    命令格式如下:

    [root@localhost ~]# rpm -qf 系统文件名

    选项:

    • -f:查询系统文件属于哪个软件包(file)


    想查询一下 ls 命令是由哪个软件包提供的,可以执行如下命令:

    [root@localhost ~]# rpm -qf /bin/ls
    coreutils-8.4-19.el6.i686

    查询软件包所依赖的软件包

    查询系统中和已经安装的软件包有依赖关系的软件包,命令格式如下:

    [root@localhost ~]# rpm -qR 包名

    选项:

    • -R:查询软件包的依赖性(requires)

    例如,想查询一下 apache 包的依赖包,可以执行如下命令:

    [root@localhost ~]# rpm -qR httpd

    可以查询没有安装的软件包的依赖性吗?加"-p"选项即可。例如,查看一下还没有安装的 bind 软件包的依赖包,可以执行如下命令:

    [root@localhost ~]# rpm -qRp /mnt/cdrom/Packages/bind-9.8.2-0.10.rc1.el6.i686.rpm

  • 相关阅读:
    js FormData 的使用
    js代码 注释 test
    JavaScript创建对象的几种 方式
    js prototype 原型
    C# 遍历对象下的 属性
    C#模拟按键
    C#获取硬盘序列号
    C#结束Explorer进程
    Java书籍推荐
    编程资料合集
  • 原文地址:https://www.cnblogs.com/lizhouwei/p/9939940.html
Copyright © 2011-2022 走看看