您的位置:首页 > 产品设计 > 产品经理

rpm的使用入门

2015-08-06 21:01 656 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: