If you cant explain it simply, you dont understand it well enough

rpm的使用入门

rpm的使用入门#

1. rpm是什么##

rpm: Red Hat Package Manager,但是现在是RPM Package Manage的递归缩写。主要是给类redhat liux系统使用,如Fedora/CentOS(yum),openSUSE/SUSE(zypper),Mandriva Linux/Mageia(urpmi),括号后面分别是对应linux发行版的自动安装命令,实际上底层最总还是调用了rpm命令。

本文主要rpm的打包以及rpm的常用命令来阐述。

2. rpm的打包##

虽然我们不是配管,但是有时候还是需要了解一些是怎么打包的,毕竟有时候需要将自己写的一些运维工具下发到相应的机器上。

  • 首先需要安装rpm命令包,rpm的打包命令是rpmbuild。常用的用法为:

    $ rpmbuild -bb xxx.spec
    

    spec文件就是打包要用到的配置文件,这个才是打包的精髓所在。

  • rpm打包的工作环境

    也就是rpm打包的时候是默认将那些文件打成一个rpm包的。

    $ rpm --showrc | grep topdir
    -14: _builddir	%{_topdir}/BUILD
    -14: _buildrootdir	%{_topdir}/BUILDROOT
    -14: _rpmdir	%{_topdir}/RPMS
    -14: _sourcedir	%{_topdir}/SOURCES
    -14: _specdir	%{_topdir}/SPECS
    -14: _srcrpmdir	%{_topdir}/SRPMS
    -14: _topdir	%{getenv:HOME}/rpmbuild
    

    上面的这些变量都是在/usr/lib/rpm/macros定义的。具体每个变量的意思为:

    BUILD: 编译rpm包的临时目录
    BUILDROOT: 编译后生成的软件临时安装目录
    RPMS: 最终生成的可安装rpm包的所在目录
    SOURCES: 所有源代码和不定文件的存放目录
    SPECS: 存放SPEC文件的目录(很重要
    SRPMS: 软件最终的rpm源码格式存放路径(暂时)

    如果用户想要改变这个路径,只要改变topdir这个变量就可以了,应为其他的变量都是依赖这个变量的,但是,官网文档不建议这么做,可以在用户的目录下建一个.rpmmacros

    $ cat .rpmmacros 
    %_topdir /home/jackson/rpmbuild
                                                              
    $ rpm --showrc | grep _topdir
    -14: _builddir	%{_topdir}/BUILD
    -14: _buildrootdir	%{_topdir}/BUILDROOT
    -14: _rpmdir	%{_topdir}/RPMS
    -14: _sourcedir	%{_topdir}/SOURCES
    -14: _specdir	%{_topdir}/SPECS
    -14: _srcrpmdir	%{_topdir}/SRPMS
    -14: _topdir	/home//root/rpmbuild
    

    但是,现在是没有rpmbuild目录,已经rpmbuild下面其他的目录,可以手动建,也可以通过执行rpmdev-setuptree可以自动生成这些文件:

    $ rpmdev-setuptree
    $ tree rpmbuild/
    rpmbuild/
    |-- BUILD
    |-- RPMS
    |-- SOURCES
    |-- SPECS
    `-- SRPMS
    
    5 directories, 0 files
    

    这样基本的打包环境就弄好了,只需要将用于生成rpm包的源代码,shell脚本,配置文件等拷贝到SOURCES目录下,在SPEC目录下编写好spec文件,执行开头的那条命令即可。

  • SPEC文件的编写

    上面说到,spec文件才是rpm打包的核心所在,那怎么写spec配置文件呢。下面慢慢道来。

    首先可以通过 rpmdev-newspec -o Name-version.spec命令来生成一个spec文件的模板。

    (1) 关键字

    Name: 软件包的名称。 用%{name}的方式引用
    Summary: 软件包的内容概要

rpm的常用命令##

1. 安装rpm包###

$ rpm -ivh hello-0.1.i386.rpm

之后会显示包名,并且打印一连串的#号以表示安装进度。如果包已经有了,可以通过下面的命令来升级

$ rpm -Uvh hello-0.1.i386.rpm

实际上,上面的命令也是可以用来安装新包的。

注意: 使用rpm -ivh hello-0.1.i386.rpm安装包的时候会出现:

(1)软件包已经被安装。解决方式:

$ rpm -ivh --replacepkgs hello-0.1.i386.rpm

(2)安装的软件包中有文件冲突。解决方式:

$ rpm -ivh --replacefiles hello-0.1.i386.rpm

(3)未解决依赖关系:

$ rpm -ivh hello-0.1.i386.rpm
failed dependencies:
world is needed by hello-0.1
#

可以忽略依赖关系,强制安装,可以利用--nodeps参数:

$ rpm -ivh --nodeps hello-0.1.i386.rpm

2. 卸载rpm包###

$ rpm -e rpm_name

同样卸载的时候也会出现 依赖关系的错误,如果要强制卸载,也可以用--nodeps参数,但是会出现和它有依赖关系的软件包未必能正常运行。

3. 升级rpm包###

$ rpm -Uvh hello-0.1.i386.rpm

这个前面已经提到过,这个过程是,RPM会自动卸载老的软件包,实际上,升级就是卸载和安装的过程,因此也会出现上面的两个操作所遇到的问题。此外就是用低的rpm版本包来升级高的rpm版本的时候,就会出现

error: hello-0.1.i386.rpm cannot be installed

如果要强制升级,可以用–-oldpackage

$ rpm -Uvh –-oldpackage hello-0.1.i386.rpm

4. 更新rpm包###

$ rpm -Fvh –-oldpackage hello-0.1.i386.rpm

5. 查询###

常用操作

$ rpm -qa                  #列出本机上安装所有的rpm包
$ rpm -q hello             #找出本机上以hello开头的rpm包

除此之外,还有以下的选项可以和-q连用,来指明要查询软件包的信息。

  • -f 查询包含有的软件包
  • -p 查询软件包名
  • -i 显示软件包的信息,就是SPEC文件中的一些内容给显示出来
  • -l 列出软件包包含的文件
  • -s 显示软件包中所有文件的状态
  • -d 列出被标注为文档的文件(document)
  • -c 列出被标注为配置文件的文件(config)

6. rpm校验###

$ rpm -V

7. rpmdb###

rpmdb 命令用户初始化和重建rpm数据库

$ rpmdb <option>

option:

  • --initdb: 初始化RPM数据库
  • --rebuilddb: 从已安装的包头文件中,反向重建RPM数据库

常常在安装的时候需要,修复RPM数据库

$ rm -rf /var/lib/rpm/__db.* && sudo rpm --rebuilddb
posted @ 2015-08-06 21:01  zk47  阅读(866)  评论(0编辑  收藏  举报

I am a stupid bird, and I need to work hard