自制rpm包
- 前言
要想制作一个rpm软件包就必须写一个软件包描述文件(SPEC)。这个文件中包含了软件包的诸多信息,
如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要包含的文件列表等等。
- 安装rpmbuild命令
yum install rpm-build redhat-rpm-config make gcc
- 创建RPM构建环境
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
- nginx.sqec示例
%define nginx_home /usr/local/nginx #userpath /var/www/html/demo Summary: nginx 1.17.5 #软件包的内容概要 Name: nginx-waf1.17.5 #软件包的名字,最终RPM软件包是用该名字与版本号,释出号及体系号来命名软件包的 Version: 1.17.5 #版本 Release: 2%{?dist} #布序列号,标明第几次打包,后面可使用%{release}引用 License: GPL #软件授权方式,通常是GPL(自由软件)或GPLv2,BSD Group: Applications/System #软件包所属类别 应用/系统 Source0: nginx-1.17.5.tar.gz #源码包名称(可以使用URL),可以用SourceN指定多个,如配置文件 Source1: nginx-waf.conf Source2: ingress-healthcheck.conf Source3: mod BuildRoot: %{_tmppath}/nginx-%{version}-%{release}-root #这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{_tmppath}/%{name}-%{version}-root BuildRequires: gcc,make #定义构建时依赖的软件包,在构建机器编译 rpm 包时需要的辅助工具,以逗号分隔。假如,要求编译myapp
时,gcc 的版本至少为 4.4.2,则可以写成gcc >=4.2.2
Requires: pcre,pcre-devel,openssl #定义安装时的依赖包,该 rpm 包所依赖的软件包名称,就是指编译好的 rpm 软件在其他机器上安装时,需要依赖的其他软件包 %description #软件的详细说明 %prep #这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备 %setup -q -n nginx-1.17.5 #%setup -n %{name}-%{version} 把源码包解压并放好 通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中 %build #开始构建包 在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作 ,常见写法make %{?_smp_mflags} OPTIMIZE="%{optflags}" patch -p1 < /root/rpmbuild/SOURCES/nginx_upstream_check_module-master/check_1.12.1+.patch #%patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录 此时,patch会忽略掉第1个”/”之前的内容,认为原始文件是 ./A, ./configure --prefix=/usr/local/nginx --with-http_sub_module --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=/root/rpmbuild/SOURCES/nginx-sticky-module-1.1 --add-module=/root/rpmbuild/SOURCES/nginx_upstream_check_module-master --add-module=/root/rpmbuild/SOURCES/ngx_devel_kit-0.3.0rc1 --add-module=/root/rpmbuild/SOURCES/lua-nginx-module-0.10.13 --add-module=/root/nginx-module-vts-0.1.18 --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" --with-stream make %install #开始把软件安装到虚拟的根目录中,本段是安装段,其中的命令在安装软件包时将执行 rm -rf %{buildroot} make install DESTDIR=%{buildroot} mkdir %{buildroot}%{nginx_home}/conf/conf.d %{__install} -p -D %{SOURCE1} %{buildroot}%{nginx_home}/conf/nginx.conf %{__install} -p -D %{SOURCE2} %{buildroot}%{nginx_home}/conf/ingress-healthcheck.conf cp -r %{SOURCE3} %{buildroot}%{nginx_home}/conf/ %post #脚本区域增加 cat <<EOF > /lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true LimitNOFILE=65500 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable nginx %preun #卸载前执行的脚本 systemctl stop nginx %postun # 卸载后执行的脚本 %preun %postun 的区别前者在升级的时候会执行,后者在升级rpm包的时候不会执行 systemctl disable nginx rename nginx nginx.`date +%Y%m%d` %{nginx_home} %clean # 清理临时文件 rm -rf %{buildroot} %files #定义那些文件或目录会放入rpm中 %defattr(-,root,root,-) #指定包装文件的属性 /usr/local/nginx/ %config(noreplace) /usr/local/nginx/conf/* #表明这是个配置文件noplace表明不能替换
- 打包命令
rpmbuild -bb nginx.spec
- 文档
https://www.cnblogs.com/schangech/p/5641108.html https://blog.csdn.net/zhangmeimei_pku/article/details/79483692 http://dries.eu/rpms/python-ethtool/python-ethtool https://www.cnblogs.com/sunshine-long/p/9809042.html https://blog.csdn.net/it_way/article/details/17559369description https://www.ibm.com/developerworks/cn/linux/l-rpm/ https://wiki.centos.org/HowTos/SetupRpmBuildEnvironment