在非联网、无网络环境下,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/bashfile_path="/usr/fpmFirstDemo/test.txt"if [ -e "$file_path" ]; thenecho "安装成功"
elseecho "安装失败"
fi

解释如下:

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

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

#!/bin/bash
rm -r /usr/fpmFirstDemofile_path="/usr/fpmFirstDemo"if [ -d "$file_path" ]; thenecho "卸载失败"
elseecho "卸载成功"
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.rhkb.cn/news/218502.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode面试经典二分系列刷题心得

闲来无事巩固算法基础,发现自己的二分几乎从来没系统刷过题,基础很是薄弱。 二分法不愧称为新人杀手,刷起来很是吃力,感觉明明学了几套二分模板,但是却不知道如何去运用,很多读者在初次尝试刷二分题时候&a…

Git 使用教程(超级详细)

目录 一:Git二:SVN与Git的的区别三、安装Git四:常规操作五:远程仓库六:创建与合并分支七:bug分支八:多人协作九:git可视化工具 Git Git 是一种分布式版本控制系统,用于…

现代雷达车载应用——第2章 汽车雷达系统原理 2.6节 雷达设计考虑

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.6 雷达设计考虑 上述部分给出了汽车雷达基本原理的简要概述。在雷达系统的设计中,有几个方面是必不可少的,它们决定了雷达系…

【leetcode】链表总结

说明:本文内容来自于代码随想录 链表基本操作 https://leetcode.cn/problems/design-linked-list/ 删除节点 https://leetcode.cn/problems/remove-linked-list-elements/description/,删除节点,虚拟头节点。定义两个节点,分别…

基于QTreeWidget实现带Checkbox的多级组织结构选择树

基于QTreeWidget实现带Checkbox的多级组织结构选择树 采用基于QWidgetMingw实现的原生的组织结构树 通过QTreeWidget控件实现的带Checkbox多级组织结构树。 Qt相关系列文章: 一、Qt实现的聊天画面消息气泡 二、基于QTreeWidget实现多级组织结构 三、基于QTreeWidget…

eclipse连接mysql数据库(下载eclipse,下载安装mysql,下载mysql驱动)

前言: 使用版本:eclipse2017,mysql5.7.0,MySQL的jar建议使用最新的,可以避免警告! 1:下载安装:eclipse,mysql在我之前博客中有 http://t.csdnimg.cn/UW5fshttp://t.csdn…

2023年最详细的:本地Linux服务器安装宝塔面板,并内网穿透实现公网远程登录

📚📚 🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​​ 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有一…

插头是什么

插头 电工电气百科 文章目录 插头前言一、插头是什么二、插头的类别三、插头的作用原理总结前言 插头的设计和结构会根据不同的国家和地区的标准和电源类型而有所不同。所以,在使用插头时,需要注意使用符合当地标准和规定的插头,以确保电气安全以及插入正确的电源插座 一、…

【lombok】从easyExcel read不到值到cglib @Accessors(chain = true)隐藏的大坑

背景: 在一次使用easyExcel.read 读取excel时,发现实体类字段没有值,在反复测试后,发现去掉Accessors(chain true)就正常了,为了验证原因,进行了一次代码跟踪 由于调用链路特别长,只列举出部分代码&#x…

动态规划习题

动态规划的核心思想是利用子问题的解来构建整个问题的解。为此&#xff0c;我们通常使用一个表格或数组来存储子问题的解&#xff0c;以便在需要时进行查找和使用。 1.最大字段和 #include <iostream> using namespace std; #define M 200000int main() {int n, a[M], d…

LCR 120. 寻找文件副本

解题思路&#xff1a; 利用增强for循环遍历documents&#xff0c;将遇见的id加入hmap中&#xff0c;如果id在hamp中存在&#xff0c;则直接返回id class Solution {public int findRepeatDocument(int[] documents) {Set<Integer> hmapnew HashSet<>();for(int d…

Python+Selenium UI自动化测试环境搭建及使用

一、什么是Selenium &#xff1f; Selenium 是一个浏览器自动化测试框架&#xff0c;它主要用于web应用程序的自动化测试&#xff0c;其主要特点如下&#xff1a;开源、免费&#xff1b;多平台、浏览器、多语言支持&#xff1b;对web页面有良好的支持&#xff1b;API简单灵活易…

【C++11特性篇】盘点C++11中三种简化声明的方式【auto】【decltype】【nullptr】(3)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.auto&#xff06;范围for二.decltyp…

Java医院3D人体智能导诊系统源码 Uniapp+springboot 微信小程序

“智能导诊”以人工智能手段为依托&#xff0c;为人们提供智能分诊、问病信息等服务&#xff0c;在一定程度上满足了人们自我健康管理、精准挂号等需求。智能导诊可根据描述的部位和病症&#xff0c;给出适合病症的科室参考。 智能导诊页面会显示男性或女性的身体结构图&#x…

Linux基本操作指令

哈喽小伙伴们&#xff0c;从这篇文章开始&#xff0c;在学习数据结构的同时&#xff0c;我们开启一个新的篇章——Linux操作系统的学习&#xff0c;这将会是又一个新的开始&#xff0c;希望小伙伴们能够认真细心&#xff0c;不要掉队哦。 目录 一.什么是Linux 二.为什么要学习…

LeetCode 300最长递增子序列 674最长连续递增序列 718最长重复子数组 | 代码随想录25期训练营day52

动态规划算法10 LeetCode 300 最长递增子序列 2023.12.15 题目链接代码随想录讲解[链接] int lengthOfLIS(vector<int>& nums) {//创建变量result存储最终答案,设默认值为1int result 1;//1确定dp数组&#xff0c;dp[i]表示以nums[i]为结尾的子数组的最长长度ve…

JNA实现JAVA调用C/C++动态库

1.JNA JNA全称Java Native Access&#xff0c;是一个建立在经典的JNI技术之上的Java开源框架&#xff08;https://github.com/twall/jna&#xff09;。JNA提供一组Java工具类用于在运行期动态访问系统本地库&#xff08;native library&#xff1a;如Window的dll&#xff09;而…

CSS学习笔记整理

CSS 即 层叠样式表/CSS样式表/级联样式表&#xff0c;也是标记语言&#xff0c; 用于设置HTML页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式、边距&#xff09;以及版面的布局和外观显示样式 目录 准备工作 Chrome调…

时间序列预测 — CNN-LSTM实现多变量多步光伏预测(Tensorflow)

目录 1 数据处理 1.1 导入库文件 1.2 导入数据集 1.3 缺失值分析 2 构造训练数据 ​3 模型训练 3.1 CNN-LSTM网络 3.2 模型训练 4 模型预测 专栏链接&#xff1a;https://blog.csdn.net/qq_41921826/category_12495091.html 1 数据处理 1.1 导入库文件 import scip…

『番外篇二』Swift “黑魔法”之动态获取类实例隐藏属性的值

概览 在 Swift 代码的调试中,我们时常惊叹调试器的无所不能:对于大部分“黑盒”类实例的内容,调试器也都能探查的一清二楚。 想要自己在运行时也能轻松找到 Thread 实例“私有”属性的值吗(比如 seqNum)? 在本篇博文中您将学到如下内容: 概览1. 借我,借我,一双慧眼吧…