• 如何打一个RPM包


    如何打一个RPM包

    参考链接:RPM打包原理、示例、详解及备查

    前言

    本文只是一个RPM安装的例子,并没有对RPM做比较详尽的叙述,更为详尽的讲解,可以在上面的链接中找到。

    RPM是啥?

    RPM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。

    话不多说,让我们开始打RPM包!我们将以打Supervisor包为例。

    安装rpmbuild

    在开始之前,我们先做好准备工作:

    RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包。

    $ yum install rpm-build
    $ yum install rpmdevtools
    

    打成的包要做什么?

    接着,我们来看看如果手动安装Supervisor,我们可能要的步骤:

    • 将压缩包上传至: /tmp/
    • cd /tmp/
    • tar -C /opt/ -xzf supervisor-4.0.2.tar.gz
    • cd /opt/
    • mv supervisor-4.0.2 supervisor
    • cd supervisor
    • python setup.py install
    • echo_supervisord_conf > /etc/supervisord.conf
    • supervisord -c /etc/supervisord.conf

    即解压 / 重命名文件夹 / 运行安装脚本 / 增加配置文件 / 启动进程

    创建RPM文件

    接下来,我们将上面的操作转为RPM操作,首先我们需要编写一个spec文件。我们可以通过spec文件来配置要生成的rpm包(有点类似Docker的Dockerfile)。

    新建spec文档

    我们不妨先找到rpmbuild所在目录,通过yum install安装,一般位置为

    /用户名/rpmbuild
    

    查看下面的目录

    $ ll 
    total 0
    drwxr-xr-x 6 root root  88 May 13 14:30 BUILD
    drwxr-xr-x 5 root root 129 May 13 14:30 BUILDROOT
    drwxr-xr-x 3 root root  20 May 10 17:04 RPMS
    drwxr-xr-x 3 root root 150 May 13 10:29 SOURCES
    drwxr-xr-x 2 root root  88 May 13 14:30 SPECS
    drwxr-xr-x 2 root root 163 May 13 14:30 SRPMS
    

    这些目录都是干嘛的呢?请看:

    默认位置 宏代码 名称 用途
    ~/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)

    正如上文所说,我们不妨把编写的spec文件放在SPECS目录里面。

    $ cd /root/rpmbuild/SPEC/
    $ vim supervisor.spec
    

    向spec文档添加内容

    基于哪个代码包?

    首先我们要知道rpm包生成基于哪个文件生成,一般都是压缩包格式的源代码软件包,比如
    supervisor-4.0.2.tar.gz

    添加下面的内容

    # 软件包的名称 
    Name: supervisor
    # 软件包的版本 
    Version: 4.0.2
    # 源代码软件包的名字 
    Source0: %{name}-%{version}.tar.gz
    

    上面的Source即指定了源代码软件包。我们同时需要将supervisor-4.0.2.tar.gz文件,放入
    上面所说的SOURCES目录。

    解压缩代码包

    setup -q 命令会自动将上一步指定的压缩包解压,并将文件包内容放置到BUILD目录里;然后cd到解压后的目录中。

    # 安装前的准备工作,一般用于解压源码包 
    %prep
    # 解压并cd到相关目录
    %setup -q
    

    进行安装

    这一步,按照我的感觉,是要把python setup.py install内容加进来的,但是实验后发现,这句命令在%install区内无法执行,需要放置到下一步的区域中。

    # 源码安装,如:make install 命令 
    %install
    mkdir -p %{buildroot}/opt/supervisor/
    cp -rp %{_builddir}/%{name}-%{version}/*  %{buildroot}/opt/supervisor/
    

    安装后置操作

    所有文件安装成功后,就可以执行剩下的操作了。%post区域里就是存放这些操作的。

    ## 安装后执行的脚本
    %post
    cd /opt/supervisor/
    python setup.py install
    echo_supervisord_conf > /etc/supervisord.conf
    supervisord -c /etc/supervisord.conf
    

    这样一来,spec的主要内容部分就都写好了,剩下的就补充一些细枝末节了。

    完善spec内容

    将剩余的字段完善后,得到的最终文件如下所示:

    # 软件包的名称 
    Name: supervisor
    # 软件包的版本 
    Version: 4.0.2
    # 软件包发布序列号,1表示第几次打包 
    Release: 1%{?dist}
    # 软件包的概要信息,不要超过50个 
    Summary: The supervisor is a client/server system.
    # 软件授权方式 
    License: BSD-derived
    # 软件分类
    Group:System Environment/Daemons
    # 源代码软件包的官方地址或源码包的下载地址 
    URL: https://pypi.org/project/supervisor/
    # 源代码软件包的名字 
    Source0: %{name}-%{version}.tar.gz
    
    # install使用的虚拟目录,安装后就在该目录下打包 
    BuildRoot: %_topdir/BUILDROOT
    #软件包详细描述信息 
    %description
    The supervisor is a client/server system that allows its users to control a number of processes on UNIX-like operating systems.
    
    # 安装前的准备工作,一般用于解压源码包 
    %prep
    #解压并cd到相关目录
    %setup -q
    
    # 源码编译,如: ./configure && make命令 
    %build
    
    # 源码安装,如:make install 命令 
    %install
    mkdir -p %{buildroot}/opt/supervisor/
    cp -rp %{_builddir}/%{name}-%{version}/*  %{buildroot}/opt/supervisor/
    
    ## 安装后执行的脚本
    %post
    cd /opt/supervisor/
    python setup.py install
    echo_supervisord_conf > /etc/supervisord.conf
    supervisord -c /etc/supervisord.conf
    
    # 清理临时文件 
    %clean
    # rm -rf %{buildroot}      
    
    # 定义那些文件或目录放入RPM当中 %file是在虚拟根目录(BuildRoot)下进行,千万不要写绝对路径,应该使用宏或者变量表示相对路径 
    %files
    /
    
    %doc
    # RPM包软件的每次修改记录到这里 
    
    %changelog
    * Fri May 13 2019 MG
    - Initial Supervisor 4.0.2 RPM release
    

    生成RPM包并安装

    我们可以使用上面所编写的spec文件来生成RPM包。

    生成rpm

    $ rpmbuild -ba supervisor.spec
    

    运行完上述命令后,我们可以进入RPMS目录。发现多了一个rpm文件。

    $ ll RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm 
    -rw-r--r-- 1 root root 643728 May 13 14:16 RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm
    

    安装RPM包

    将生成的rpm文件复制到另外一台机器上,执行下面的命令,就可以发现rpm包可以正常安装了。

    rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm
    

    大功告成!

    可能遇到的问题

    问题1:rpm conflicts with file from package

    安装的时候增加–replacefiles参数,例如

    rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacefiles
    

    问题2:xxx is already installed

    安装的时候增加--replacepkgs参数,例如

    rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacepkgs
    

    问题3:如何查看当前系统发行版

    $ cat /proc/version
    Linux version 3.10.0-693.25.4.el7.x86_64 (mockbuild@x86-030.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Sat Apr 28 14:04:53 EDT 2018
    
  • 相关阅读:
    进程间通信:命名管道FIFO(2)
    进程间通信:管道(1)
    POSIX线程学习
    进程与信号学习
    堆栈的区别与联系
    浅读《构建之法:现代软件工程》有感
    CSS学习成长记
    jquery学习成长记(一)
    html学习成长记
    Razor视图
  • 原文地址:https://www.cnblogs.com/laolieren/p/make_rpm_packages.html
Copyright © 2020-2023  润新知