zoukankan      html  css  js  c++  java
  • 构建RPM之SPEC详解

    一.简单说明

    在centos/rhel的系统使用中,我们会涉及自己构建一些rpm包在centos/rhel的系统中进行安装,这里涉及rpm打包环境的部署、SPEC文件的编写相关,下面我们具体进行说明。

    二.部署rpm打包环境

    2.1 安装rpm-build的相关rpm包

    yum -y install rpm-build rpmdevtools
    

    2.2 生成打包目录结构

    [root@centos7 ~]# rpmdev-setuptree
    [root@centos7 rpmbuild]# ls /root/rpmbuild/
    BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS
    

    目录解释:

    • BUILD:源码解压后存放的目录
    • RPMS:制作完成后的RPM存放目录
    • SOURCES:存放源文件,配置文件,补丁文件等放置的目录
    • SPECS:存放SPEC文件,制作RPM包的目录
    • SRPMS:src格式的RPM包目录
    • BUILDROOT:虚拟安装目录,在整个install的过程中临时安装到此目录,把这个目录当做根来使用。所有在这个目录下的文件才是真正的目录文件,最后SPEC文件中有清理阶段,这个目录下的内容将被删除。

    2.3 改变打包目录

    这里在2.2章节我们默认生成的rpmbuild目录在/root目录下,如果我们想将构建RPM包的打包目录改变其它目录,可以参照如下方式进行:
    例如,我们将rpmbuild目录移动到/home目录:

    [root@centos7 ~]# mv /root/rpmbuild /home 
    [root@centos7 ~]# vi /root/.rpmmacros
    [root@centos7 ~]# vi /root/.rpmmacros 
    # 这里改变%_topdir的目录为新移动的rpm构建目录
    %_topdir /home/rpmbuild
    
    %_smp_mflags %( 
        [ -z "$RPM_BUILD_NCPUS" ] \
            && RPM_BUILD_NCPUS="`/usr/bin/nproc 2>/dev/null || \
                                 /usr/bin/getconf _NPROCESSORS_ONLN`"; \
        if [ "$RPM_BUILD_NCPUS" -gt 16 ]; then \
            echo "-j16"; \
        elif [ "$RPM_BUILD_NCPUS" -gt 3 ]; then \
            echo "-j$RPM_BUILD_NCPUS"; \
        else \
            echo "-j3"; \
        fi )
    
    %__arch_install_post 
        [ "%{buildarch}" = "noarch" ] || QA_CHECK_RPATHS=1 ; 
        case "${QA_CHECK_RPATHS:-}" in [1yY]*) /usr/lib/rpm/check-rpaths ;; esac 
        /usr/lib/rpm/check-buildroot
    %debug_package %{nil}
    

    改变后,我们可以通过如下的命令查看工作目录的路径:

    [root@centos7 rpmbuild]# rpmbuild --showrc | grep topdir
    -14: _builddir	%{_topdir}/BUILD
    -14: _buildrootdir	%{_topdir}/BUILDROOT
    -14: _rpmdir	%{_topdir}/RPMS
    -14: _sourcedir	%{_topdir}/SOURCES
    -14: _specdir	%{_topdir}/SPECS
    -14: _srcrpmdir	%{_topdir}/SRPMS
    -14: _topdir	/home/yushengyin/rpmbuild
    

    三.SPEC文件详解

    RPM包的SPEC文件有许多配置信息,包含:软件基础信息、安装卸载前后执行的脚本、对源码包打补丁、解压、编译、安装等。
    SPEC文件中包含了很多关键字,具体参考如下:

    • Name: 软件包的名称,在后面的变量中即可使用%{name}的方式引用
    • Summary: 软件包的内容
    • Version: 软件的实际版本号,例如:1.12.1等,后面可使用%{version}引用
    • Release: 发布序列号,例如:1%{?dist},标明第几次打包,后面可使用%{release}引用
    • Group: 软件分组,建议使用:Applications/System
    • License: 软件授权方式GPLv2
    • Source: 源码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
    • BuildRoot: 这个是安装或编译时使用的临时目录,即模拟安装完以后生成的文件目录:%_topdir/BUILDROOT 后面可使用$RPM_BUILD_ROOT 方式引用。
    • URL: 软件的URI
    • Vendor: 打包组织或者人员
    • Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
    • Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
    • Prefix: %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
    • Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
      libxxx-devel >= 1.1.1 openssl-devel 。 注意:“>=”号两边需用空格隔开,而不同软件名称也用空格分开
    • %description: 软件的详细说明
    • %define: 预定义的变量,例如定义日志路径: _logpath /var/log/weblog
    • %prep: 预备参数,通常为 %setup -q
    • %build: 编译参数 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx/……
    • %install: 安装步骤,此时需要指定安装路径,创建编译时自动生成目录,复制配置文件至所对应的目录中
    • %pre: 安装前需要做的任务,如:创建用户
    • %post: 安装后需要做的任务 如:自动启动的任务
    • %preun: 卸载前需要做的任务 如:停止任务
    • %postun: 卸载后需要做的任务 如:删除用户,删除/备份业务数据
    • %clean: 清除上次编译生成的临时文件,就是上文提到的虚拟目录
    • %files: 设置文件属性,包含编译文件需要生成的目录、文件以及分配所对应的权限
    • %changelog: 修改历史

    四.构建RPM包

    这里,我们制作一个RPM包用于配置centos7.x各系统之间的无密钥访问:

    4.1 创建ssh-no-rsa的源文件

    [root@centos7 SOURCES]# mkdir ssh-no-rsa-1.0.0
    # 将涉及到的无密钥访问的文件移动到源码目录
    [root@centos7 SOURCES]# cp -a {authorized_keys,id_rsa.pub,id_rsa} ssh-no-rsa-1.0.0
    

    4.2 创建一个spec文件

    [root@centos7 SPECS]# touch ssh-no-rsa-1.0.0.spec
    [root@centos7 SPECS]# vim ssh-no-rsa-1.0.0.spec
    [root@centos SPECS]# cat ssh-no-rsa-1.0.0.spec 
    #----------------------------------------------------------------------------------------------------------------------------------
    Name:		ssh-no-rsa
    Version:        1.0.0
    Release: 	0
    Summary:        kubernetes system config 
    License: 	Shareware
    Source0: 	%{name}-%{version}
    
    # 这里我们定义一个无密钥访问时密钥的存放目录
    %define sshdir /root/.ssh
    
    %description
    ssh and other config
    
    %install
    # 创建上面定义的无密钥存放目录,注意使用-d
    install -d -m 0700 %{buildroot}%{sshdir}
    # 安装无密钥访问的文件到指定的目录
    install -D -p -m 0755 %{SOURCE0}/authorized_keys %{buildroot}%{sshdir}/authorized_keys
    install -D -p -m 0755 %{SOURCE0}/id_rsa.pub %{buildroot}%{sshdir}/id_rsa.pub
    install -D -p -m 0755 %{SOURCE0}/id_rsa %{buildroot}%{sshdir}/id_rsa
    
    %pre
    rm -rf %{sshdir}/{authorized_keys,id_rsa.pub,id_rsa}
    
    %postun
    rm -rf %{sshdir}
    
    %clean
    [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
    
    %files 
    %attr(-,root,root) %{sshdir}/*
    
    
    %changelog
    * Mon Apr 20 2020 yuhaohao <yuhaohaozz@163.com>
    - 1.配置无密钥访问
    

    4.3 构建rpm包

    [root@centos7 SPECS]# rpmbuild -bb ssh-no-rsa-1.0.0.spec
    # 构建成功后,查看构建的RPM
    [root@centos7 SPECS]# ls /home/rpmbuild/RPMS/x86_64/ssh-no-rsa-1.0.0-0.x86_64.rpm 
    /home/rpmbuild/RPMS/x86_64/ssh-no-rsa-1.0.0-0.x86_64.rpm
    # 查看RPM包内容
    [root@centos7 SPECS]# rpm -qpl /home/rpmbuild/RPMS/x86_64/ssh-no-rsa-1.0.0-0.x86_64.rpm
    /root/.ssh/authorized_keys
    /root/.ssh/id_rsa
    /root/.ssh/id_rsa.pub
    

    4.4 验证安装

    [root@centos ~]# rpm -ivh ssh-no-rsa-1.0.0-0.x86_64.rpm 
    Preparing...                          ################################# [100%]
    Updating / installing...
       1:ssh-no-rsa-1.0.0-0               ################################# [100%]
    

    0K,到这里我们成功创建了一个RPM。

    总结:RPM包的构建本身是个比较简单的过程,但是还是要结合实际的业务需求去定制。定制时,需要考虑整个安装流程需要考虑流程。

  • 相关阅读:
    I.MX6 mkuserimg.sh 使用
    【HighCharts系列教程】五、版权属性——Credits
    【HighCharts系列教程】四、颜色属性——colors
    【HighCharts系列教程】三、图表属性——chart
    【HighCharts系列教程】二、Highcharts结构及API文档
    【HighCharts系列教程】一、认识Highcharts
    higncharts 编辑Highcharts.com链接
    higncharts 去掉Highcharts.com链接
    Highcharts一些属性
    如何用easyui+JAVA 实现动态拼凑datagrid表格
  • 原文地址:https://www.cnblogs.com/yuhaohao/p/12894875.html
Copyright © 2011-2022 走看看