安裝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.