Linux ---安装软件之 srpm ,rpm
安装包常识:
=========================================================================================
1. 用 rpm -ivh *.src.rpm 命令来安装,不会像二进制的 rpm软件包那样安装程序及其数据,而是向/usr/src/redhat(不同的发行版可能稍有不同)/下的SOURCE、SPECS等子目录释放同名的*.tar.gz源码包。还得自己用它释放出来的 *.tar.gz源码包来编译安装才行。
2、如果用 rpmbuild --rebuild *.src.rpm 来进行编译,编译完成后会在 /usr/src/linux(不同的发行版可能稍有不同) 下的RPMS目录下生成同名的*.rpm软件包,这回你就可以安装它了 rpm -ivh *.rpm .
*.tar.gz形式的源码(请注意*.tar.gz不全是源码!可用tar ztvf *.tar.gz列清单确定)是直接打包并压缩了的目录及文件,*.src.rpm除了包含这个同名的 tar.gz包外,还有方便将之编译为同名rpm二进制包的描述文件(*.spec)。
=========================================================================================
SRPM的使用:rpmbuild
1、与RPM区别: www.2cto.com 档案格式 档名格式 直接安装与否 内含程式类型 可否修改参数并编译 RPM xxx.rpm 可 已编译 不可 SRPM xxx.src.rpm 不可 未编译之原始码 可 SRPM可理解为RPM的前期,它最终要变成RPM的,主要是因为它是原码,故可以跨版本。新版的 rpm 已经将 RPM 与 SRPM 的指令分开了,SRPM 使用的是 rpmbuild 这个指令,而不是 rpm。 2、参数: --rebuild 进行‘编译’与‘打包’的动作,最后会产生 RPM 的档案,但是产生的 RPM 档案并没有安装到系统上。最后通常会发现一行字体:Wrote: /usr/src/redhat/RPMS/i386/pkgname.i386.rpm --recompile rebuild 仅‘编译并打包’而已,而 recompile 不但进行编译跟打包,还同时进行‘安装’了! 如:[root@www ~]# rpmbuild --rebuild rp-pppoe-3.5-32.1.src.rpm 3、SRPM--如何解开,修改后再打包回SRPM rpm -i rp-pppoe-3.5-32.1.src.rpm # 过程不会显示任何东西,他只会将 SRPM 的档案解开后,放置到 /usr/src/redhat/ find /usr/src/redhat/ -type f #找文件,以程序名加.spec后缀的就是打包成SRPM的配置文件 改里面的信息后,重打包: [root@www ~]# rpmbuild -ba rp-pppoe.spec <==编译并同时产生 RPM 与 SRPM 档案 [root@www ~]# rpmbuild -bb rp-pppoe.spec <==仅编译成 RPM 档案 =========================================================================================rpm与src.rpm区别及安装
xxxxxxxxx.rpm <==RPM 的格式,已经经过编译且包装完成的 rpm 档案;
xxxxx.src.rpm <==SRPM的格式,包含未编译的原始码资讯。
=========================================================================================有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法:
方法一:1. 执行rpm -i your-package.src.rpm2. cd /usr/src/redhat/SPECS3. rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件4. cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录5. ./configure 这一步和编译普通的源码软件一样,可以加上参数6. make7. make install
方法二:1. 执行rpm -i you-package.src.rpm2. cd /usr/src/redhat/SPECS (前两步和方法一相同)3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等) 在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。执行:rpm -i new-package.rpm即可安装完成。 rpm安装方式:rpm -ivh *.rmp ========================================================================================= rpmbuild通过-t参数来构建打包过的源程序。-ta就是构建rpm包和srpm包,-tb就是只构建二进制rpm包,-tp是只构建打过补丁的包,-ts是只构建srpm包。
基于以上方法;我们就用lsyncd安装为例来演示一下具体内容:
下载源码软件包:lsyncd-2.0.5.tar.gz
进入源码软件包所在目录
[root@vmware1 ~]# cd 4soft/
[root@vmware1 4soft]# ls
lsyncd-2.0.5.tar.gz
=================================================================
2.2 首先检查本地的编译环境和rpm 包制作软件与相关目录是否正常
[root@server ~]# rpm -qa | grep gcc //检查系统编译环境
gcc-java-4.4.6-3.el6.i686
libgcc-4.4.6-3.el6.i686
gcc-objc++-4.4.6-3.el6.i686
gcc-c++-4.4.6-3.el6.i686
gcc-gfortran-4.4.6-3.el6.i686
gcc-4.4.6-3.el6.i686
gcc-gnat-4.4.6-3.el6.i686
gcc-objc-4.4.6-3.el6.i686
[root@server ~]# rpm -qa |grep rpm-build
[root@server ~]# yum install -y rpm-build //默认没有安装rpm-build
rhel6 下的rpm 包制作源码所在目录/root/rpmbuild,与rhel5 的/usr/src/redhat/有所不同。
[root@server ~]# pwd
/root
[root@server ~]# rpmbuild lsyncd-2.0.5.tar.gz //可以生成/root/rpmbuild 目录
error: File /root/lsyncd-2.0.5.tar.gz does not appear to be a specfile.
[root@server ~]# ls rpmbuild/
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
如果没有/root/rpmbuild 目录, 执行命令:rpmbuild lsyncd-2.0.5.tar.gz , 会自动生成
/root/rpmbuild 及其子目录。
=========================================================================================
各目录作用简单介绍如下:
BUILD -> 编译位置(忽略)
BUILDROOT -> 编译位置(忽略)
RPMS -> 生成的二进制rpm 存放位置
SOURCES -> 存放源码, 补丁文件
SPECS -> 存放编译方案*.spec 规则文件
SRPMS -> 生成rpm 源码包(src.rpm)存放位置
===============================================================================
2.3 拷贝源码到SOURCES 目录
拷贝lsyncd 源码到/root/rpmbuild/SOURCES 目录下
[root@server ~]# cp lsyncd-2.0.5.tar.gz /root/rpmbuild/SOURCES/
[root@server ~]# cd rpmbuild/
[root@server rpmbuild]# tree
.
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│ └── lsyncd-2.0.5.tar.gz
├── SPECS
└── SRPMS
6 directories, 1 file
此时,所有子目录下只有SOURCES 下有lsyncd-2.05.tar.gz 一个文件
=========================================================================================
2.4 生成spec 规则文件
进入SPECS 目录
[root@server rpmbuild]# cd SPECS
[root@server SPECS]# vim lsyncd-2.05.spec
//编辑lsyncd 的spec 规则文件,文件名字必须与源码一致,如:lsyncd-2.0.5.tar.gz 源码,
规则文件就应该为lsyncd-2.0.5.spec。注意一定要用vim 编辑才会自动生成模板文件。
=========================================================================================
2.6 编辑lsyncd的spec 文件
编辑lsyncd-2.0.5.spec 文件,先填写可以确定的部分。
Name: lsyncd
Version: 2.0.5
Release: 1%{?dist}
Summary: lsync is a soft of data sync.
Group: System Environment/Base
License: GNU
URL: ftp://192.168.0.254/soft/lsyncd-2.0.5.tar.gz
Source0: lsyncd-2.0.5.tar.gz //注意名称要写对
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: //此处还没有填写,后面根据提示再修改。
Requires:
%description
lsyncd 是一款数据同步软件
use with rsyncd
%prep
%setup -q
%build
%configure
make %{?_smp_mflags}
%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT //此处没有填写完整,需根据“make install”的输
出填写。
%clean
rm -rf $RPM_BUILD_ROOT
%files //此处还没有填写,后面根据提示再修改。
%defattr(-,root,root,-)
%doc
%changelog
%changelog
//下面填写编译时间5 月22 日,日期格式为date +"%a %b %d %Y",必须以*开头,以--end
结尾
* Tue May 22 2012 <root@localhost>
--end
=========================================================================================
2.7 如何确定其它的参数内容呢,可以根据一下步骤,一步步填写
安装源码包
[root@lsyncd ~]# tar xf lsyncd-2.0.5.tar.gz -C /usr/src
[root@lsyncd ~]# cd /usr/src/lsyncd-2.0.5/
[root@lsyncd lsyncd-2.0.5]# ./configure //看看配置时需要依赖哪些软件包
checking for a BSD-compatible install... /usr/bin/install -c
...此处省略...
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for LUA... no
checking for LUA... no
checking for LUA... no
checking for LUA... configure: error: Package requirements (lua >= 5.1.3) were not met:
No package 'lua' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables LUA_CFLAGS
and LUA_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
//报错显示需要安装lua 软件开发包
[root@server lsyncd-2.0.5]# rpm -ivh /root/2soft/lua-devel-5.1.4-4.1.el6.i686.rpm
warning: /root/2soft/lua-devel-5.1.4-4.1.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID
c105b9de: NOKEY
Preparing... ########################################### [100%]
1:lua-devel ########################################### [100%]
[root@server lsyncd-2.0.5]# ./configure //再次配置一切正常
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
//在配置过程中,需要的软件依赖包为lua-devel-5.1.4-4.1.el6.i686.rpm,那么lsyncd-2.0.5.spec
中,"BuildRequires: Requires:"软件依赖配置就可以写上lua-devel。
[root@server lsyncd-2.0.5]# make //编译
make all-am
make[1]: Entering directory `/usr/src/lsyncd-2.0.5'
gcc -DHAVE_CONFIG_H -I. -g -O2 -Wall -MT lsyncd.o -MD -MP -MF .deps/lsyncd.Tpo
...此处省略...
gcc -g -O2 -Wall -o lsyncd lsyncd.o inotify.o -llua -lm -ldl luac.o
make[1]: Leaving directory `/usr/src/lsyncd-2.0.5'
=========================================================================================
2.8 执行make install 命令,看安装过程中,执行了那些操作
[root@server lsyncd-2.0.5]# make install
=========================================================================================
2.10 到现在,lsyncd-2.0.5.spec 文件中还有“%files”没有填写。%files 表示编译完成的软件到底
包括那些文件,可以执行rpmbuild -bb lsyncd-2.0.5.spec,根据提示可以得到%files 的内容。
[root@vmware1 SPECS]# rpmbuild -bb lsyncd-2.0.5.spec
...此处省略...
RPM build errors:
Installed (but unpackaged) file(s) found:
/usr/bin/lsyncd
/usr/share/doc/lbash.lua
/usr/share/doc/lecho.lua
/usr/share/doc/lgforce.lua
/usr/share/doc/lp_w_picpathmagic.lua
/usr/share/doc/lpostcmd.lua
/usr/share/doc/lrsync.lua
/usr/share/doc/lrsyncssh.lua
/usr/share/doc/lsyncd/lbash.lua
/usr/share/doc/lsyncd/lecho.lua
/usr/share/doc/lsyncd/lgforce.lua
/usr/share/doc/lsyncd/lp_w_picpathmagic.lua
/usr/share/doc/lsyncd/lpostcmd.lua
/usr/share/doc/lsyncd/lrsync.lua
/usr/share/doc/lsyncd/lrsyncssh.lua
/usr/share/man/lsyncd.1
/usr/share/man/man1/lsyncd.1.gz
在最后会有这一段关于这些文件的错误,这里列出的所有文件,就是我们需要填写入
lsyncd-2.0.5.spec 中%files 的内容。
=========================================================================================
2.11 到这里所有lsyncd-2.0.5.spec 中所有内容编写完毕,再次执行rpmbuild 命令
[root@server SPECS]# rpmbuild -ba lsyncd-2.0.5.spec
//顺利通过编译,使用-ba 生成rpm 包和srpm 包,查看生成的目标rpm 包
[root@server rpmbuild]# tree *RPMS
RPMS
└── i386
└── lsyncd-2.0.5-1.el6.i386.rpm
SRPMS
└── lsyncd-2.0.5-1.el6.src.rpm
1 directory, 2 files
[root@server rpmbuild]# rpm -qpi RPMS/i386/lsyncd-2.0.5-1.el6.i386.rpm
Name : lsyncd Relocations: (not relocatable)
Version : 2.0.5 Vendor: (none)
Release : 1.el6 Build Date: 2012 年05 月14 日星期一11 时
51 分31 秒
Install Date: (not installed) Build Host: server
Group : System Environmen/Base Source RPM: lsyncd-2.0.5-1.el6.src.rpm
Size : 166052 License: GNU
Signature : (none)
URL : ftp://192.168.0.254/soft/lsyncd-2.0.5.tar.gz
Summary : lsyncd is a soft of data sync.
Description :
lsyncd 是一款数据同步软件
use with rsyncd
[root@server i386]# rpm -ivh lsyncd-2.0.5-1.el6.i386.rpm
Preparing... ########################################### [100%]
1:lsyncd ########################################### [100%]
[root@server i386]# rpm -e lsyncd
[root@server i386]# rpm -ivh lsyncd-2.0.5-1.el6.i386.rpm
Preparing... ########################################### [100%]
1:lsyncd ########################################### [100%]
[root@server i386]# rpm -qa | grep lsyncd
lsyncd-2.0.5-1.el6.i386
[root@server i386]# rpm -ql lsyncd
/usr/bin/lsyncd
/usr/share/doc/lbash.lua
/usr/share/doc/lecho.lua
/usr/share/doc/lgforce.lua
/usr/share/doc/lp_w_picpathmagic.lua
/usr/share/doc/lpostcmd.lua
/usr/share/doc/lrsync.lua
/usr/share/doc/lrsyncssh.lua
/usr/share/doc/lsyncd/lbash.lua
/usr/share/doc/lsyncd/lecho.lua
/usr/share/doc/lsyncd/lgforce.lua
/usr/share/doc/lsyncd/lp_w_picpathmagic.lua
/usr/share/doc/lsyncd/lpostcmd.lua
/usr/share/doc/lsyncd/lrsync.lua
/usr/share/doc/lsyncd/lrsyncssh.lua
/usr/share/man/lsyncd.1
/usr/share/man/man1/lsyncd.1.gz
通过rpm 的查询命令发现lsyncd 的信息,都是我们之前配置的内容。
附:完整的lsyncd-2.0.5.spec 文件内容。
Name: lsyncd
Version: 2.0.5
Release: 1%{?dist}
Summary: lsyncd is a soft of data sync.
Group: System Environmen/Base
License: GNU
URL: ftp://192.168.0.254
Source0: lsyncd-2.0.5.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: lua-devel
Requires: lua
%description
lsyncd 是一款数据同步软件
use with rsyncd
%prep
%setup -q
%build
%configure
make %{?_smp_mflags}
%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
test -z "$RPM_BUILD_ROOT/bin" || /bin/mkdir -p "$RPM_BUILD_ROOT/bin"
/usr/bin/install -c "lsyncd" "$RPM_BUILD_ROOT/bin/lsyncd"
test -z "$RPM_BUILD_ROOT/share/doc/lsyncd/" || /bin/mkdir -p
"$RPM_BUILD_ROOT/share/doc/lsyncd/"
/usr/bin/install -c -m 644 "examples/lbash.lua" "$RPM_BUILD_ROOT/share/doc/lsyncd//lbash.lua"
/usr/bin/install -c -m 644 "examples/lecho.lua" "$RPM_BUILD_ROOT/share/doc/lsyncd//lecho.lua"
/usr/bin/install -c -m 644 "examples/lgforce.lua"
"$RPM_BUILD_ROOT/share/doc/lsyncd//lgforce.lua"
/usr/bin/install -c -m 644 "examples/lp_w_picpathmagic.lua"
"$RPM_BUILD_ROOT/share/doc/lsyncd//lp_w_picpathmagic.lua"
/usr/bin/install -c -m 644 "examples/lpostcmd.lua"
"$RPM_BUILD_ROOT/share/doc/lsyncd//lpostcmd.lua"
/usr/bin/install -c -m 644 "examples/lrsync.lua"
"$RPM_BUILD_ROOT/share/doc/lsyncd//lrsync.lua"
/usr/bin/install -c -m 644 "examples/lrsyncssh.lua"
"$RPM_BUILD_ROOT/share/doc/lsyncd//lrsyncssh.lua"
test -z "$RPM_BUILD_ROOT/share/man/man1" || /bin/mkdir -p
"$RPM_BUILD_ROOT/share/man/man1"
/usr/bin/install -c -m 644 "./doc/lsyncd.1" "$RPM_BUILD_ROOT/share/man/man1/lsyncd.1"
test -z "" || /bin/mkdir -p ""
%clean
rm -rf $RPM_BUILD_ROOT
%files
/bin/lsyncd
/share/doc/lsyncd/lbash.lua
/share/doc/lsyncd/lecho.lua
/share/doc/lsyncd/lgforce.lua
/share/doc/lsyncd/lp_w_picpathmagic.lua
/share/doc/lsyncd/lpostcmd.lua
/share/doc/lsyncd/lrsync.lua
/share/doc/lsyncd/lrsyncssh.lua
/share/man/man1/lsyncd.1
/usr/bin/lsyncd
/usr/share/doc/lsyncd/lbash.lua
/usr/share/doc/lsyncd/lecho.lua
/usr/share/doc/lsyncd/lgforce.lua
/usr/share/doc/lsyncd/lp_w_picpathmagic.lua
/usr/share/doc/lsyncd/lpostcmd.lua
/usr/share/doc/lsyncd/lrsync.lua
/usr/share/doc/lsyncd/lrsyncssh.lua
/usr/share/man/man1/lsyncd.1.gz
%defattr(-,root,root,-)
%doc
%changelog
=========================================================================================
方法总结:
有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法
方法一:
1.执行rpm -i your-package.src.rpm
2. cd /usr/src/redhat/SPECS
3. rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件
4. cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录
5. ./configure 这一步和编译普通的源码软件一样,可以加上参数
6. make
7. make install
=======================================================================
方法二:
1.执行rpm -i you-package.src.rpm
2. cd /usr/src/redhat/SPECS
前两步和方法一相同
3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件
这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等)
在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行rpm -i new-package.rpm即可安装完成.
------------------------参考博客:http://www.2cto.com/os/201303/194218.html
------------------------指导老师(湖南双星科技发展有限公司副总经理)冯德勇
-------------------------网址:http://www.sxkeji.com.cn
------------电话:15874996921
------------QQ :695811769