Linux程序包管理

Rpm包简介

Rpm包就是在相对应的操作系统平台上面编译好的软件包,没有编译之前就是一堆的源代码,很多刚接触Linux的用户还没有能力或自行编译源代码程序的难度很大,所以才会有了rpm包管理器。使用rpm可以使用户方便的进行软件的安装、查询、卸载、升级等工作。但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时。

 

程序编译之后一般有四个部分组成,二进制程序,库文件,配置文件,帮助文件下面分别列出了这些文件在系统的存放路径。

二进制程序:/bin, /sbin, /usr/bin, /usr/sbin,/usr/local/bin, /usr/local/sbin, /opt/bin, /opt/sbin

库文件:/lib, /lib64, /usr/lib, /usr/lib64,/usr/local/lib, /usr/local/lib64

配置文件:/etc, /etc/DIR, /usr/local/{etc,conf}

帮助文件:/usr/share/man, /usr/share/doc,/usr/local/share/man

 

源代码包在编译时可以对程序包的功能进行定制,需要的功能可以编译,不需要的功能就不编译。但是rpm包是直接编译好的程序包,为了使用户能够在安装的时候选择需要的功能,舍弃不需要的功能,就会对一个程序进行分包,一个程序就会被编译成多个功能不同的包,让用户选择安装。

程序包的命名方式

appname-VERSION-RELEASE.ARCH.rpm

    VERSION:

       major:主版本号

       minor:次版本号

       release:发行号

    RELEASE:包自身的修订号;有时候还会包含适用于的OS信息;比如bash-4.3.2-2.centos6.x86_64.rpm中的2.centos6

    ARCH:适用的平台

       x86:i386, i486, i586, i686

       x86_64:x86_64, amd64

       powerpc:ppc

       noarch:跟平台无关;

httpd软件包的命名方式如下:

httpd-2.2.15-39.el6.centos.x86_64.rpm

rpm包的来源

1、系统的安装光盘或官方镜像站点

挂载光盘:mount /dev/cdrom /media/cdrom

    官方站点,镜像:

       mirrors.sohu.com

       mirrors.163.com

       mirrors.aliyun.com

2、程序包的官方站点

3、第三方组织:epel

4、搜索引擎

    http://rpmfind.net

    http://rpm.pbone.net

    http://pkgs.org

rpm软件包管理

安装软件包

语法:rpm {-i|--install}{install-options}软件包

选项:

    -i:表示安装软件包,--install是长选项

-h:以#来表示安装进度

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

-vv:显示更详细的信息

-vvv:显示比vv还详细的信息

--test:不执行真正的安装过程,而仅报告冲突信息

--nodeps:忽略依赖关系。虽然可以安装成功,但是未必可以正常运行。

--force:强制安装软件包。

   --replacepkgs:覆盖安装,重新安装并覆盖原有文件。

--relocate:把允许修改安装路径的程序包的安装路径定位到新路径下

--replacefiles:有多个程序包安装时,可能安装相同的文件,这时需要指定后安装的程序包替换前面程序包安装的文件

安装时常用的组合:-ivh,-ivvh

实例:安装zsh软件

