在非联网、无网络环境下,fpm的安装和生成RPM包的使用案例

文章目录

  • 前言
  • 1、安装fpm
    • 1.1、安装Ruby环境
    • 1.2、gem 安装 fpm
  • 2、fpm使用
    • 2.1、fpm常用参数
    • 2.2、fpm使用案例
      • 2.2.1、fpmFirstDemo文件夹
      • 2.2.3、编写脚本文件
      • 2.2.4、生成RPM包
      • 2.2.5、RPM安装与卸载测试

前言

由于fpm采用Ruby语言开发,因此在使用之前需要先在您的虚拟机上安装Ruby环境。


1、安装fpm

1.1、安装Ruby环境

Ruby环境需要安装:ruby-devel、gcc、make、rpm-build、rubygems、ruby共6个包。命令如下:
联网环境:

yum -y install ruby-devel gcc make rpm-build rubygems ruby

非联网环境,需要在有网络的地方使用repotrack下载全量的安装包,具体使用可以参考这篇文章:linux在非联网、无网络环境下,使用yumdownload、reportrack方法安装rpm包。以下是安装命令:

repotrack --download_path=/opt/temp/ ruby-devel gcc make rpm-build rubygems ruby

该命令的解释如下:

1 repotrack 是一个 Linux 命令行工具,它使用 YUM 源配置文件中的信息,能够将指定的 RPM 包及其依赖关系下载到本地硬盘。
2 --download_path=/opt/temp/ 参数指定了将 RPM 存储的位置为 /opt/temp/ 目录。
3 ruby-devel、gcc、make、rpm-build、rubygems、ruby 是要下载的 RPM 包的名称,它们是 Ruby 语言和其开发的编译环境,用于在 Linux 上运行和构建 Ruby 代码和应用程序。

下载完压缩包后,将全部的压缩包上传到虚拟机,并使用以下命令进行安装:

rpm -Uvh *.rpm --force --nodeps

1.2、gem 安装 fpm

安装完ruby,就可以使用gem命令了。下面需要安装fpm。
首先,在有网络的地方使用,下载和fpm相关的依赖

gem install fpm

下载完成后,使用以下命令,寻找刚才下载fpm的依赖:

gem environment

在这里插入图片描述

通过上图可以看到,依赖存在了/usr/local/share/gems/cache的位置,这个位置可能不固定,但肯定存在于以下三个位置:

 - GEM PATHS:
     - /usr/local/share/gems
     - /root/.gem/ruby
     - /usr/share/gems

找到cache文件夹后,将文件夹内的gem文件上传到无法联网的虚拟机上,然后通过gem的–local,进行安装,

gem install --local xxx

上文提到过:cache安装的位置不固定,在内网虚拟机中,cache文件夹的位置变为/usr/share/gems,故执行:

