• rpm软件打包


    需求背景

      临近项目结束,收尾工作还是给了自己,程工嫌弃之前源码安装的方式存在风险,自己就给自己找了一个活儿干。我提出两种打包方式:linux一种是打包成bin格式的软件包,另一种是rpm格式的软件包,由于软件包的生态环境问题,最后选择了rpm格式的软件包。主要是目标系统是centos维护比较方便。

    工具

      rpmbuild 或者 rpmdevtools

    打包细节

      1:安装工具

    1 yum  install rpmbuild or yum insyall rpmdevtools
    2 yum install tree
    3 yum install vim

      我个人比较倾向于rpmdevtools工具包

      2:工具使用:

      通过工具使用生成rpm软件包所需要的目录环境。

    1 rpmdev-setuptree

      操作过后生成如下的目录树

    1 $ tree rpmbuild
    2 rpmbuild
    3 ├── BUILD
    4 ├── RPMS
    5 ├── SOURCES
    6 ├── SPECS
    7 └── SRPMS

      没有安装工具包的话可以手动创建上面的目录树

    1 mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

      目录树中各个文件夹所代表的意思如下

    默认位置宏代码名称用途
    ~/rpmbuild/SPECS %_specdir Spec 文件目录 保存 RPM 包配置(.spec)文件
    ~/rpmbuild/SOURCES %_sourcedir 源代码目录 保存源码包(如 .tar 包)和所有 patch 补丁
    ~/rpmbuild/BUILD %_builddir 构建目录 源码包被解压至此,并在该目录的子目录完成编译
    ~/rpmbuild/RPMS %_rpmdir 标准 RPM 包目录 生成/保存二进制 RPM 包
    ~/rpmbuild/SRPMS %_srcrpmdir 源代码 RPM 包目录 生成/保存源码 RPM 包(SRPM)
    ~/rpmbuild/BUILDROOT %_buildrootdir 最终安装目录 保存 %install 阶段安装的文件

     实例,下面以f-stack为例生成rpm软件包

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    #rpm软件包构件过程
    ##
    ###环境搭建
        RPM打包使用的是rpmbuild命令
        yum install rpm-build
        当然也可以安装rpmdevtools
        yum install rpmdevtools

    ###rpm打包原理
        rpm打包的时候需要编译源码,还需要吧编译好的配置文件、二进制文件等按照安装好的样子放在合适的位置,还要根据需要对RPM的包进行测试,这些都需要现有一个工作空间。rpmbuild命令使用一套标准换的工作空间.
        rpmdev-setuptree
        上面的这个命令就是安装rpmdevtools带来的,可以看到运行上述命令以后,$HOME目录下多了一个叫rpmbuild的文件夹
        可以通过tree命令来查看目录结构
        [root@cluste-black-node1 ~]# tree rpmbuild
        rpmbuild
        ├── BUILD
        ├── RPMS
        ├── SOURCES
        ├── SPECS
        │   └── workspace.spec
        └── SRPMS
        
        5 directories, 1 file
    ###对上述名字大体上做一些讲解
        默认位置    宏代码    名称    用途
        ~/rpmbuild/SPECS        %_specdir        Spec 文件目录        保存 RPM 包配置(.spec)文件
        ~/rpmbuild/SOURCES        %_sourcedir        源代码目录            保存源码包(如 .tar 包)和所有 patch 补丁
        ~/rpmbuild/BUILD        %_builddir        构建目录                源码包被解压至此,并在该目录的子目录完成编译
        ~/rpmbuild/BUILDROOT    %_buildrootdir    最终安装目录            保存 %install 阶段安装的文件
        ~/rpmbuild/RPMS            %_rpmdir        标准 RPM 包目录        生成/保存二进制 RPM 包
        ~/rpmbuild/SRPMS        %_srcrpmdir        源代码 RPM 包目录        生成/保存源码 RPM 包(SRPM)

    ###
        打包的过程有点像是流水线,分好几个工序:
        1. 首先,需要把源代码放到%_sourcedir中;
        2. 然后,进行编译,编译的过程是在%_builddir中完成的,所以需要先把源代码复制到这个目录下边,一般情况下,源代码是压缩包格式,那么就解压过来即可;
        3. 第三步,进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%_buildrootdir中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%_buildrootdir下也按照同样的目录结构放置;
        4. 然后,需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉rpmbuild命令;
        5. 还有一步可选操作,那就是检查软件是否正常运行;
        6. 最后,生成的RPM包放置到%_rpmdir,源码包放置到%_srpmdir下。
        7. 以上这些步骤都是配置在SPEC文件中的,具体来说各个阶段:
        阶段            读取的目录        写入的目录        具体动作
        %prep        %_sourcedir        %_builddir        读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。
        %build        %_builddir        %_builddir        编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。
        %install    %_builddir        %_buildrootdir    读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。
        %check        %_builddir        %_builddir        检查软件是否正常运行。通过执行类似 make test 的命令实现。很多软件包都不需要此步。
        bin            %_buildrootdir    %_rpmdir        读取位于 %_buildrootdir 最终安装目录下的文件,以便最终在 %_rpmdir 目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录, noarch 目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。
        src            %_sourcedir        %_srcrpmdir        创建源码 RPM 包(简称 SRPM,以.src.rpm 作为后缀名),并保存至 %_srcrpmdir 目录。SRPM 包通常用于审核和升级软件包。










    ###f-stack 打包的SPEC文件内容如下
        Name: f-stack
        Version:    3.1
        Release:    1%{?dist}
        Summary:    f-stack  program change by semon who is from CSDN
        License: GPL
        
        Vendor: WangFei(NDSC)
        
        Source:f-stack-3.1.tar.gz
        
        #BuildRequires:
        Requires:zlib zlib-devel pcre pcre-devel openssl openssl-devel numactl-devel  gcc >= 4.8.5 gcc-c++ >= 4.8.5 
        
        %description
        The f-stack was change by semon for the scane of work.
        
        #%preun #安装前卸载的脚本
        
        
        #安装后启动的脚本
        %post
        
        # 安装前执行的脚本
        %prep 
        #自动解压源码包并cd进入目录
        %setup -q
        
        #%postun #安装后卸载的脚本
        
        %build     ##配置
        cd dpdk/x86_64-native-linuxapp-gcc
        make 
        cd ../../tools
        make 
        export FF_PATH=/root/%{name}%{version}
        export FF_DPDK=/root/%{name}%{version}/dpdk/x86_64-native-linuxapp-gcc
        cd ../lib
        make 
        cd ../app/nginx-1.16.1 
        ./configure --with-ff_module --with-debug --with-http_realip_module --with-stream_realip_module --prefix=/usr/local/nginx_fstack
        make 
        
        %install  ##安装
        cd dpdk/x86_64-native-linuxapp-gcc
        make install  DESTDIR=%{buildroot}
        cd ../../tools
        make install DESTDIR=%{buildroot}
        cd ../lib
        make install DESTDIR=%{buildroot}
        cd ../
        cd app/nginx-1.16.1
        make install DESTDIR=%{buildroot}
        
        #需要一同打包的文件与目录&&安装以后产生的目录位置
        %files
        /usr/local/bin
        /usr/local/lib
        /usr/local/include
        /usr/local/share/dpdk
        /usr/local/sbin/dpdk-devbind
        /lib/modules/
        /usr/local/nginx_fstack
        %changelog
    ###注意事项:
        1:打包顺序很重要
        2:name 与version 还有source要对应
        3:默认安装路径是在BUILDROOT下做为假根安装的,安装路径在编译的时候根据真是路径指定或者在%install中指定
        4:



    ###rebuild.sh 脚本修改如下:
        mkdir /mnt/huge
        echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
        mount -t hugetlbfs nodev /mnt/huge
        echo 0 > /proc/sys/kernel/randomize_va_space
        modprobe uio
        insmod /lib/modules/3.10.0-1160.24.1.el7.x86_64/extra/dpdk/igb_uio.ko
        insmod /lib/modules/3.10.0-1160.24.1.el7.x86_64/extra/dpdk/rte_kni.ko carrier=on
        python  /usr/local/share/dpdk/usertools/dpdk-devbind.py --status
        ifconfig enp2s0f1  down
        python  /usr/local/share/dpdk/usertools/dpdk-devbind.py --bind=igb_uio enp2s0f1
        ifconfig enp2s0f2 down
        python  /usr/local/share/dpdk/usertools/dpdk-devbind.py --bind=igb_uio enp2s0f2
        export FF_PATH=/usr/local/lib
        export FF_DPDK=/usr/local/share/dpdk/x86_64-native-linuxapp-gcc



    ##遇到的问题记录
        1:找不到ff_api.h
            原因:打包顺序不对导致的
        2:Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/f-stack-3.1-1.el7.x86_64
            error: Installed (but unpackaged) file(s) found:
               /lib/modules/3.10.0-1160.24.1.el7.x86_64/extra/dpdk/igb_uio.ko
               /lib/modules/3.10.0-1160.24.1.el7.x86_64/extra/dpdk/rte_kni.ko
               /usr/local/bin/dpdk-pdump
               /usr/local/bin/dpdk-pmdinfo

            原因与%file有关,添加相关的路径到配置文件中

        3:编译出错找不到;lfstak
            将环境整理干净后,重新打包ok

            是路径不对导致的问题

    感谢https://www.cnblogs.com/michael-xiang/p/10500704.html的文章

    作者:first_semon
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题,欢迎交流
  • 相关阅读:
    C# 访问USB(HID)设备
    IPad C盘中backup文件夹占用太多空间
    fastboot
    adb get android's ip
    Reading MMS
    Bitcoin
    内存问题导致编译不过!
    串口LOG 单编kernel
    Source Insight 格式化
    framework层的空指针会让系统重启
  • 原文地址:https://www.cnblogs.com/first-semon/p/14861458.html
Copyright © 2020-2023  润新知