zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Java的HttpServletRequest
    Java的用户登录计数功能
    JAVA-DATE
    正则表达式
    Java-JDBC(2)
    Java-JDBC(1)
    String类
    java的多态和构造方法
    Java的封装 this关键字 继承
    java抽象类与接口
  • 原文地址:https://www.cnblogs.com/zk47/p/4709153.html
Copyright © 2011-2022 走看看