[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 V3RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...               ########################################### [100%]
   1:zsh                   ########################################### [100%]

依赖关系:rpm包最kengdie的地方就是安装a软件包,可能依赖b,安装b依赖c,有时候一个包装到最后依赖几十个上百个都说不定。

解决依赖关系安装软件包

[root@localhost Packages]# rpm -ivh php-5.3.3-38.el6.x86_64.rpm
warning: php-5.3.3-38.el6.x86_64.rpm: Header V3RSA/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

上面的错误提示表示安装php依赖与php-cli软件包和php-common软件包,只需要一起安装就不会报错了

[root@localhost Packages]# rpm -ivh php-5.3.3-38.el6.x86_64.rpm php-cli-5.3.3-38.el6.x86_64.rpm php-common-5.3.3-38.el6.x86_64.rpm

升级软件包:

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

   -U:升级或安装(如果有就升级,没有就安装)

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

       -F:升级(如果此前没有安装低版本软包,那么就不会执行升级操作)

选项:

--test:只是测试是否可以升级,而不是正正升级。

--nodeps:升级时忽略依赖关系

--force:强制升级

--oldpackage:程序包降级

--relocate:把允许修改安装路径的程序包的安装路径定位到新路径下

--replacefiles:安装时只替换指定文件

常用组合:-Uvh,-Fvh

注意:

(1)一定不要对内核执行升级,新版内核可能对系统不兼容。

      Linux允许多内核共存,所以,可以直接安装多个不同版本的内核;

(2)如果程序包的配置文件安装后曾被修改,升级时,新版本的文件不会覆盖老版本的配置文件,而把新版本的配置文件重命名(加后缀.rpmnew)后保存。

示例:升级zsh,下载到新版的zsh之后将软件包直接执行下面的升级命令即可

[root@localhost ~]# rpm -Uvh zsh-4.3.10-8.el6_5.x86_64.rpm

新版zsh下载地址http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/

卸载:

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

简单用法:

rpm e PACKAGE_NAME

--nodeps:忽略依赖关系

--test:测试卸载

--allmatches:如果一个程序包同时安装多个版本,则此选项一次全部卸载之。

注意:如果程序包的配置文件安装后曾被修改,卸载时,此文件通常不会被删除,而是被重命名(加后缀,rpmsave)后留存;

示例:卸载zsh

[root@localhost ~]# rpm -e zsh

卸载的时候只需要对软件包名执行卸载命令即可,不需要更版本和后缀等信息,那样反而会报错。

查询:

查询某包是否已经安装,以及检查安装的所有包;还可以查看某包的详细信息

语法:rpm {-q|--query} [select-options] [query-options]

[select-options]选项说明:

1.查询某包或某些包是否安装;

rpm q PACKAGE_NAME

示例:查询是否已经安装httpd,查询结果会输出httpd的完整包名。

[root@localhost Packages]# rpm -q httpd
httpd-2.2.15-39.el6.centos.x86_64

2.查询已经安装的所有包;

rpm qa

说明:如果查看已经安装的所有包的话,输出的结果会很庞大,一般使用此选项常用的功能有两种

(1)查询当前系统安装了多少rpm包

示例:查询当前系统安装了多少软件包

[root@localhost ~]# rpm -qa | wc -l
1032

(2)将查询结果使用grep过滤,查看有多少匹配的软件包

示例:查询当前系统安装的httpd相关软件包的信息

[root@localhost ~]# rpm -qa | grep httpd
httpd-tools-2.2.15-39.el6.centos.x86_64
httpd-2.2.15-39.el6.centos.x86_64

3.查询某文件是由那个包安装生成的

rpm qf

示例:查询/etc/httpd/conf/httpd.conf是由那个软件包安装的。

[root@localhost ~]# rpm -qf/etc/httpd/conf/httpd.conf
httpd-2.2.15-39.el6.centos.x86_64

4.查询尚未安装包的信息

-p

     说明:-p选项 不能单独使用,需要结合[query-options]参数一起使用。

示例:查询mysql软件包的相关信息

[root@localhost Packages]# rpm -pqimysql-5.1.73-3.el6_5.x86_64.rpm
warning: mysql-5.1.73-3.el6_5.x86_64.rpm: Header V3RSA/SHA1 Signature, key ID c105b9de: NOKEY
Name        :mysql                        Relocations:(not relocatable)
Version     :5.1.73                            Vendor: CentOS
Release     :3.el6_5                       Build Date:Thu 13 Feb 2014 03:42:39 AM CST
Install Date: (not installed)               Build Host:c6b9.bsys.dev.centos.org
Group       :Applications/Databases        Source RPM:mysql-5.1.73-3.el6_5.src.rpm
Size        :2495591                          License:GPLv2 with exceptions
Signature   :RSA/SHA1, Thu 13 Feb 2014 03:48:07 AM CST, Key ID 0946fca2c105b9de
Packager    :CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.mysql.com
Summary     :MySQL client programs and shared libraries
Description :
MySQL is a multi-user, multi-threaded SQL databaseserver. MySQL is a
client/server implementation consisting of a serverdaemon (mysqld)
and many different client programs and libraries.The base package
contains the standard MySQL client programs andgeneric MySQL files.

参数说明:

Name:软件名

Version:版本信息

Release:发行号

Install Date:包的安装时间

Group:包所在的组

Size:大小

Signature:包的签名信息

Packager:包的制作人

URL:包的源代码程序可以从那里获取到

Summary:包的简要介绍

Relocations:是否被重新定位到其他位置

Vendor:提供商

Build Date:包的构建时间

Build Host:编译包的主机

Source RPM:源rpm包

License:许可证

Description:包的详细介绍

 

[query-options]选项说明:

1.查询某包的简要信息

rpm -qi

2.查询某包安装生成的文件列表

rpm ql

示例:显示安装httpd生成的文件列表,

[root@localhost Packages]# rpm -ql httpd
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/httpd/logs
/etc/httpd/modules
/etc/httpd/run
……生成列表过多,省略部分内容……


3.查询某包安装完成后的所有配置文件

rpm qc

示例:显示php安装完成之后的配置文件。

[root@localhost ~]# rpm -qc php
/etc/httpd/conf.d/php.conf

4.查询某包安装完成后的帮助文件

rpm qd

[root@localhost ~]# rpm -qd httpd
/usr/share/doc/httpd-2.2.15/ABOUT_APACHE
/usr/share/doc/httpd-2.2.15/CHANGES
/usr/share/doc/httpd-2.2.15/LICENSE
/usr/share/doc/httpd-2.2.15/NOTICE
/usr/share/doc/httpd-2.2.15/README
/usr/share/doc/httpd-2.2.15/VERSIONING
/usr/share/man/man8/apachectl.8.gz
/usr/share/man/man8/htcacheclean.8.gz
/usr/share/man/man8/httpd.8.gz
/usr/share/man/man8/rotatelogs.8.gz
/usr/share/man/man8/suexec.8.gz

5.查看某包制作时随版本变化的changelog信息,changelog记录了包的每次更新都做了什么改动

rpm q changelog

[root@localhost ~]# rpm -q -changelog httpd
* Wed Oct 15 2014 Johnny Hughes<[email protected]> - 2.2.15-39.el6.centos
- Roll in CentOS Branding
 
* Tue Aug 05 2014 Jan Kaluza <[email protected]>- 2.2.15-39
- mod_proxy: close client connection if the backendcloses connection (#1111410)
……输出内容过多,省略部分内容……

6.查询某包提供的capabilities,

rpm q provides

[root@localhost ~]# rpm -q -provides httpd
config(httpd) = 2.2.15-39.el6.centos
httpd-mmn = 20051115
httpd-suexec = 2.2.15-39.el6.centos
mod_actions.so()(64bit) 
mod_alias.so()(64bit) 
mod_asis.so()(64bit) 
mod_auth_basic.so()(64bit) 
……输出内容过多,省略部分内容……

7.查询某包所依赖的capabilities

rpm q requires

[root@localhost ~]# rpm -q -requires httpd
/bin/bash 
/bin/sh 
/etc/mime.types 
/usr/sbin/useradd 
apr-util-ldap 
chkconfig 
config(httpd) = 2.2.15-39.el6.centos
httpd-tools = 2.2.15-39.el6.centos
……输出内容过多,省略部分内容……

8.查询某包安装卸载时执行的脚本

rpm q scripts

脚本有四类:

preinstall:安装过程开始之前执行的脚本

postinstall:安装过程完成之后执行的脚本

prenuinstall:卸载开始之前执行的脚本

postuninstall:卸载过程完成之后执行的脚本

[root@localhost ~]# rpm -q -scripts httpd
preinstall scriptlet (using /bin/sh):   #表示安装前脚本
# Add the "apache" user
getent group apache >/dev/null || groupadd -g 48-r apache
getent passwd apache >/dev/null ||   useradd -r-u 48 -g apache -s /sbin/nologin     -d/var/www -c "Apache" apache
exit 0
postinstall scriptlet (using /bin/sh): #表示安装后脚本
# Register the httpd service
/sbin/chkconfig --add httpd
/sbin/chkconfig --add htcacheclean
preuninstall scriptlet (using /bin/sh): #卸载前执行的脚本
if [ $1 = 0 ]; then
       /sbin/service httpd stop > /dev/null 2>&1
       /sbin/chkconfig --del httpd
       /sbin/service htcacheclean stop > /dev/null 2>&1
       /sbin/chkconfig --del htcacheclean
fi
posttrans scriptlet (using /bin/sh):    #卸载完成执行之后执行的脚本
test -f /etc/sysconfig/httpd-disable-posttrans ||  /sbin/service httpd condrestart >/dev/null2>&1 || :


本文出自 “梅花香自苦寒来” 博客,请务必保留此出处http://ximenfeibing.blog.51cto.com/8809812/1631436

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。