Centos-rpm包制作


目标:把lsyncd-2.0.5.tar.gz制作成lsyncd-2.0.5.rpm

1.搭建好本地yum源:

a.cd /etc/yum.repo/

b.制作一个centos.repo,并把当前的其他仓库文件移除到/root,目的是避免影响你的centos-yum源。

[root@teacher yum.repos.d]# cat centos.repo

[base]

name=CentOS-$releasever - Base - 163.com

baseurl=http://vault.centos.org/6.3/os/i386/  #官方yum源地址

gpgcheck=0


2.下载软件源码包   (也可以直接下载srpm包制作,安装后会有做好的.spec文件)

RPM-GPG-KEY-CentOS-Security-6

RPM-GPG-KEY-CentOS-Testing-6

Packages/

Packages/389-ds-base-1.2.9.14-1.el6.i686.rpm

Packages/389-ds-base-devel-1.2.9.14-1.el6.i686.rpm

Packages/389-ds-base-libs-1.2.9.14-1.el6.i686.rpm

Packages/ConsoleKit-0.4.1-3.el6.i686.rpm

Packages/ConsoleKit-devel-0.4.1-3.el6.i686.rpm

Packages/ConsoleKit-docs-0.4.1-3.el6.i686.rpm

Packages/ConsoleKit-libs-0.4.1-3.el6.i686.rpm

...此处省略...

[server]

name=server

baseurl=ftp://192.168.0.254/centos6.2/

enabled=1

gpgcheck=1

gpgkey= ftp://192.168.0.254/centos6.2/RPM-GPG-KEY-CentOS-6

[root@server ~]# rsync -avz rsync://192.168.0.254/centos /var/ftp/centos


3.下载源码软件包:lsyncd-2.0.5.tar.gz     #可以在谷歌里面搜索下载


a.首先检查本地的编译环境和 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@qingfeng ~]# rpm -qa |grep rpm-build    没有提示,则说明没有安装rpmbuild命令

[root@qingfeng ~]# yum install -y rpm-build   //默认没有安装 rpm-build


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@qingfeng ~]# ls rpmbuild/

BUILD BUILDROOT RPMS SOURCES SPECS SRPMS


图示:wKiom1NKVAuxiDBSAAGw8djmvkY392.jpg


b.拷贝源码到 SOURCES 目录

拷贝 lsyncd 源码到/root/rpmbuild/SOURCES 目录下

[root@qingfeng ~]# cp lsyncd-2.0.5.tar.gz /root/rpmbuild/SOURCES/

[root@qingfeng ~]# cd rpmbuild/

[root@qingfeng rpmbuild]# tree

.

├── BUILD

├── BUILDROOT

├── RPMS

├── SOURCES

│ └── lsyncd-2.0.5.tar.gz

├── SPECS

└── SRPMS

6 directories, 1 file


c.生成spec文件

wKioL1NKVIDzNONXAAFrnXJjGfI034.jpg

Name: //软件名称,如 lsyncd,后面可使用%{name}的方式引用

Version: //软件版本号, 仅当软件较以前有较大改变时才增加版本号。 如 2.0.5

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 //这一节主要用于完成实际安装软件必须执行的命令,这一节一般是由

make install 指令构成,但是有时也会包含 cp、mv、install 等指令

rm -rf $RPM_BUILD_ROOT

make install 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 //本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发

布的软件包中


d.解压源码:

[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'


d. 执行 make install 命令,看安装过程中,执行了那些操作

[root@server lsyncd-2.0.5]# make install

make[1]: Entering directory `/usr/src/lsyncd-2.0.5'

test -z "/usr/local/bin" || /bin/mkdir -p "/usr/local/bin"

/usr/bin/install -c 'lsyncd' '/usr/local/bin/lsyncd'

test -z "/usr/local/share/doc/lsyncd/" || /bin/mkdir -p "/usr/local/share/doc/lsyncd/"

/usr/bin/install -c -m 644 'examples/lbash.lua' '/usr/local/share/doc/lsyncd//lbash.lua'

/usr/bin/install -c -m 644 'examples/lecho.lua' '/usr/local/share/doc/lsyncd//lecho.lua'

/usr/bin/install -c -m 644 'examples/lgforce.lua' '/usr/local/share/doc/lsyncd//lgforce.lua'

/usr/bin/install -c -m 644 'examples/lp_w_picpathmagic.lua'

'/usr/local/share/doc/lsyncd//lp_w_picpathmagic.lua'

/usr/bin/install -c -m 644 'examples/lpostcmd.lua'

'/usr/local/share/doc/lsyncd//lpostcmd.lua'

/usr/bin/install -c -m 644 'examples/lrsync.lua' '/usr/local/share/doc/lsyncd//lrsync.lua'

/usr/bin/install -c -m 644 'examples/lrsyncssh.lua'

'/usr/local/share/doc/lsyncd//lrsyncssh.lua'

test -z "/usr/local/share/man/man1" || /bin/mkdir -p "/usr/local/share/man/man1"

/usr/bin/install -c -m 644 './doc/lsyncd.1' '/usr/local/share/man/man1/lsyncd.1'

test -z "" || /bin/mkdir -p ""

make[1]: Leaving directory `/usr/src/lsyncd-2.0.5'


这一段输出中红字部分就是 lsyncd-2.0.5.spec 文件中“%install”后面需要填写的内容,表

示安装哪些文件到哪些路径下,但要修改格式。

1. 将这一段内容中所有的/usr/local 修改为变量$RPM_BUILD_ROOT, 因为制作 rpm 包时并

不需要将文件安装到实际的路径,所以暂时安装在$RPM_BUILD_ROOT 中,其实就是

/root/rpmbuild/BUILDROOT/lsyncd-2.0.5-1.el6.i386 这个临时目录。

2. 将这一段内容中所有的单引号去掉或者换成双引号,因为要允许变量。

2.9 修改后的内容如下,将此部分填入 lsyncd-2.0.5.spec 文件中“%install”后面



[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 的内容。



完整的.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


3.spec文件无误后

[root@vmware1 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


最后制作完成!

指导老师:双星科技-冯老师