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`-- SRPMS5 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.rpmfailed 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:
- --initdb: 初始化RPM数据库
- --rebuilddb: 从已安装的包头文件中,反向重建RPM数据库
常常在安装的时候需要,修复RPM数据库
$ rm -rf /var/lib/rpm/__db.* && sudo rpm --rebuilddb