gem install --local /usr/share/gems/cache/*.gem

注意:该命令不一定能将安装包,全部安装成功。因为安装文件之间可能存在依赖关系,剩下未安装成功的文件,需要使用local命令,手动安装。

gem install --local /usr/share/gems/cache/安装包的名字

在fpm安装过程中,就存在这个关系,建议将:

  • pleaserun-0.0.32.gem
  • fpm-1.15.1.gem
gem install --local /usr/share/gems/cache/pleaserun-0.0.32.gem
gem install --local /usr/share/gems/cache/fpm-1.15.1.gem

这两个文件最后安装即可。全部安装后,可能会出现以下错误:

backports-3.24.1/lib/backports/ractor/cloner.rb:36:in `private': nil is not a symbol (TypeError)

解决方案在:
backports-3.24.1/lib/backports/ractor/cloner.rb:36:in ‘private‘: nil is not a symbol(TypeError)的解决方案


2、fpm使用

fpm 是一个易于使用的打包工具,只需提供相应的参数值,即可完成打包操作,支持rpm和deb两种主流包格式,这样便可以使用相同的方式在不同的平台下进行打包。

2.1、fpm常用参数

首先,了解下fpm支持的命令参数:

FPM常用参数:

-s:指定源类型

-t:指定目标类型,即想要制作为什么包

-n:指定包的名字

-v:指定包的版本号

-C:指定打包的相对路径

-d:指定依赖于哪些包

-f:第二次包时目录下如果有同名安装包存在,则覆盖它;

-p:制作的rpm安装包存放路径,不想放在当前目录下就需要指定;

–post-install:软件包安装完成之后所要运行的脚本;同–offer-install

–pre-install:软件包安装完成之前所要运行的脚本;同–before-install

–post-uninstall:软件包卸载完成之后所要运行的脚本;同–offer-remove

–pre-uninstall:软件包卸载完成之前所要运行的脚本;同—before-remove

–prefix:制作好的rpm包默认安装路径;

支持的源类型包:

dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包
rpm: 对rpm进行转换
gem: 对rubygem包进行转换
python: 将Python模块打包成相应的类型

支持的目标类型包:

rpm: 转换为rpm包
deb: 转换为deb包
solaris: 转换为solaris包
puppet: 转换为puppet包

网上可以查到与 fpm 相关的资料。一些参数可能在最新的 fpm 版本中被标记为不推荐使用。如果要了解最新的命令参数,请使用 fpm --help 命令查看相关帮助。

fpm -help

2.2、fpm使用案例

2.2.1、fpmFirstDemo文件夹

本案例以生成rmp包为例:首先我们需要建立3个目录,和一个shell文件,如下:

在这里插入图片描述

  • output:存放生成的RPM包;
  • data:存放我们的解压后的文件,测试文件test.txt;
  • sh:存放两个脚本。分别为:RPM安装完成后,执行的脚本:rpm_install_after.sh;以及,RPM卸载完成后执行的脚本:rpm_uninstall_after.sh。
  • testRMP.sh:存放的是要执行的fpm打包命令。

具体文件存放情况,如下图所示:
在这里插入图片描述

使用fpm打包后,安装的原理,就是将data下的所有文件和文件夹释放到安装目录下。

2.2.3、编写脚本文件

rpm_install_after.sh该脚本会在rpm安装成功后执行,脚本具体内容如下:

#!/bin/bash

file_path="/usr/fpmFirstDemo/test.txt"

if [ -e "$file_path" ]; then
  echo "安装成功"
else
  echo "安装失败"
fi

解释如下:

脚本中,定义了一个字符串类型的变量 file_path,它的值是 /usr/fpmFirstDemo/test.txt。
然后使用条件语句,判断文件路径所代表的文件是否存在。
条件语句中的 -e 参数表示测试文件是否存在。
如果文件存在,则输出 安装成功;否则输出 安装失败。

rpm_uninstall_after.sh该脚本会在rpm卸载成功后执行,脚本内容如下:

#!/bin/bash
rm -r /usr/fpmFirstDemo

file_path="/usr/fpmFirstDemo"

if [ -d "$file_path" ]; then
  echo "卸载失败"
else
  echo "卸载成功"
fi

注意:上述判断条件为文件夹。
解释如下:

脚本中,执行删除目录命令 rm -r /usr/fpmFirstDemo,删除 /usr/fpmFirstDemo 目录及其下的所有文件。
然后定义了一个字符串类型的变量 file_path,它的值是 /usr/fpmFirstDemo。
接下来使用条件语句,判断文件路径所代表的目录是否存在。
条件语句中的 -d 参数表示测试目录是否存在。
如果目录存在,则输出 卸载失败;否则输出 卸载成功。

testRpm.sh中存放了fpm的打包命令,由于fpm的命令比较长,所以个人习惯放在一个sh文件中。脚本内容如下:

fpm -s dir -t rpm -n mytest -v 1.0.0 --iteration 1 -C data -f -p output --prefix /usr/fpmFirstDemo --after-install sh/rpm_install_after.sh --after-remove sh/rpm_uninstall_after.sh

下面是对每个选项的解释:

-s dir: 指定源类型为目录。这表示我们将指定一个目录作为软件包的源。
-t rpm: 指定目标类型为RPM。这表示我们将构建一个RPM格式的软件包。
-n mytest: 指定软件包的名称为"mytest"。这将是生成的RPM包的名称。
-v 1.0.0: 指定软件包的版本号为"1.0.0"--iteration 1: 指定软件包的迭代版本号为"1"。迭代版本号通常用于区分同一版本的多个构建。
-C data: 指定需要打包的源目录为"data"。这里的"data"是相对于当前目录的一个子目录。
-f: 强制覆盖现有的输出文件。
-p output: 指定输出文件的路径和名称前缀为"output"--prefix /usr/fpmFirstDemo: 指定软件包文件系统层次结构中的目录前缀为"/usr/fpmFirstDemo"。软件包将会在该目录下创建对应的文件结构。
--after-install sh/rpm_install_after.sh: 指定安装软件包后执行的脚本为"sh/rpm_install_after.sh"。
--after-remove sh/rpm_uninstall_after.sh: 指定卸载软件包后执行的脚本为"sh/rpm_uninstall_after.sh"

这个命令的目标是使用目录中的数据构建一个名为"mytest"的RPM软件包,版本号为1.0.0,迭代版本号为1。构建完成后,输出的RPM包文件将以"output"为前缀,并且在安装和卸载软件包时会执行指定的安装后和卸载后脚本。

2.2.4、生成RPM包

进入fpmFirstDemo目录:

cd /opt/fpmFirstDemo

输入如下命令,执行testRpm.sh脚本,使用脚本中的fpm命令将data文件夹下的文件,打包为RPM:

sh testRpm.sh

最后,打包生成的RPM文件在output目录下。如下图所示:

在这里插入图片描述
在这里插入图片描述

RPM包的组成格式解释如下:

mytest :软件名称
1.0.0  :软件版本号
1      :发布号主要是对软件存在的bug或漏洞进行修补,在软件功能上并没有变化
x86_64 :指64位的PC架构,另外还有'i386' 'i686' 等32位的PC架构
rpm    :扩展名

2.2.5、RPM安装与卸载测试

(1)首先,测试RPM的安装,使用-i命令:

cd /opt/fpmFirstDemo/output
rpm -i mytest-1.0.0-1.x86_64.rpm

在这里插入图片描述
上图显示安装成功,并且在/usr/fpmFirstDemo指定位置生成了test文件
在这里插入图片描述

(2)然后,测试RPM卸载。此时使用的软件包名mytest,就是打包时,通过-n参数指定的名称

rpm -e mytest

在这里插入图片描述

来到usr发现整个fpmFirstDemo文件夹已经删除,卸载成功!
在这里插入图片描述

注:无论是修改了rpm_uninstall_after.sh、rpm_uninstall_after.sh文件,都要重新执行一次fpm打包命令。

sh testRpm.sh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/250484.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java只有值传递,没有引用传递!

结论:Java中的参数传递,只有值传递,没有引用传递! 以下均为错误理解: 值传递和引用传递,区别在于传递的内容。如果是个值,就是值传递;如果是个引用,就是引用传递Java是引…

力扣日记12.13-【二叉树篇】从中序与后序遍历序列构造二叉树

力扣日记:【二叉树篇】从中序与后序遍历序列构造二叉树 日期:2023.12.13 参考:代码随想录、力扣 106. 从中序与后序遍历序列构造二叉树 题目描述 难度:中等 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二…

Prometheus

Prometheus [系统性能优化实践]JVM进阶实战之监控工具(Prometheus) https://www.cnblogs.com/johnnyzen/p/17388354.html ubuntu 22.04 配置 Prometheus 和 Grafana 服务器监控 https://blog.csdn.net/nvd11/article/details/128030197 Prometheus 是一个开源的监控系统&…

深入理解网络 I/O:单 Group 混杂模式|多 Group 主从模式

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

Threejs漫天多彩粒子天空--粒子系统打造

一、导语 漫天多彩粒子天空特效应该也是Threejs项目中挺常见的一个需求,因为它是基于粒子系统,可以衍生出许多的不一样的方案,比如,星空特效,下雨特效,飘雪特效等等,不仅可以用在项目中增加氛围…

二叉搜索树的实现

本文旨在讲解如何编写一颗二叉搜索树,包括基本的增删查改的操作。 目录 一、二叉搜索树的概念 ​编辑二、二叉搜索树的编写 2.1节点的编写 2.2节点的插入 2.3节点的查找 2.4节点的删除 三、二叉搜索树的应用 四、 二叉搜索树的性能分析 五、完整代码 一、…

CD8+T细胞通过NKG2D-NKG2DL轴维持对MHC-I阴性肿瘤细胞的杀伤

今天给同学们分享一篇实验文章“CD8 T cells maintain killing of MHC-I-negative tumor cells through the NKG2D-NKG2DL axis”,这篇文章发表在Nat Cancer期刊上,影响因子为22.7。 结果解读: MHC-I阴性肿瘤的免疫疗法需要CD8 T细胞 作者先…

现代雷达车载应用——第2章 汽车雷达系统原理 2.2节 汽车雷达架构

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.2 汽车雷达架构 从顶层来看,基本的汽车雷达由发射器,接收器和天线组成。图2.2给出了一种简化的单通道连续波雷达结构[2]。这…

什么是网络丢包以及如何解决

丢包的概念一直是网络行业争论的话题,在设计和实现网络时,它始终是考虑的关键因素,其重要性在于它对网络和网络系统的效率和整体性能的直接影响,即使是单个故障设备或配置错误的设置也会导致数据包丢失,也会严重影响整…

2 Mycat2 安装与启动

1、制作安装包 Mycat2不提供安装包,只提供核心JAR包,JAR包可以独立运行,安装包是使用Java Service Wrapper做壳的,如果需要安装包,需要自己制作。JAR可以作为Java库引入自己业务项目中使用Mycat2中的各个组件的设计都是可以独立使用的。 步骤如下: 1.…

【C++干货铺】继承后的多态 | 抽象类

个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 多态的概念 多态的定义和实现 多态的定义条件 虚函数 虚函数的重写 特殊情况 协变(基类和派生类的虚函数返回值不同) 析构函数的重…

ffmpeg踩坑之手动编译报错Unrecognized option ‘preset‘及rtsp/rtmp推流

本文解决的问题记录: 报错1:Unrecognized option preset. Error splitting the argument list: Option not found 报错2:ERROR: x264 not found using pkg-config 报错3:ffmpeg: error while loading shared libraries: libavd…

【linux】Debian不能运行sudo的解决

一、问题: sudo: 没有找到有效的 sudoers 资源,退出 sudo: 初始化审计插件 sudoers_audit 出错 二、可用的方法: 出现 "sudo: 没有找到有效的 sudoers 资源,退出" 和 "sudo: 初始化审计插件 sudoers_audit 出错&q…

spring面试:一、面试题分类总览+bean线程安全问题+AOP相关问题(定义、使用步骤、编程式事务管理和声明式事务管理和声明式事务管理失效)

面试题分类总览 bean线程安全问题 单例/多例 单例(singleton):在每个spring ioc容器中都只有一个实例。 多例(prototype):在每个spring ioc容器中有多个实例。 默认情况下spring中的bean都是单例的。但是…

基于Java SSM框架实现智能停车场系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现智能停车场系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述…

call 和 apply:改变对象行为的秘密武器(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

TSINGSEE视频智能解决方案边缘AI智能与后端智能分析的区别与应用

视频监控与AI人工智能的结合是当今社会安全领域的重要发展趋势。随着科技的不断进步,视频监控系统已经不再局限于简单的录像和监视功能,而是开始融入人工智能技术,实现更加智能化的监控和安全管理。传统的监控系统往往需要人工操作来进行监控…

内网渗透测试基础——Windows PowerShell篇

内网渗透测试基础——Windows PowerShell篇 1. Windows PowerShell基础 Windows PowerShell是一种命令行外壳程序和脚本环境,它内置在每个受支持的Windows版本中(Windows7、Windows Server 2008 R2及更高版本),为Windows命令行使…

讨好型人格最适合从事什么职业?

讨好型人格,其言行不是考虑个人,而是以满足对方为主,只要是他人的想法,都会尽力去满足,特别害怕自己做了什么事情,让对方产生不满的想法。遇到事情,也很难主动请求别人,总是依靠自己…

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)

文章目录 call指令和ret指令高级语言的函数调用x86汇编语言的函数调用call ret指令小结其他问题 如何访问栈帧函数调用栈在内存中的位置标记栈帧范围:EBP ESP寄存器访问栈帧数据:push pop指令访问栈帧数据:mov指令小结 如何切换栈帧函数返回时…