安裝rpmbuild,我們將使用它來製作rpm包
yum search rpm-build yum install -y rpm-build
Debian: sudo apt-get install rpm
rpm 工作空間,預設是/usr/src/redhat/
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
echo "%_topdir /home/neo/rpmbuild" >> ~/.rpmmacros
echo "%packager Test User <test@example.com>" >> ~/.rpmmacros
cat ~/.rpmmacros
touch ~/rpmbuild/SPECS/package-1.0.spec
準備好你的檔案包
tar zcvf %{name}-%{version}.tar.gz your_dir
編輯spec檔案
vim ~/rpmbuild/SPECS/package-1.0.spec
Summary: My Test Package
Name: test
Version: 1.0
Release: 1.0
License: BSD
# group you want your package in, mostly for GUI package browsers
# some example groups used by vendors:
# http://www.rpmfind.net/linux/RPM/Groups.html
Group: Networking/Daemons
# your name for example
Packager: Neo Chen <openunix@163.com>
#
#Source: http://full.url.to.the/package/%{name}-%{version}.tar.gz
Source: %{name}-%{version}.tar.gz
# list all your patches here:
#Patch:
# list all packages required to build this package
#BuildRequires:
#Provides:
# list all packages that conflict with this one:
#BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRoot: %{_tmppath}/%{name}-%{version}
####
# full length description
%description
description
#####
# this prepares a fresh build directory in ~/build/BUILD, useful macros here
# are:
# %setup - cleans any previous builds and untargzips the source
# %patch - applies patches
# any other commands here are executed as standard sh commands
%prep
%setup
#%patch
#####
# this tells rpmbuild how to build your package, rpmbuild runs it as a sh
# script
%build
#make
#####
# all the steps necessary to install your package into $RPM_BUILD_ROOT
# first step is to clear $RPM_BUILD_ROOT
%install
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
cp -r ../* %{_tmppath}
#install all files under RPM_BUILD_ROOT
#make install DESTDIR=$RPM_BUILD_ROOT
# now you can remove uneeded stuff
#rm -f $RPM_BUILD_ROOT{_prefix}
#####
# NOTE: this section is optional
# commands run just before the package is installed
%pre
#/usr/sbin/useradd -c "test user" -r -s /bin/false -u 666 -d / neo 2> /dev/null
#####
# NOTE: this section is optional
# commands run before uninstalling the software
%preun
#/sbin/service test stop > /dev/null 2>&1
#/sbin/chkconfig --del test
#####
# NOTE: this section is optional
# commands run after installing the package
%post
#/sbin/chkconfig -add test
#touch /var/log/test
#####
# NOTE: this section is optional
# commands run after unistalling the package
%postun
#/sbin/service test stop
#/usr/sbin/userdel test
#####
# list all the files that are part of the package. If a file is not in the
# list rpmbuild won't put it in the package
# see below on how to automate the process of creating this list.
# some useful macros here:
# %doc /path/to/filename - installs filename into /path/to/filename and marks
# it as being documentation
# %config /etc/config_file - similar for configuration files
# %attr(mode, user, group) file - lets you specify file attributes applied
# during installation, use - if you want to use defaults
%files
#/usr/bin/test
#/usr/sbin/test
# this will package the dir and all directories inside it
#/example/of/a/dir
/srv/neo
# this will package only the 'dir' directory
#%dir /example/of/a/dir
#####
# document changes between package releases
%changelog
開始製作rpm檔案
rpmbuild -ba ~/rpmbuild/SPECS/package-1.0.spec
查看你的rpm檔案包含檔案列表
rpm -qpl /usr/src/redhat/RPMS/x86_64/test-1.0-1.0.x86_64.rpm /srv /srv/bin /srv/bin/console /srv/bin/nodekeeper /srv/etc /srv/etc/commands.cfg /srv/etc/nodekeeper.cfg /srv/etc/protocol.cfg /srv/logs /srv/logs/nodekeeper.log /srv/run /srv/run/nodekeeper.pid
安裝RPM
# rpm -Uvh --nodeps /tmp/test-1.0-1.0.x86_64.rpm Preparing... ########################################### [100%] 1:test ########################################### [100%]
也可以使用 yum 安裝
yum localinstall /tmp/test-1.0-1.0.x86_64.rpm
查看安裝信息
# rpm -qi test Name : test Relocations: (not relocatable) Version : 1.0 Vendor: (none) Release : 1.0 Build Date: Wed 21 Sep 2011 05:50:54 PM CST Install Date: Wed 21 Sep 2011 05:46:50 PM CST Build Host: dev3.example.com Group : Networking/Daemons Source RPM: test-1.0-1.0.src.rpm Size : 20373 License: BSD Signature : (none) Packager : Neo Chen <openunix@163.com> Summary : My Test Package Description : description
是使用yum info 查看信息
# yum info test
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* extras: mirrors.163.com
* updates: mirrors.163.com
Installed Packages
Name : test
Arch : x86_64
Version : 1.0
Release : 1.0
Size : 20 k
Repo : installed
Summary : My Test Package
License : BSD
Description:
: description
http://fedoraproject.org/wiki/Packaging/RPMMacros#RPM_directory_macros
%{_sysconfdir} /etc
%{_prefix} /usr
%{_exec_prefix} %{_prefix}
%{_bindir} %{_exec_prefix}/bin
%{_lib} lib (lib64 on 64bit systems)
%{_libdir} %{_exec_prefix}/%{_lib}
%{_libexecdir} %{_exec_prefix}/libexec
%{_sbindir} %{_exec_prefix}/sbin
%{_sharedstatedir} /var/lib
%{_datadir} %{_prefix}/share
%{_includedir} %{_prefix}/include
%{_oldincludedir} /usr/include
%{_infodir} /usr/share/info
%{_mandir} /usr/share/man
%{_localstatedir} /var
%{_initddir} %{_sysconfdir}/rc.d/init.d
Note: On releases older than Fedora 10 (and EPEL), %{_initddir} does not exist. Instead, you should use the deprecated%{_initrddir} macro.
RPM directory macros
%{_topdir} %{getenv:HOME}/rpmbuild
%{_builddir} %{_topdir}/BUILD
%{_rpmdir} %{_topdir}/RPMS
%{_sourcedir} %{_topdir}/SOURCES
%{_specdir} %{_topdir}/SPECS
%{_srcrpmdir} %{_topdir}/SRPMS
%{_buildrootdir} %{_topdir}/BUILDROOT
Note: On releases older than Fedora 10 (and EPEL), %{_buildrootdir} does not exist.
Build flags macros
%{_global_cflags} -O2 -g -pipe
%{_optflags} %{__global_cflags} -m32 -march=i386 -mtune=pentium4 # if redhat-rpm-config is installed
Other macros
%{_var} /var
%{_tmppath} %{_var}/tmp
%{_usr} /usr
%{_usrsrc} %{_usr}/src
%{_docdir} %{_datadir}/doc
spec 檔案中定義宏預設值
%define <variable> <value>
另一種是在外部傳遞變數值
rpmbuild -ba SPECS/bacula.spec --define "build_su110 1" --define "build_mysql4 1"
注意:當兩種同時使用時,外部--define無法替代%define 的定義。
查看GPG證書
$ gpg --list-keys /home/neo/.gnupg/pubring.gpg ---------------------------- pub 1024R/63268A35 2013-09-11 uid Neo Chen (netkiller) <netkiller@msn.com> sub 1024R/F4F946F9 2013-09-11
設置 _gpg_name 宏,與上面查看結果需一致
cat << EOF >> ~/.rpmmacros %_signature gpg %_gpg_name Neo Chen (netkiller) <netkiller@msn.com> %_gpgpath ~/.gnupg %_gpgbin /usr/bin/gpg EOF
建立RPM
rpmbuild --define "_topdir /path/to/macrodir" -bb --sign spec
如果你的證書有Passphrase,會提示你輸入了密碼。
Enter pass phrase: Pass phrase is good.