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
图示:
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文件
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/limagemagic.lua'
'/usr/local/share/doc/lsyncd//limagemagic.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/limagemagic.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/limagemagic.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/limagemagic.lua"
"$RPM_BUILD_ROOT/share/doc/lsyncd//limagemagic.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/limagemagic.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/limagemagic.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
最后制作完成!
指导老师:双星科技-冯老师