zoukankan      html  css  js  c++  java
  • 自制rpm包

    参考自:https://blog.csdn.net/u010384744/article/details/80929319

    https://blog.csdn.net/samxx8/article/details/72050725

    系统:centos 6.8 x64

    在开始之前,首先我们安装上rpm包制作工具

    yum install rpm* rpm-devel rpmdevtools

    1,我做的这个只是为了测试,很简单:源程序文件就一个可执行文件,这个可执行文件我命名为a,是有源代码a.c编译而成,a.c源文件为:

    #include <stdio.h>
    
    main(){
    printf("DDDD
    ");
    }

    2,将这个可执行文件a压缩为tar.gz格式:

         tar zcvf aa.tar.gz a

    3,在root目录下创建rpmbuild目录以及下属的几个子目录

    [userid@hostname ~]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

    各个目录的一般用途如下简介:

    BUILD 编译rpm包的临时目录
    BUILDROOT 编译后生成的软件临时安装目录
    RPMS 最终生成的可安装rpm包的所在目录
    SOURCES 所有源代码和补丁文件的存放目录
    SPECS 存放SPEC文件的目录(重要)
    SRPMS 软件最终的rpm源码格式存放路径

    4.将aa.tar.gz移动至/root/rpmbuild/SOURCES目录下

    5,进入SPECS目录下,编辑.spec配置文件

    vi a.spec:

    Name:a
    Version:1.8.1
    Release:1%{?dist}
    Summary:golangBinnary
    
    #Group: system
    License:GPL
    Distribution:Red Hat Linux
    #URL:http://golang.org
    #Source0:aa.tar.gz
    Requires:glibc,python >= 2.4,/usr/bin/python,libc.so.6(GLIBC_2.11)(64bit),rpm >= 0:4.1.1,python(abi) = 2.6,yum >= 3.2.29
    Autoreq:0
    
    %define userpath /usr/bin
    
    %description
    a 1.8.1
    
    #%prep
    #tar -xzvf ${RPM_SOURCE_DIR}/go1.8.1.linux-amd64.tar.gz
    
    %install
    install -d $RPM_BUILD_ROOT%{userpath}
    tar -C $RPM_BUILD_ROOT%{userpath} -xzf ${RPM_SOURCE_DIR}/aa.tar.gz
    #sudo tar -C /usr/local -xzf ${RPM_SOURCE_DIR}/aa.tar.gz
    
    #sudo cp -r ${RPM_SOURCE_DIR}/go /usr/local/
    #export PATH=$PATH:/usr/local/go/bin
    
    
    
    
    %files
    %defattr(-,root,root,-)
    %doc
    %{userpath}/
    
    
    %changelog

    其中要特别注意到,我在里面定义了

    Requires:glibc,python >= 2.4,/usr/bin/python,libc.so.6(GLIBC_2.11)(64bit),rpm >= 0:4.1.1,python(abi) = 2.6,yum >= 3.2.29

    这个是我随便定义的,目的是为了说明,为甚拿到一个rpm以后,linux系统就能知道这个rpm包依赖哪些CAPABILITY?(我这里没说依赖哪些包,而说是依赖哪些capability,是因为确实包依赖的单位是capability,而不是包,只不过每个capability背后都对应的一个包,依赖某capability相当于依赖提供这个capability的包)是因为在制作rpm包的时候,就已经把依赖关系写景这个.spec文件中了

    6,万事具备,只差最后生成

    rpmbuild -bb a.spec

    最终我们看到生成的rpm包在RPMS目录下。

    [root@localhost x86_64]# pwd
    /root/rpmbuild/RPMS/x86_64
    [root@localhost x86_64]# ls
    a-1.8.1-1.el6.x86_64.rpm  repodata

    我们来验证一下,这个rpm包的依赖关系是不是正如我们定义的那样

    [root@localhost x86_64]# rpm -qpR a-1.8.1-1.el6.x86_64.rpm
    glibc
    python >= 2.4
    /usr/bin/python
    libc.so.6(GLIBC_2.11)(64bit)
    rpm >= 0:4.1.1
    python(abi) = 2.6
    yum >= 3.2.29
    rpmlib(FileDigests) <= 4.6.0-1
    rpmlib(PayloadFilesHavePrefix) <= 4.0-1
    rpmlib(CompressedFileNames) <= 3.0.4-1
    rpmlib(PayloadIsXz) <= 5.2-1

    我们注意到,在依赖关系列表中,除了我们定义的那几个capability,怎么还有以下四个?(这个问题可以参考我另一篇文章https://www.cnblogs.com/saolv/p/9727309.html)

    rpmlib(FileDigests) <= 4.6.0-1
    rpmlib(PayloadFilesHavePrefix) <= 4.0-1
    rpmlib(CompressedFileNames) <= 3.0.4-1
    rpmlib(PayloadIsXz) <= 5.2-1

    因为这个rpm包是在我这个系统是制作的,我这个系统是centos6.8 x64,我们知道rpm包管理工具是在不断迭代的,比如相对于centos5的rpm包管理工具来说,新版的rpm使用了新的file digest algorithms 和 compression algorithms(压缩算法),比如这个压缩算法应该是rpmlib(PayloadIsLzma) ,而centos5的rpm包管理工具是不支持此算法的,所以,在centos6上制作的rpm包,用centos5的rpm进行安装,是无法安装上的,除非,centos5的rpm是新版的,

    我们看到,在centos5安装那个在centos6上制作的rpm包时,无法安装,除了缺少新版的yum,python,libc以为,还缺少

    rpmlib(FileDigests) 
    rpmlib(PayloadIsXz)

    这两个,这就是centos6的rpm启用了新的digest algorithm以及新的payloadlsxz不知道什么东西,而我们注意到,centos5并不缺

    rpmlib(PayloadFilesHavePrefix) <= 4.0-1
    rpmlib(CompressedFileNames) <= 3.0.4-1

    这两个,说明,centos5系统的rpm是有这两个的。

    所以,当我们用制作rpm包的时候,相关命令会自动将当前rpm管理工具所支持的特性添加进依赖关系中,这样,我们在旧的系统上安装此rpm包时,安装不上了就能知道是由于当前系统的rpm管理工具版本太低,我们要么直接升级rpm管理工具,要么换个老版本的安装

  • 相关阅读:
    Springmvc
    Mybatis关联关系
    Mybatis整合ehcache 和 redis
    Mybatis与spring集成
    MyBatis动态sql和分页
    MyBatis入门
    Vue模板语法(二)
    Vue模板语法(一)
    Spring---SSH整合(二)
    Spring---SSH整合
  • 原文地址:https://www.cnblogs.com/saolv/p/9727231.html
Copyright © 2011-2022 走看看