最近有一个新的工作,因为公司服务器过多,为了保证flume安装版本位置配置一致并且安装方便 决定使用PRM打包的方式来完成flume的安装配置工作:
RPM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。yum安装软件,优点是全自动化安装
首先请准备一个Linux环境,比如CentOS。
RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包,这个是必装的。当然也可以直接安装rpmdevtools,这个工具还包含一些其他的工具,同时它依赖rpm-build,所以直接安装的话会同时把rpm-build装上。
$ yum install rpm-build
$ yum install rpmdevtools
当然,根据不同的软件构建过程,还需要其他的编译打包工具,比如C语言的make、gcc,python的setuptools等,根据需要安装即可。
RPM打包的时候需要编译源码,还需要把编译好的配置文件啊二进制命令文件啊之类的东西按照安装好的样子放到合适的位置,还要根据需要对RPM的包进行测试,这些都需要先有一个“工作空间”。rpmbuild命令使用一套标准化的“工作空间”:
$ rpmdev-setuptree
rpmdev-setuptree这个命令就是安装rpmdevtools带来的。可以看到运行了这个命令之后,在$HOME家目录下多了一个叫做rpmbuild的文件夹,里边内容如下:
$ tree rpmbuild
rpmbuild
├── BUILD #源码包被解压至此,并在该目录的子目录完成编译
├── BUILDROOT #保存 %install 阶段安装的文件
├── RPMS #生成/保存二进制 RPM 包
├── SOURCES #保存源码包(如 .tar 包)和所有 patch 补丁
├── SPECS #保存 RPM 包配置(.spec)文件
└── SRPMS #生成/保存源码 RPM 包(SRPM)
如果没有安装rpmdevtools的话,其实用mkdir命令创建这些文件夹也是可以的。
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
从这些文件的名字大体也能看得出来都是干嘛用的。具体来说:
SPEC文件:
#用一句话概括该软件包尽量多的信息。
Summary: PAM module for LDAP.
#软件包的名字,最终RPM软件包是用该名字与版本号,释出号及体系号来命名软件包的。
Name: pam_ldap
#软件版本号。仅当软件包比以前有较大改变时才增加版本号。
Version: 185
#软件包释出号。一般我们对该软件包做了一些小的补丁的时候就应该把释出号加1。
Release: 1
#源程序软件包的名字。如 apache-flume-1.7.0-bin.tar.gz
Source: %{name}-%{version}-bin.tar.gz
#软件的主页
URL: http://flume.apache.org/
#软件包所采用的版权规则。具体有:GPL(自由软件),BSD,MIT,Public Domain(公共域),
#Distributable(贡献),commercial(商业),Share(共享)等,一般的开发都写GPL。
Copyright: LGPL
#软件包所属类别 系统环境/基础
Group: System Environment/Base
#这个是安装或编译时使用的“虚拟目录”,后面可使用$RPM_BUILD_ROOT 方式引用
BuildRoot: %{_tmppath}/%{name}-root
#该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本
Requires: openldap cyrus-sasl openssl
Obsoletes: pam_ldap
%description
#软件包详细说明,可写在多个行上。 %开头的是rpm定义的宏命令
%prep段
这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。
%prep
%setup -n
setup命令用于启动名称服务与功能。系统配置工具
%build
本段是建立段,所要执行的命令为生成软件包服务,如make 命令。
./configure
make
%install段
本段是安装段,其中的命令在安装软件包时将执行,如make install命令。
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/{etc,lib64/security}
install -m 755 pam_ldap.so \
$RPM_BUILD_ROOT/lib64/security/
install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/etc/ldap.conf
chmod 755 $RPM_BUILD_ROOT/lib64/security/*.so*
Install和cp类似,都可以将文件/目录拷贝到指定的地点。但是,install允许你控制目标文件的属性。install通常用于程序的makefile,使用它来将程序拷贝到目标(安装)目录。
本段做的工作是将二进制文件和配置文件(pam_ldap.so, ldap.conf),拷贝到相应的目录,并赋予相应的权限属性
%files段
本段是文件段,用于定义软件包所包含的文件,分为三类–说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。
%defattr(-,root,root)
%attr(0755,root,root) /lib64/security/*.so*
%attr(0644,root,root) %config(noreplace) /etc/ldap.conf
%doc AUTHORS NEWS COPYING COPYING.LIB README ChangeLog pam.d
%changelog段
本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用
SPEC文件:
Summary : This is a Flume RPM package.
Name : apache-flume
Version : 1.7.0
Release : 1
License : GPL
Group : System duomi
Source : apache-flume-1.7.0-bin.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-bin
Url : http://www.baidu.com
Packager : flume
PreReq : pcre
Prefix: %{_prefix}
Prefix: %{_sysconfdir}
%define userpath %{_tmppath}/%{name}-%{version}-bin
%description
This package is just a nginx RPM.
%prep
%setup -n %{name}-%{version}-bin
%install
install -d $RPM_BUILD_ROOT%{userpath}
cp -a $RPM_BUILD_DIR/%{name}-%{version}-bin/* $RPM_BUILD_ROOT%{userpath}
%clean
rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/%{name}-%{version}-bin
%files
%defattr(-,root,root)
%{userpath}
%post
rpm(选项)(参数)
-a:查询所有套件;
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;
-c:只列出组态配置文件,本参数需配合"-l"参数使用;
-d:只列出文本文件,本参数需配合"-l"参数使用;
-e<套件档>或--erase<套件档>:删除指定的套件;
-f<文件>+:查询拥有指定文件的套件;
-h或--hash:套件安装时列出标记;
-i:显示套件的相关信息;
-i<套件档>或--install<套件档>:安装指定的套件档;
-l:显示套件的文件列表;
-p<套件档>+:查询指定的RPM套件档;
-q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户;
-R:显示套件的关联性信息;
-s:显示文件状态,本参数需配合"-l"参数使用;
-U<套件档>或--upgrade<套件档>:升级指定的套件档;
-v:显示指令执行过程;
-vv:详细显示指令执行过程,便于排错。
进入到RPMS下,出现一个安装打包好的rpm文件
apache-flume-1.7.0-1.x86_64.rpm
1 查看安装包里面有什么东西
rpm -qlp apache-flume-1.7.0-1.x86_64.rpm
2 查看数据
rpm -qpi apache-flume-1.7.0-1.x86_64.rpm
3 安装RPM
rpm -ivh apache-flume-1.7.0-1.x86_64.rpm
4 查看安装的文件和文件夹
cd /var/tmp/apache-flume-1.7.0-bin
完成