为什么要使用rpm来管理软件包?相比使用shell脚本,从源码编译安装的方式,排除规模引出的效率因素不讲,脚本的可维护性比起rpm要糟糕一些,当然使用rpm就需要深入了解rpmbuild以及spec文档,似乎也并不简单。但从长远来看,rpm、yum源的可维护性,要比“脚本”可靠一些。在本文中,花开分享了创建yum源的操作步骤,用于管理系统上“定制”的软件包。
创建yum源需要一个ftp或者http服务,鉴于ftp烦人的防火墙策略(防火墙配制不当,ftp的模式——主动/初动使用不当,服务会变得不可用),建议使用http服务。
一,
1. 管理yum源需要一个工具createrepo
可使用yum安装:
yum -y install createrepo
1. 规划、创建yum源目录。
这里我们使用http服务模式的,故我已安装有web服务.
我在 http://192.168.0.157/ 跟目录下创建一个yum 目录,用来保存yum源数据。
观察官方yum源的目录规划,像是yum并不能自己维护arch,即并不能自己区分i386还是x86_64,所以是单独放在不同的目录下。
因为我们的服务器都是64位的,故只创建一个x64的目录。
我维护的是基于CentOS Linux 7的包,规划目录如下:
mkdir -p /opt/htdocs/yum/centos/7/x86_64
2. 初始化repodata信息:
createrepo -p -d -o /opt/htdocs/yum/centos/7/x86_64 /opt/htdocs/yum/centos/7/x86_64
( 这里注意 /opt/htdocs/yum/centos/7/x86_64 需要填写2次,已空格隔开,否则会报Error: Must specify a directory to index. )
初始化成功后,会在/opt/htdocs/yum/centos/7/x86_64目录下,分别看到一个repodata目录,这个就是yum源的Meta数据,有了这个,yum就可以和这个“源”进行“数据信息”了。
3. 配置本地的yum,使之使用自建的yum源。
简单的来说,就是在本地的/etc/yum.repos.d目录下新建一个配置文件文件(也可配置语句添加到已经存在文件中),以.repo为文件名后缀,比如jicki.repo,然后内容大概如下:
-------------------------------------------------------------------
[jicki-yum]
name=jicki-yum
baseurl=http://192.168.0.157/yum/centos/$releasever/$basearch/
enabled=1
gpgcheck=0
gpgkey=
-------------------------------------------------------------------
解释:
[....] 代表这个库的名字,必须是唯一的,不可以重复。
name= 是这个库的说明,没有太大的实际意义,只是一个字段说明。
baseurl= 说明采取什么方式传输,具体路径在哪里,可以使用的方式有,file://,ftp://,http://等,关于baseurl中的变量,可以查看yum.conf 的手册:man yum.conf ,在手册的最后一段有详细描述。
enabled=1 说明启用这个更新库,0表示不启用。
gpgcheck=1 表示使用gpg文件来检查软件包的签名
gpgkey= 表示gpg文件所存放的位置,此处也可以有http方式的位置。
这时,当我们yum repolist 时,就可以看到jicki-yum 源了。
二,制作RPM包:
1. 首先检查 制作RPM包所需软件, 并安装
rpm -qa|grep gcc
rpm -qa|grep rpm-build
yum install -y rpm-build
centos7 下的rpm 包制作源码锁在目录为/root/rpmbuild 如果不存在,随意对文件执行rpmbuild nginx-1.7.9.tar.gz ,既可生成。
/root/rpmbuild 目录结构如下:
BUILD -> 编译位置(忽略)
BUILDROOT -> 编译位置(忽略)
RPMS ->生成的二进制rpm存放位置
SOURCES ->存放源码,补丁文件
SPECS ->存放编译方案*.spec规则文件
SRPMS ->生成rpm源码包(src.rpm)存放位置
2. 拷贝源码到SOURCES 目录下
这里将nginx-1.7.9.tar.gz 拷贝过去
cp nginx-1.7.9.tar.gz /root/rpmbuild/SOURCES/
tree
.
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│ └── nginx-1.7.9.tar.gz
├── SPECS
└── SRPMS
生成spec 规则文件
进入SPECS 目录 创建一个nginx-1.7.9的spec文件
* 这里必须使用 VIM 编译工具才会自动生成spec 模版文件
vim nginx-1.7.9.spec
spec文件说明 spec文件中各部分意思简单解释如下:
---------------------------------------------------------------------------------------------------------------------------
Name: //软件名称,如nginx,后面可使用%{name}的方式引用
Version: //软件版本号,仅当软件较以前有较大改变时才增加版本号。如1.7.9
Release:1%{?dist} //软件发布序列号,标明第几次打包。若软件较以前改变较小,则仅增加发布序列号,而不改变版本号
Summary: //概要,对软件简单的描述
Group: //软件包所属类别,具体类别参看rpm的帮助文件 /usr/share/doc/rpm-4.8.0/GROUPS,所有软件必须属于其中一种类型。
License: //许可类型,如:GPL(自由软件),commercial(商业),Share(共享),GNU等
URL: //软件下载地址(可以省略)
Source0: //源码名称
BuildRoot: %(mktemp-ud%{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
//该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT方式引用。
BuildRequires: //软件依赖关系描述(可以省略)
Requires: //该rpm包所依赖的软件包名称
%description //对软件的详细描述,可以写多行
%prep //这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。
%setup -q //提取源码到BUILD目录;-q指不显示输出(quietly)
%build //本段是建立段,所执行的命令为生成软件包服务,相当于./configure和make %configure make%{?_smp_mflags}
%install //这一节主要用于完成实际安装软件必须执行的命令,这一节一般是由makeinstall指令构成,但是有时也会包含cp、mv、install等指令
rm -rf $RPM_BUILD_ROOT makeinstall DESTDIR=$RPM_BUILD_ROOT
%clean //这一节所描述的内容表示在完成包建立的工作之后,自动执行此节 下的脚本进行附加的清除工作,这一节的内容通常简单地使用rm -rf $RPM_BUILD_ROOT命令,不需要指定此节的其它内容
rm-rf $RPM_BUILD_ROOT
%files //这一节指定构成包的文件的列表,它是使用节前缀%files表示的。 此外,它还包含一系列宏控制安装后的文件属性和配置信息。,分为三类--说明文档(doc),配置文件(config)及执行程序,也根据提示编写。%files下列出应该捆绑到RPM中的文件,并能够可选地设置许可权和其它信息
%defattr(-,root,root,-)//指定包装文件的属性,分别是(mode,owner,group),-表示默认值, 对文本文件是0644,可执行文件是0755 %doc
%changelog //本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发 布的软件包中
-------------------------------------------------------------------------------------------
--------------------------------