热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

CentOS系统下软件包的制作方法和过程

总的情况下Linux下软件安装主要有三种方式:一种是源码安装,需要用户自己手动编译另一种是RPM包(RedHatLinuxPacketManager),通过RPM命令就可以实现安装还有一种为*.bin文件,安装方法与Windows下的安装过程类似通常情况下Linux安装软件主要通过以下两种方式①文件名形如xxx.i386.rpm,软件包以二进制形式发布.② 

总的情况下Linux下软件安装主要有三种方式:
一种是源码安装,需要用户自己手动编译
另一种是RPM包(RedHat Linux Packet Manager),通过RPM命令就可以实现安装
还有一种为*.bin文件,安装方法与Windows下的安装过程类似


通常情况下Linux 安装软件主要通过以下两种方式
①   文件名形如xxx.i386.rpm ,软件包以二进制形式发布.
②   文件名形如xxx.tar.gz ,软件包多以源码的形式发布.
Linux软件包管理可以分为三类:二进制包的管理,源代码包的管理,脚本安装

另外值得注意的是目前存在各种Linux的发行版获取和安装软件的方式也有很多例如
【】redhat/centos的yum安装(有专门的镜像源)
【】Ubuntu/Fedora/Debian的sudo apt-get适用于deb包进行管理安装
【】也有的软件是通过刻盘加密的形式然后进行安装的(例如cnyunwei)
【】在系统运维管理人员方面也有通过ssh、C/C++语言或者py执行的一些软件命令进行自动化管理的应用,这里就不做详细介绍了。

下面有一张图可以清晰地表示linux软件应用的架构关系:

在Linux启动的时候。首先会启动内核(kernel),内核是一段计算机程序,这个程序直接管理管理硬件,包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。我们可以看到,Linux利用kernel实现软硬件的对话。通过系统调用的这个重要的接口,Linux将上层的应用与下层的kernel完全分离开,为程序员隐藏了底层的复杂性(相应的,也提高了上层应用的可移植性)。当我们在升级kernel的时候,也可以保持系统调用的语句不变,从而让上层应用不感受到下层的改变。库函数利用系统调用创造出模块化的功能,而shell则提供了一个用户界面,并让我们可以利用shell的语法编写脚本,以整合程序。有了这些思想我们可以快速地了解linux的软件应用的安装和工作原理,也因此为了方便和获取更多企业应用我们需要在linux系统上开发并且通过源码编译的方式制作各种软件包从而为信息化时代服务。

本文主要介绍源码安装与RPM包的安装

源码包和商业软件包根据各个公司或作者的实际情况出发(可以是tar等格式的压缩包,也可以是bin的源程序,可以是已经编译好了的直接拿来运行的文件,也可以是光盘虚拟化文件等其他介质来制作发布的iso文件等)封装成一种特定的格式发布从而进行相应的软件服务。其实通过yum或者make install命令安装的软件在系统都会自动生成rpm包(只是参数和功能模块差异和严谨的)


简介:

RPM(RedHat Package Manager,红帽子软件包管理器)用于软件包的安装、查询、升级、校验、卸载,以及生成.rpm格式的软件包   RPM的使用前

挂载linux系统(centos4为例)的安装光盘,当然也可在网上下载免费的RPM包.
# mount/dev/cdrom           ---挂载光盘
# cd/media/cdrom/CentOS/RPMS ---进入光盘中RPM包的目录(可以通过#mount命令来查看光盘的挂载点一般会在最后一行显示)
# ls

一、源码包安装
1、*.src.rpm形式的源代码软件包
用法:
安装:   rpm ?rebuild *.src.rpm
cd /usr/src/dist/RPMS
            Rpm ?ivh *.rpm
卸载:   rpm ?e packagename

2、.tar.gz,*.tgz,*.bz2形式软件包的安装

首先进行解压,命令如下
     tar zxvf   *.tar.gz
     tar xvfz   *.tgz
     tar xvfj    *.tar.bz2
解压之后进入解压目录,然后进行以下操作(一般情况,具体看软件包的文件名)
配置:./configure
编译:make
安装:make install
卸载:make uninstall

源码安装有一定的难度,不同的软件可能有不同的安装,一般在解压之后应该先阅读说明文档,按照说明进行安装,上面说的只是一般情况。

二、RPM包安装
     RPM安装包格式是由Redhat公司提出的,大大的简化了Linux下软件的安装,首先介绍一下通用选项。

     -v:显示附加信息

     -vv:显示调试信息

     --root directory:让RPM以directory作为根目录,这样预安装程序和后安装程序都会安装到这个目录下。

     1、安装:rpm ?i file.rpm

     Options:

    h:安装时输出hash记号

     test:只对安装进行测试,不真正安装

     --persent:以百分比形式显示安装进度

     --excludedocs:不安装软件包中的文档

     --replacepkgs:强制重新安装

     --replacefiles:替换属于其它软件包的文件

     --force:忽略软件包及文档冲突

     --ignorearch:不校验软件包结构

     --ignoreos:不检查软件包运行的操作系统

     --nodeps:不检查依赖性关系

--noscripts:不运行预安装和后安装脚本程序

     2、删除 rpm ?e

四 RPM包制作过程

1 准备打包环境
fedora系统下使用如下命令安装rpmbuild
#yum install rpmbuild
rpmbuild的工作目录如下,

~/rpmbuild

~/rpmbuild/SOURCES

~/rpmbuild/SPECS

~/rpmbuild/BUILD

~/rpmbuild/RPMS

~/rpmbuild/RPMS/i386

~/rpmbuild/SRPMS

