缺点是,不能自动解析依赖关系,已经编译好,不能再次编译
src.rpm中放置的是源代码,可以根据目标平台,编译出适合该平台的rpm包
src.rpm包如何解压?
rpm -i src.rpm 解压完毕后,src中的代码会出现在 /root/rpmbuild/**目录下面 解压的文件中包含了一个.spec的文件
如何将自己的源文件打包成一个rpm包:
已准备源文件
配置spec文件
rpmbuild -ba mypackage.spec
-ba binary + src-bb 支撑生binary
-bs 只生成src
rpm包文件如何查看?
rpm2cpio rpm |cpio -id 将rpm包生成目标文件
rpm使用总结:
rpm -qpl 可以查看rpm包的一些信息,包括,依赖 版本 。。。。
rpm -qa|grep ^a 查找已a开头的软件包
rpm -qi 查看此软件包是否安装,已经一些信息
------------------------------------------------------------------------------
[root@cloud-controller rpm]# rpm -qa |grep nova
openstack-nova-scheduler-2013.2.1-1.el6.noarch
openstack-nova-conductor-2013.2.1-1.el6.noarch
openstack-nova-cert-2013.2.1-1.el6.noarch
python-nova-2013.2.1-1.el6.noarch
openstack-nova-compute-2013.2.1-1.el6.noarch
openstack-nova-novncproxy-2013.2.1-1.el6.noarch
openstack-nova-2013.2.1-1.el6.noarch
openstack-nova-common-2013.2.1-1.el6.noarch
openstack-nova-objectstore-2013.2.1-1.el6.noarch
openstack-nova-network-2013.2.1-1.el6.noarch
openstack-nova-api-2013.2.1-1.el6.noarch
openstack-nova-console-2013.2.1-1.el6.noarch
python-novaclient-2.15.0-1.el6.noarch
openstack-nova-cells-2013.2.1-1.el6.noarch
[root@cloud-controller rpm]# rpm -qi openstack-nova-compute
Name : openstack-nova-compute Relocations: (not relocatable)
Version : 2013.2.1 Vendor: Fedora Project
Release : 1.el6 Build Date: Tue 17 Dec 2013 05:44:44 PM CST
Install Date: Thu 16 Oct 2014 10:09:38 AM CST Build Host: buildvm-21.phx2.fedoraproject.org
Group : Applications/System Source RPM: openstack-nova-2013.2.1-1.el6.src.rpm
Size : 11753 License: ASL 2.0
Signature : RSA/SHA1, Wed 18 Dec 2013 11:59:27 PM CST, Key ID fa167b7c2bc7c801
Packager : Fedora Project
URL : http://openstack.org/projects/compute/
Summary : OpenStack Nova Virtual Machine control service
Description :
OpenStack Compute (codename Nova) is open source software designed to
provision and manage large networks of virtual machines, creating a
redundant and scalable cloud computing platform. It gives you the
software, control panels, and APIs required to orchestrate a cloud,
including running instances, managing networks, and controlling access
through users and projects. OpenStack Compute strives to be both
hardware and hypervisor agnostic, currently supporting a variety of
standard hardware configurations and seven major hypervisors.
This package contains the Nova service for controlling Virtual Machines.
rpm -qc qpidd-cpp-server 查找httpd这个服务所涉及到的文件
--------------------------------------------------------
[root@cloud-controller lsb]# rpm -qc qpid-cpp-server
/etc/qpid/qpidd.acl
/etc/qpidd.conf
/etc/sasl2/qpidd.conf
/var/lib/qpidd/qpidd.sasldb
[root@cloud-controller lsb]# rpm -qc qpid-cpp-client
/etc/qpid/qpidc.conf
-------------------------------------------------------
rpm -qf /etc/crontab 查找/etc/ctrontab这个文件属于哪个软件
rpm -Va 查找哪些程序的配置文件被修改过
rpm -Vp 查找某个软件中,被修改过的档案
rpm -Vf 查看此文件是否被修改过
spec文件详解:http://rikers.org/rpmbook/node66.html
%setup宏
放置在%prep宏之后,将source文件中的压缩文件解压,然后
Source: cdplayer-1.0.tgz
%setup
这种情况是最简单的情况,默认做一下动作
cd /usr/src/redhat/BUILD rm -rf cdplayer-1.0 gzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf - if [ $? -ne 0 ]; then exit $? fi cd cdplayer-1.0 cd /usr/src/redhat/BUILD/cdplayer-1.0 这两个意义一样,用于确认目录创建成功 chown -R root.root . chmod -R a+rX,g-w,o-w .
将源文件中的压缩文件解压到build目录下,然后进入该目录 |
%setup -n cd-player
cd /usr/src/redhat/BUILD rm -rf cd-player gzip -dc /usr/src/redhat/SOURCES/cdplayer-1.0.tgz | tar -xvvf - if [ $? -ne 0 ]; then exit $? fi cd cd-player cd /usr/src/redhat/BUILD/cd-player chown -R root.root . chmod -R a+rX,g-w,o-w .
把第一脚本中的变量都变成了 :cd-player 这种方式要确保cdplayer-1.0.tgz解压后的名字如果是cd-player,否则脚本是无法执行的
buildroot %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
|
关于RPM的%config和(noreplace)
这篇文章翻译自这里, 是一篇关于制作RPM包中的一个比较难于理解的地方。 不做开发的同学就不要看了。
RPM spec文件有个名为 %config 的宏,它可以标识配置文件,
这样在升级时用户对配置文件做过的修改就不会丢失。 没有它,用户千辛万苦修改过的配置文件会在升级过程中被覆盖。
%config也可以写成%config(noreplace),不过网上关于它的说明却屈指可数。 下面是关于这两者的一些实验,都是在RedHat 9的RPM(rpm-4.2-0.69)上进行的, 其他版本有可能不同。
RPM中的文件的制约条件有三个:1. 该文件在spec中如何标识(默认,%config或者%config(noreplace));
2. 在rpm升级包中该文件是否被更新;3. 该文件是否被用户编辑过。
下表就是各个条件的组合结果。
文件标识 | 在RPM升级包中是否更新了? | 旧版本文件未被用户编辑过 | 旧版本文件被用户编辑过 |
默认 | No | 用新文件覆盖 | 用新文件覆盖 |
~ | Yes | 用新文件覆盖 | 用新文件覆盖 |
%config | No | 用新文件覆盖 | 保持旧文件 |
~ | Yes | 用新文件覆盖 | 旧文件改名为.rpmsave并复制新文件 |
%config(noreplace) | No | 用新文件覆盖 | 保持旧文件 |
~ | Yes | 用新文件覆盖 | 保持旧文件,新文件安装为.rpmnew |
其中(noreplace)有效的两种情况上存在以下的问题:当spec文件中的定义改变时会发生什么?结论如下:
文件标识 | 在RPM升级包中是否更新了? | 旧版本文件被用户编辑过 |
由%config(noreplace)改为%config | Yes | 旧文件改名为.rpmsave并安装新文件 |
由%config改为%config(noreplace) | Yes | 保持旧文件,新文件安装为.rpmnew |
结论:非配置文件或是上次安装后没有被修改的文件会被RPM包内的新文件覆盖。 如果配置文件被修改过,但在新的RPM包中未作更新,则修改过的文件保留。 仅当配置文件被修改并且在新的RPM包中被更新时,具体动作取决于(noreplace)。 %config使得旧文件被改名为.rpmsave并安装新文件,而%config(noreplace)将保持旧文件 并将新文件安装为.rpmnew。
建议一般配置文件都标识为(noreplace),除非升级所带来的配置文件变动非常重要, 使用上一版本的配置文件无法正常工作时才使用%config。