使用fpm工具制作Vim.rpm包

news2024/10/18 22:53:05

        背景:生产环境中的CentOS 7在安全扫描中被扫描出vim存在堆缓冲区溢出(CVE-2024-45306)等漏洞。根据漏洞说明,需要升级到最新版。 奈何CentOS 7已经停止维护了,所以,想在网上找一个最新版的vim.rpm相当不容易。无奈之下,只有自己制作一个rpm包了。

        基于之前使用rpmbuild打包的经验,首先到vim官网下载源码包,解压之后,发现源码包里面没有现成的spec文件。如果用rpmbuild来制作rpm包,则需要自己写spec文件。由于我对spec不熟悉,又不想学习,所以,继续搜索是否有其他办法,于是就找到了fpm这个工具。fpm也是一个开源的,地址在这里,发现源码的提交记录已经有13年之久了,好家伙,为什么我现在才知道,😂😂😂。好了,下面正式开始介绍fpm。

1.fpm工具简介

        fpm的官网点这里。以下是官网的截图:

简单翻译一下: 

fpm 是一个工具,可以让您轻松创建 Debian、Ubuntu、Fedora、CentOS、RHEL、Arch Linux、FreeBSD、macOS 等系统的包。

fpm 并不是一个新的打包系统,而是一个帮助您为现有系统创建包的工具,目的是减少您的工作量。它通过提供命令行接口,使您可以更轻松地创建包。以下是一些使用 fpm 的示例:

  • fpm -s npm -t deb express – 为 Node.js 的 Express 库制作 Debian 包。
  • fpm -s cpan -t rpm Fennec – 为 Perl Fennec 模块制作 RPM 包。
  • fpm -s dir -t pacman -n fancy ~/.zshrc – 将您的 ~/.zshrc 文件打包成 Arch Linux 的 pacman 包,名为“fancy”。
  • fpm -s python -t freebsd Django – 创建一个包含 Python Django 库的 FreeBSD 包。
  • fpm -s rpm -t deb mysql.rpm – 将 RPM 包转换为 Debian 包。

从上面的介绍来看,fpm的功能还是很强大的,支持各个平台。 

2.安装fpm

        由于fpm是用ruby写的,因此,需要先安装ruby的环境。检查ruby:

[root@localhost /]# ruby
-bash: ruby: command not found
[root@localhost /]# rpm -qa|grep ruby
[root@localhost /]#

安装ruby:

[root@localhost /]# yum install -y ruby
Total download size: 3.8 M
Installed size: 13 M
Downloading packages:
(1/10): libyaml-0.1.4-11.el7_0.x86_64.rpm                                                                                                                         |  55 kB  00:00:02
(2/10): ruby-2.0.0.648-39.el7_9.x86_64.rpm                                                                                                                        |  73 kB  00:00:02
(3/10): ruby-irb-2.0.0.648-39.el7_9.noarch.rpm                                                                                                                    |  94 kB  00:00:02
(4/10): rubygem-bigdecimal-1.2.0-39.el7_9.x86_64.rpm                                                                                                              |  85 kB  00:00:01
(5/10): rubygem-io-console-0.4.2-39.el7_9.x86_64.rpm                                                                                                              |  56 kB  00:00:01
(6/10): rubygem-json-1.7.7-39.el7_9.x86_64.rpm                                                                                                                    |  82 kB  00:00:01
(7/10): rubygem-psych-2.0.0-39.el7_9.x86_64.rpm                                                                                                                   |  84 kB  00:00:01
(8/10): rubygem-rdoc-4.0.0-39.el7_9.noarch.rpm                                                                                                                    | 324 kB  00:00:02
(9/10): rubygems-2.0.14.1-39.el7_9.noarch.rpm                                                                                                                     | 215 kB  00:00:01
(10/10): ruby-libs-2.0.0.648-39.el7_9.x86_64.rpm   

ruby安装好之后,gem也自动安装好了,gem是什么东西呢?

GemRuby 编程语言中的包管理格式和工具。它用于分发、安装和管理 Ruby 库和程序。Gem 文件本质上是一个压缩包,包含了一个 Ruby 程序或库的代码、相关文档、依赖项等信息。我理解这个应该跟node&npm的关系是一个道理吧。

