zoukankan      html  css  js  c++  java
  • 自制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
  • 相关阅读:
    错误解决mysql
    (一)熟悉执行流程——基于ThinkPHP3.2的内容管理框架OneThink学习
    版权控制之zend guard 6.0使用教程
    IP进制站群原理
    多线程更新已排序的Datagridview数据,造成数据错位
    压缩html 减小存储空间
    DataGridView导入导出excel
    软件下载目录
    java反射
    JTA
  • 原文地址:https://www.cnblogs.com/jiaqili/p/14279793.html
Copyright © 2011-2022 走看看