如果你的用户目录主目录下没有类似目录结构,你可以通过一个工具软件来自动配置和生成,如下。

#yum installrpmdevtools

下了运行自动配置命令自动生成如上目录,并配置一些必要操作。

#rpmdev-setuptree

rpmdev-setuptree命令默认将再当前用户主目录下创建一个RPM构建根目录结构,

如果需要改变次默认位置,可以修改配置文件:~/.rpmmacros中变量_topdir对应
的值即可。

一般rpmbuild会在当前用户的主目录下自动建立如上目录结构,如果在你对应用户的构建目录中没有自动建立如上目录,你可以通过手动方式建立。上面目录的使用是这样分配的,SOURCES放置打包资源,包括源码打包文件和补丁文件等;SPECS目录放置SPEC文档;BUILD打包过程中的工作目录;RPMS目录存放生成的二进制包,RPM包根据硬件平台不同分类,i386表示生成i386结构的包将存放在该目录下;SRPMS目录存放生成的源码包。

2 撰写SPEC文档
SPEC撰写是打包RPM的核心,也算是最难的一步,好在我们可以从参照一个简单的模板文件开始,在可以实现基本功能的基础上再一步一步的扩充文档内容,直至完全达到要求。下面是一个简单的SPEC文档,其中包括了一些说明信息(注:#后面的内容为说明信息),该SPEC文档是对一个测试的软件项目hellorpm写的,hellorpm软件包编译后仅有一个执行文件、一个手册文件和一个项目说文件。
hellorpm.spec文档的内容如下:
-----------------------------------------------------------------------------
#软件包简要介绍
Summary: hellorpm is atest program。

#软件包的名字

Name: hellorpm      

#软件包的主版本号          

Version:2.2.6        

#软件包的次版本号            

Release: 1  

#源代码包,默认将在上面提到的SOURCES目录中寻找                      

Source0:%{name}-%{version}.tar.gz  

#授权协议

License: GPL              

#定义临时构建目录,这个地址将作为临时安装目录在后面引用

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root

#软件分类

Group:Development/Tools

#软件包的内容介绍            

%description                        

The hellorpm programis a test.

#表示预操作字段,后面的命令将在源码代码BUILD前执行

%prep                    

#构建BUILD环境,将解压源码压缩包到BUILD目录

%setup-q      

#BUILD字段,将通过直接调用源码目录中自动构建工具完成源码编译操作        

%build      

#调用源码目录中的configure命令          

./configure      

#在源码目录中执行自动构建命令make    

make          

#安装字段        

%install    

#调用源码中安装执行脚本            

makeDESTDIR=$RPM_BUILD_ROOT install

#文件说明字段,声明多余或者缺少都将可能出错

%files            

#设置文件权限属性      

%defattr(-,root,root)    

#声明/usr/local/bin/hellorpm将出现在软件包中    

/usr/local/bin/hellorpm    

#声明并设置文件属性  

%doc%attr(0444,root,root) /usr/local/man/man1/hellorpm.1

#同上,声明文档文件

%docREADME  
-------------------------------------------------------------------------------
这个文档需要说明的一点:

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root

上面BuildRoot变量表示的是源码的临时按照目录,rpmbuild就是通过次目录获得将要按照到系统中的所有文件,而在SPEC文档后面make install 命令中的参数DESTDIR=$RPM_BUILD_ROOT即是对该参数的引用,这个参数将传给Makefile文件一告诉自动构建工具应该安装文件那里(实际上我再前文提到过的Makefile需要作一些改造以适应RPM的构建就包括此操作,你的Makefile文件中至少要知道在RPM构建过程中引用此参数的值去控制安装操作的目标)。

如上一个简单的SPEC文档撰写完成,下面把一个名为hellorpm-2.2.6.tar.gz的源码压缩文件放到

rpmbuild根目录下的SOURCES目录下(注,确保此归档文件解压后的目录为hellorpm-2.2.6,
否则会有问题)。

到此一个完整的rpm打包环境已经构建完成,下面我们就可以开始构建二进制和源代码RPM包。

3 构建RPM包

构建RPM包是有命令rpmbuild在SPEC的指导下完成。

开始构建操作,首先进入到当前用户的rpmbuild根目录(即上面提到的目录环境)。

#cd ~/rpmbuild/

执行如何命令,-ba表示build all,即生成包括二进制包和源代码包的所有RPM包,下来如果正常的话,rpmbuild将正常退出,同时在RPMS目录和SRPMS目录中将生成对应的RPM包。

#rpmbuild -baSPECS/hellorpm.spec

这里仅仅介绍了一个最简单软件的最简单的RPM的打包操作过程,诸如带有共享文件的需要进行复杂配置的具有复杂依赖关系的等等的项目的打包以及后期的维护,包括补丁的制作我将在下来的时间完成补充更新,今天时间不早了,该休息了!
注:费了大半夜的功夫,搞出这么个令人不满意的文档,我思考着,这样做有多少意义呢?不敢重复发明轮子的,站到巨人的肩膀你才能看得更远,是这样吗?
是不是下周开始立个计划,每周至少翻译三篇fedora官网的文档给自己练练手。

[参考资料]
http://www.linuxsir.org/main/?q=node/50  RPM 的介绍和应用(北南兄)
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part3/ 用 RPM 打包软件
http://hlee.javaeye.com/blog/343499  RPM包rpmbuild SPEC文件深度说明(推荐浏览学习)

http://bbs.51cto.com/thread-921627-1.html   rpm包的制作简单化

http://www.cnblogs.com/Quains/archive/2012/01/03/2311049.html Linux软件包管理案例



推荐阅读
author-avatar
小肥沙沙2006_759
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有