安装fpm:

[root@localhost /]# gem install fpm
ERROR:  Could not find a valid gem 'fpm' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - no such name (https://rubygems.org/latest_specs.4.8.gz)
[root@localhost /]#

遇到上面的情况,可能是你的机器访问不了那个地址,网络的问题, 需要设置代理等。

[root@localhost /]# gem install fpm
Fetching: cabin-0.9.0.gem (100%)
Successfully installed cabin-0.9.0
Fetching: backports-3.25.0.gem (100%)
Successfully installed backports-3.25.0
Fetching: arr-pm-0.0.12.gem (100%)
Successfully installed arr-pm-0.0.12
Fetching: clamp-1.0.1.gem (100%)
Successfully installed clamp-1.0.1
Fetching: stud-0.0.23.gem (100%)
Successfully installed stud-0.0.23
Fetching: mustache-0.99.8.gem (100%)
Successfully installed mustache-0.99.8
Fetching: insist-1.0.0.gem (100%)
Successfully installed insist-1.0.0
Fetching: dotenv-3.1.4.gem (100%)
ERROR:  Error installing fpm:
        dotenv requires Ruby version >= 3.0.
[root@localhost /]#

如果遇到 dotenv requires Ruby version >= 3.0. 则需要把ruby版本升级到3.0以上。

查看当前ruby版本:

[root@localhost /]# ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

 确实ruby版本低于3.0,那就升级ruby吧,这里又要用到另外一个工具:RVM(Ruby Version Manager),这个工具又类似node的版本管理工具nvm。

下载rvm:

# 安装 RVM(如果尚未安装)
\curl -sSL https://get.rvm.io | bash -s stable

下载rvm时,如果报这个错:

[root@localhost /]# \curl -sSL https://get.rvm.io | bash -s stable
Downloading https://github.com/rvm/rvm/archive/1.29.12.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.12/1.29.12.tar.gz.asc
gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/pubring.gpg' created
gpg: Signature made Sat 16 Jan 2021 02:46:22 AM CST using RSA key ID 39499BDB
gpg: Can't check signature: No public key
GPG signature verification failed for '/usr/local/rvm/archives/rvm-1.29.12.tgz' - 'https://github.com/rvm/rvm/releases/download/1.29.12/1.29.12.tar.gz.asc'! Try to install GPG v2 and then fetch the public key:

    gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

or if it fails:

    command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
    command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -

In case of further problems with validation please refer to https://rvm.io/rvm/security

[root@localhost /]#

则根据他的提示,执行:

gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

 然后重新执行下载:

\curl -sSL https://get.rvm.io | bash -s stable

查看rvm安装路径:

[root@localhost /]# whereis rvm
rvm: /usr/local/rvm

刷新一下环境变量,否则执行rvm会提示找不到命令,或者新开一个终端也可以。

[root@localhost bin]# rvm
-bash: rvm: command not found
[root@localhost bin]# source /etc/profile
[root@localhost bin]# rvm
Ruby enVironment Manager 1.29.12 (latest) (c) 2009-2020 Michal Papis, Piotr Kuczynski, Wayne E. Seguin

Usage:

    rvm [--debug][--trace][--nice] <command> <options>

安装ruby 3.0:

[root@localhost bin]# rvm install 3.0

安装成功之后,切换ruby的版本:

# 使用 Ruby 3.0
[root@localhost /]# rvm use 3.0 --default
Using /usr/local/rvm/gems/ruby-3.0.0
[root@localhost /]#
[root@localhost /]# ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
[root@localhost /]#

从上面的输出可以看到,版本已经切换到3.0了。

再次安装fpm:

[root@localhost /]# gem install fpm
Done installing documentation for stud, mustache, insist, dotenv, clamp, cabin, pleaserun, backports, arr-pm, fpm after 4 seconds
10 gems installed
[root@localhost /]#

上面的日志表示安装成功,查看 版本信息:

[root@localhost /]# fpm --version
1.15.1

至此,fpm 已经安装好了。

3.制作vim.rpm

        由于fpm本身并不编译源码,所以需要我们自己先把源码编译过程执行完了之后,再使用fpm来打包。

        准备好源码包,并解压到指定目录,比如放在root这个目录下:

[root@localhost ~]# tar -xvf vim-9.1.0787.tar.gz

执行configure命令:

[root@localhost vim-9.1.0787]# ./configure --prefix=/usr/local
  • 这个命令用于配置源代码包,以便生成适合于当前系统的构建文件。
  • --prefix=/usr/local 参数指定了安装路径,表示将软件安装到 /usr/local 目录下。这样,软件的可执行文件、库文件和其他相关文件将会被放在 /usr/local/bin/usr/local/lib 等相应的目录中。

如果报这个错误:

[root@localhost vim-9.1.0787]# ./configure --prefix=/usr/local
/bin/sh: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
[root@localhost vim-9.1.0787]#

 那么需要安装ncurses和ncurses-devel:

[root@localhost vim-9.1.0787]# yum install -y ncurses ncurses-devel

然后重新执行configure:

[root@localhost vim-9.1.0787]# ./configure --prefix=/usr/local

 执行make命令:

[root@localhost vim-9.1.0787]# make

执行make install命令:

[root@localhost vim-9.1.0787]# make install DESTDIR=~/rpm-build/vim-9.1.0787/
  • 这个命令用于将编译好的文件安装到指定目录。
  • DESTDIR=~/rpm-build/vim-9.1.0787/ 参数指定了安装的目标目录。在这个例子中,所有安装的文件会被放入 ~/rpm-build/vim-9.1.0787/ 目录,而不是系统的默认位置(如 /usr/local)。这通常用于打包目的,方便后续将这些文件打包成 RPM 或其他格式。

上述命令已经将我们需要的文件准备好了,首先进入~/rpm-build/vim-9.1.0787/目录,然后开始执行fpm的打包命令 :

[root@localhost vim-9.1.0787]# cd ~/rpm-build/vim-9.1.0787/
[root@localhost 
[root@localhost vim-9.1.0787]# fpm -s dir -t rpm -n vim -v 9.1.0787 . #最后一个.表示当前目录
Need executable 'rpmbuild' to convert dir to rpm {:level=>:error}
[root@localhost vim-9.1.0787]#

上面提示还需要安装rpmbuild,这么说来,虽然fpm不用写rpmbuild了,但是执行过程中还是调用的rpmbuild来打包的。

 安装rpmbuild:

[root@localhost vim-9.1.0787]# yum install -y rpmdevtools rpmlint

然后重新执行打包命令:

[root@localhost vim-9.1.0787]# fpm -s dir -t rpm -n vim -v 9.1.0787 .
Created package {:path=>"vim-9.1.0787-1.x86_64.rpm"}

看吧,安装包打好了。 

[root@localhost vim-9.1.0787]# ll
total 13844
drwxr-xr-x 3 root root       19 Oct 18 20:58 usr
-rw-r--r-- 1 root root 14176233 Oct 18 21:09 vim-9.1.0787-1.x86_64.rpm
[root@localhost vim-9.1.0787]#

使用rpm -qpl命令可以查看打包的文件是否正确:

[root@localhost vim-9.1.0787]# rpm -qpl vim-9.1.0787-1.x86_64.rpm
/usr/local/bin/ex
/usr/local/bin/rview
/usr/local/bin/rvim
/usr/local/bin/view
/usr/local/bin/vim
/usr/local/bin/vimdiff
/usr/local/bin/vimtutor
/usr/local/bin/xxd

现在可以拿这个rpm去测试了,不过,这里有个问题 ,我们在执行configure的时候提示需要ncurses,但这个rpm安装的时候,没有任何提示,这就容易导致安装包安装成功了,却无法使用的问题。因此,我们打包时,还需要将依赖项写进打包命令里面,像这样:

[root@localhost vim-9.1.0787]# fpm -s dir -t rpm -n vim -v 9.1.0787 -d "ncurses" .
Created package {:path=>"vim-9.1.0787-1.x86_64.rpm"}

可以执行下面的命令,查看依赖关系:

[root@localhost /]# rpm -qpR vim-9.1.0787-1.x86_64.rpm
ncurses

至此,整个打包环节就完成了。虽然使用fpm也有缺点,但还算比较方便 ,值得推荐。

 

 

 

 

 

 

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

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

相关文章

数字图像处理:图像复原应用

数字图像处理&#xff1a;图像复原应用 1.1 什么是图像复原&#xff1f; 图像复原是图像处理中的一个重要领域&#xff0c;旨在从退化&#xff08;例如噪声、模糊等&#xff09;图像中恢复出尽可能接近原始图像的结果。图像复原与图像增强不同&#xff0c;复原更多地依赖于图…

ES6 Promise的用法

学习链接&#xff1a;ES6 Promise的用法&#xff0c;ES7 async/await异步处理同步化&#xff0c;异步处理进化史_哔哩哔哩_bilibili 一、同步与异步区别 1.JavaScript代码是单线程的程序&#xff0c;即通过一行一行代码顺序执行&#xff0c;即同步概念。 2.若处理一些简短、…

数据结构部分混淆

1.随机存储和顺序存储&#xff1a; 随机存取&#xff1a;数组&#xff0c;当存储器中的数据被读取或写入时&#xff0c;所需要的时间与该数据所在的物理地址无关 顺序存取&#xff1a;链表&#xff0c;当存储器中的数据被读取或写入时&#xff0c;所需要的时间与该数据所在的物…

力扣之1412.查找成绩处于中游的学生

题目&#xff1a; sql建表语句&#xff1a; Create table If Not Exists Student (student_id int, student_name varchar(30)); Create table If Not Exists Exam (exam_id int, student_id int, score int); Truncate table Student; insert into Student (student_id,…

linux环境下的程序设计与git操作

目录 前言&#xff1a; 进度条小程序&#xff1a; 先介绍几个背景知识 代码实现 Git操作 总结 其他指令 前言&#xff1a; 本文将重点介绍1. linux下的程序设计&#xff0c;并使用linux下的几个函数接口。实现一个简单的小程序 2.本着开源精神&#xff0c;进行git操作。…

OPENSSL-2023/11/10学习记录-C/C++对称分组加密DES

对称分组加密常用算法&#xff1a; DES 3DES AES 国密SM4 对称分组加密应用场景&#xff1a; 文件或者视频加密 加密比特币私钥 消息或者配置项加密 SSL通信加密 对称分组加密 使用异或实现一个简易的对称加密算法 A明文 B秘钥 AB密文AB (AB)B A 密码补全和初始化 数…

在Access中执行SQL语句

1.新建一个查询 2. 关闭弹出的窗口&#xff0c;创建一个空查询 3. 在“设计”页中点击“数据定义”进入输入SQL语句界面 4. “执行”后就能看到执行结果 5.如果想再次执行SQL&#xff0c;则可在MDI窗口标题栏右键&#xff0c;在弹出的菜单中选择“SQL 视图”即可

Vue向上滚动加载数据时防止内容闪动

目前的需求&#xff1a;当前组件向上滚动加载数据&#xff0c;dom加载完后&#xff0c;页面的元素位置不能发生变化 遇到的问题&#xff1a;加载完数据后&#xff0c;又把滚轮滚到之前记录的位置时&#xff0c;内容发生闪动 现在的方案&#xff1a; 加载数据之前记录整体滚动条…

Spring AI 整体介绍_关键组件快速入门_prompt_embedding等

Spring AI&#xff1a;Java开发者的AI集成新利器 在过去&#xff0c;Java开发者在构建AI应用时面临着缺乏统一框架的问题&#xff0c;导致不同AI服务的集成过程复杂且耗时。Spring AI应运而生&#xff0c;旨在为基于Java的应用程序提供一个标准化、高效且易于使用的AI开发平台…

51单片机的超声波视力保护仪【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器光照传感器超声波传感器按键、LED、蜂鸣器等模块构成。适用于视力保护仪、坐姿矫正器、超声波防近视等相似项目。 可实现功能: 1、LCD1602显示温度、光照、距离和学习时间 2、超声波传感器采集头部与探…

如何做好SQL 数据库安全

随着信息技术的迅猛发展&#xff0c;数据库在现代信息系统中的重要性日益凸显。无论是电子商务平台、金融系统还是社交媒体应用&#xff0c;数据库都是其核心组件之一。其中&#xff0c;SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;数据库…

效率飞跃 | SOLIDWORKS 2025:草图与装配体设计再升级!

一年一度的SOLIDWORKS新版本已经发布&#xff0c;快来看看SOLIDWORKS 2025这些让您眼前一亮的新功能&#xff0c;它们将为您的研发过程增添强大助力。 一、草图绘制 1、通过 XYZ 点生成的曲线可以选取坐标系统 新版本可选择曲线起点位置 2、转换实体作为构造几何体 转换实体…

Science Robotics 通过新材料打造FiBa软机器人 可实现四种形态进化

近几年由于材料科学的进步&#xff0c;软机器人相关技术近几年研究成果显著&#xff0c;与传统的刚性机器人相比&#xff0c;软机器人的设计灵感来源于自然界中的生物系统&#xff0c;如蠕虫、章鱼、壁虎和青蛙等。这些生物利用柔软、有弹性的材料&#xff0c;在复杂环境中展现…

微服务基础架构(图)

微服务基础架构是一种现代化的软件架构模式&#xff0c;旨在将大型复杂的应用程序拆分为多个小型、独立的服务。每个微服务专注于特定的业务功能&#xff0c;可独立开发、部署和扩展。 在微服务基础架构中&#xff0c;通常会使用轻量级的通信机制&#xff0c;如 RESTful API 或…

C++简易日志系统:打造高效、线程安全的日志记录工具

目录 引言&#xff1a; 1.日志的基本概念 1.1.什么是日志&#xff1f; 1.2.我们为什么需要日志&#xff1f; 2.自己实现一个简易日志 2.1.日志的等级 2.2日志的格式 2.3.获取时间的方法 2.4.日志的主体实现 参数&#xff1a; 代码解析&#xff1a; 问题&#xff1a…

C++新手入门指南:从基础概念到实践之路

C 继承了 C 语言的高效性和灵活性&#xff0c;同时新增了面向对象编程的特点。这使得 C 既可以进行底层系统编程&#xff0c;又能进行面向对象的软件设计。在面向对象编程方面&#xff0c;C 支持封装、继承和多态三大特性。 &#x1f4af;C 初印象 语言的发展就像是练功打怪…

用Java爬虫API,轻松获取电商商品SKU信息

在电子商务的精细化运营时代&#xff0c;SKU信息的重要性不言而喻。SKU&#xff08;Stock Keeping Unit&#xff09;信息不仅包含了商品的规格、价格、库存等关键数据&#xff0c;还直接影响到库存管理、价格策略和市场分析等多个方面。如何高效、准确地获取这些信息&#xff0…

STM32—SPI通信外设

1.SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担可配置8位/16位数据帧、高位先行/低位先行时钟频率&#xff1a;fpclk/(2,4,8,16,32,64,128,256)支持多主机模型、主或从操作可精简为半双工/单…

【GESP】C++一级练习BCQM3049,细胞分裂

GESP一级知识点整形int和for循环练习。 题目题解详见&#xff1a;【GESP】C一级练习BCQM3049&#xff0c;细胞分裂 | OneCoder 【GESP】C一级练习BCQM3049&#xff0c;细胞分裂 | OneCoderGESP一级知识点整形int和for循环练习。https://www.coderli.com/gesp-1-bcqm3049/ C …

微服务--Ribbon负载均衡器

Nacos 本身里面就内置了Rabbion&#xff0c; 所以 不需要额外添加 添加LoadBalanced注解&#xff1a; Rabbion 内置的有好几种 负载均衡器 可以根据业务去选择&#xff0c;我们一般不会额外配置 都是默认的轮询&#xff0c;因为我们是基于docker发布的 大家的资源都是平等的 若…