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

news2024/9/30 15:36:01

文章目录

  • 前言
  • 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI日报:OpenAI扩大创业基金计划

欢迎订阅专栏 《AI日报》 获取人工智能邻域最新资讯 文章目录 OpenAI拓宽Converge启动程序变压器模型背后的思想建立启动融资新闻AutoGen AI支点其他 OpenAI拓宽Converge启动程序 ChatGPT制造商OpenAI正在扩大其Converge AI创业计划。 OpenAI的Converge产品于2022年12月首次…

力扣225. 用队列实现栈【附进阶版】

文章目录 力扣225. 用队列实现栈示例思路及其实现两个队列模拟栈一个队列模拟栈 力扣225. 用队列实现栈 示例 思路及其实现 两个队列模拟栈 队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后…

【Python】—— 如果使用matplotlib做数据可视化

matplotlib做数据可视化 相关知识掌握matplotlib的基本使用方法1. 折线图2. 散点图3. 柱状图4. 饼图5. 直方图6. 等高线图7. 图形定制 掌握数据处理的基本方法1. 数据筛选2. 缺失值处理3. 异常值处理 理解数据可视化的原则和方法1. 选择合适的图表类型2. 避免数据混淆3. 突出重…

继电器的工作原理及驱动电路

继电器是具有隔离功能的自动开关元件,广泛应用于遥控、遥测、通讯、自动控制、机电一体化及电力电了设备中,是最重要的控制元件之一。继电器实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。…

camera曝光时间

曝光和传感器读数 相机上的图像采集过程由两个不同的部分组成。第一部分是曝光。曝光完成后,第二步就是从传感器的寄存器中读取数据并传输(readout)。 曝光:曝光是图像传感器进行感光的一个过程,相机曝光时间&#xf…

《PySpark大数据分析实战》-12.Spark on YARN配置Spark运行在YARN上

📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…

创建型设计模式 | 原型模式

一、原型模式 1、原理 原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。原型像是一个模板,可以基于它复制好多…

Leetcod面试经典150题刷题记录 —— 双指针篇

双指针篇 1. 验证回文串Python3 2. 判断子序列Python3双指针 3. 两数之和 II - 输入有序数组Python3 4. 盛最多水的容器Python3双指针 5. 三数之和 1. 验证回文串 题目链接:验证回文串 - leetcode 题目描述: 如果在将所有大写字符转换为小写字符、并移除…

支持可视化提取变量,Apipost配置变量不要太简单

在调试接口时我们需要将响应结果中的某个字段配置为环境变量在其他接口中引用,之前在Apipost中需要配置脚本而在最近Apipost后执行操作中可以进行可视化的断言和变量提取,无需配置繁琐脚本。 这里我们在登录接口下配置一条Token环境变量,在后…

【百度PARL】强化学习笔记

文章目录 强化学习基本知识一些框架Value-based的方法Q表格举个例子 强化的概念TD更新 Sarsa算法SampleSarsa Agent类 On_policy vs off_policy函数逼近与神经网络DQN算法DQN创新点DQN代码实现model.pyalgorithm.pyagent.py总结:举个例子 实战 视频:世界…

scrapy的入门和使用

scrapy的入门使用 学习目标: 掌握 scrapy的安装应用 创建scrapy的项目应用 创建scrapy爬虫应用 运行scrapy爬虫应用 scrapy定位以及提取数据或属性值的方法掌握 response响应对象的常用属性 1 安装scrapy 命令:     sudo apt-get install scrapy 或者&#x…

使用令牌桶和漏桶实现请求限流逻辑

实现请求限流 令牌桶算法原理实现案例案例目的:实例demo运行结果: 漏桶算法原理:实现案例:案例目的:案例代码运行结果: 令牌桶算法和漏桶算法是两种常用的限流算法,用于控制系统对请求或数据的访问速率。下面分别详细解释这两种算法的原理. 令牌桶算法 原理 令牌桶…

二进制枚举算法

二进制 : 也就是只有0和1的进制表示 ; 二进制枚举算法 一个二进制数 x 可以表示 S 的一个子集,某个二进制位i上为0表示没有选i元素,为1表示选了该元素放入子集,比如13为1101就表示选了0,2,3号元素;对于一个长度为N的序列(也就是包含N个元素)有2^N个子…

深入理解PyTorch中的Hook机制:特征可视化的重要工具与实践

文章目录 一、前言1. 特征可视化的重要性2. PyTorch中的hook机制简介 二、Hook函数概述1. Tensor级别的hook:register_hook()2. Module级别的hook 三、register_forward_hook()详解1. 功能与使用场景2. 示例代码与解释3. 在特征可视化中的具体应用 四、register_bac…

数据结构--图(更新ing~)

树具有灵活性,并且存在许多不同的树的应用,但是就树本身而言有一定的局限性,树只能表示层次关系,比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中,数据元素之间的关系是任意的。 一、图…

C语言快速排序算法以及代码

接下来我们将用图像模拟来一步步演示快速排序的过程,这样我们将会通过视觉和大脑一起来梳理快速排序的思路。 后文示例的C语言代码将实现图像模拟的过程。 一、图像模拟 快速排序 过程 我们选取十个数字0~9当做我们的排序数字,并将其打乱。然后我们将…

Axure的交互以及情形的介绍

一. 交互 1.1 交互概述 通俗来讲就是,谁用了什么方法做了什么事情,主体"谁"对应的就是axure中的元件,"什么方法"对应的就是交互事件,比如单击事件、双击事件,"什么事情"对应的就是交互…

银河麒麟v10 安装mysql 8.35

银河麒麟v10 安装mysql 8.35 1、下载Mysql安装包2、安装Mysql 8.352.1、安装依赖包2.2、安装Mysql2.3、安装后配置 1、下载Mysql安装包 访问官网下载链接 链接: https://dev.mysql.com/downloads/mysql/ 选择如下 点击下载按钮 下载安装包 2、安装Mysql 8.35 官方安装文档…

挑战52天学小猪佩奇笔记--day25

52天学完小猪佩奇--day25 ​【本文说明】 本文内容来源于对B站UP 脑洞部长 的系列视频 挑战52天背完小猪佩奇----day25 的视频内容总结,方便复习。强烈建议大家去关注一波UP,配合UP视频学习。 day25的主题:生病了 猜台词: Daddy: …

我勒个豆,怎么没人告诉我这个偷懒神器啊

OMG,还有行政人不知道它的吗??再不用真的亏大了啊!! 这东西写啥都可以,只有输入需求马上就写好了啊,什么工作总结,活动策划方案,会议纪要啥啥都可以,全能写啊…