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
最後製作完成!
指導老師:雙星科技-馮老師