安装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
4.4.1. RPM_directory_macros
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
4.4.2. --define 专递模板变量
spec 文件中定义宏默认值
%define <variable> <value>
另一种是在外部传递变量值
rpmbuild -ba SPECS/bacula.spec --define "build_su110 1" --define "build_mysql4 1"
注意:当两种同时使用时,外部--define无法替代%define 的定义。
4.4.3.
查看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.
4.4.4. FAQ
error: File /home/neo/rpmbuild/SOURCES/netkiller-docbook-1.0.1.tar.gz: No such file or directory
Source 定义的文件不存在,如果你需要忽略Source可以使用 %setup -T
Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a>comments powered by Disqus
原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。