使用fpm工具制作Vim.rpm包

        背景:生产环境中的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 7D2BAF1CF37B13E2069D6956105BD0E739499BDBor 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. SeguinUsage: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.mzph.cn/diannao/56694.shtml

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

相关文章

腾讯云宝塔面板前后端项目发版

后端发版 1. 打开“网站”页面&#xff0c;找到java项目&#xff0c;点击状态暂停服务 2.打开“文件”页面&#xff0c;进入jar包目录&#xff0c;删除原有的jar包&#xff0c;上传新jar包 3. 再回到第一步中的网站页面&#xff0c;找到jar项目&#xff0c;启动项目即可 前端发…

跨境业务收款难?Zoho Books来帮忙

外贸跨境企业应收账款管理繁琐&#xff0c;ZohoBooks财务管理软件提供自动化解决方案&#xff0c;简化开票、跟进、收款和账户更新流程&#xff0c;提升效率和准确性&#xff0c;助力企业优化现金流和财务健康。 什么是应收账款&#xff1f; 应收账款指的是企业在提供商品或服…

王爽汇编语言第三版实验1

前言 本系列的文章是对王爽老师的汇编语言中的实验的解答记录&#xff0c;原书一共有17个实验&#xff0c;由于学校的教学流程只做到了第14个实验&#xff0c;因此本文章只会有前十四个实验的解答记录,还有个比较重要的是&#xff0c;文章中会有原书实验中没有的题目&#xff…

汇总10个AI免费一键生成PPT的网站

一、前言 PPT幻灯片是现代办公和学习中的重要组成部分。它在工作、研究或培训中扮演着重要角色&#xff0c;并能够让观众更好地理解信息。随着当今人工智能技术的快速发展&#xff0c;现在有很多免费的AI PPT生成器可供选择&#xff0c;帮助用户更加便捷地制作出高效且具有较强…

rhce:列行性(at和cron)

配置 at练习 设置时间提醒 定义一分钟后显示命令&#xff0c;使用atq查看 cron练习 配置 systemctl status crond 查看文件所在位置 ll /var/spool/cron/ 主要功能 开始操作 进入界面操作每天早上9点说hello crontab -e 五个星号分别代表分时日月周&#xff0c;其次是执…

光通信——前传基本架构

一、前传基本架构 第三代移动通信技术引入了分布式射频接入网络&#xff08;Distributed Radio Access Network &#xff0c; D-RAN&#xff09;架构。在此架构中的的基带处理单元&#xff08; Baseband Unit &#xff0c; BBU&#xff09; 和 射频拉远单元&#xff08; Remot…

Kafka-初识

一、Kafka是什么&#xff1f; Kafka是一个高度可扩展、弹性、容错和安全的分布式流处理平台&#xff0c;由服务器和客户端组成&#xff0c;通过高性能TCP网络协议进行通信。它可以像消息队列一样生产和消费数据。可以部署在裸机硬件、虚拟机和容器上&#xff0c;也可以部署在本…

springboot034在线商城系统设计与开发-代码(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;ONLY在线商城系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本ONLY在线商城系统…

Wordpress—一个神奇的个人博客搭建框架

wordpress简介 在当今数字化的时代&#xff0c;拥有一个属于自己的个人博客&#xff0c;不仅可以记录生活点滴、分享专业知识&#xff0c;还能展示个人风采。而在众多的博客搭建框架中&#xff0c;Wordpress 以其强大的功能和灵活性脱颖而出。今天&#xff0c;就让我们一起深入…

大数据研究实训室建设方案

一、概述 本方案旨在提出一套全面的大数据研究实训室建设策略&#xff0c;旨在为学生打造一个集理论学习与实践操作于一体的高端教育环境。实训室将专注于培养学生在大数据处理、分析及应用领域的专业技能&#xff0c;通过先进的设施配置、科学的课程体系和实用的实训模式&…

红黑树的底层讲解

一、红黑树的介绍 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是红&#xff08;red&#xff09;或黑&#xff08;black&#xff09;。通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红…

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

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

Vue详细入门(语法【三】)

今天滴的学习目标&#xff01;&#xff01;&#xff01; Vue组件是什么&#xff1f;组件的特性和优势Vue3计算属性Vue3监听属性 在前面Vue详细入门&#xff08;语法【一】——【二】&#xff09;当中我们学习了Vue有哪些指令&#xff0c;它的核心语法有哪些&#xff1f;今天我们…

(AtCoder Beginner Contest 375) 题解(下)

一、题解 第 E 题 3 Team Division 一眼看像背包&#xff0c;观察数据范围&#xff0c;合法的总能力值 ≤ 500 \le 500 ≤500&#xff0c;那么我们可以设计一个背包DP&#xff1a; int dp[110][510][510]; //dp[i][j][k] 表示前 i 个人&#xff0c;分给第一组的能力值是 j&…

微服务架构 --- 使用Seata处理分布式事务

目录 一.Seata 是什么? 1.Seata的核心架构&#xff1a; 2. Seata的分布式事务处理流程&#xff1a; 二.Seata的基本使用&#xff1a; 1.环境准备&#xff1a; 2.引入依赖&#xff1a; 3.加入配置来使用Seata&#xff1a; &#xff08;1&#xff09;首先在nacos上添加一…

免费版视频压缩软件:让视频处理更便捷

现在不少人已经习惯通过视频来记录生活、传播信息和进行娱乐的重要方式。但是由于设备大家现在录制的文件都会比较大&#xff0c;这时候就比较需要一些缩小视频的工具了。今天我们一起来探讨视频压缩软件免费版来为我们带来的生动世界。 1.Foxit视频压缩大师 链接直达&#x…

ESP32移植Openharmony外设篇(1)MQ-2烟雾传感器

外设篇 实验箱介绍 旗舰版实验箱由2部分组成&#xff1a;鸿蒙外设模块&#xff08;支持同时8个工作&#xff09;、鸿蒙平板。 其中&#xff0c;鸿蒙平板默认采用RK3566方案。 OpenHarmony外设模块采用底板传感器拓展板方式&#xff0c;底板默认采用ESP32方案&#xff0c;也…

青少年编程能力等级测评CPA C++一级试卷(1)

青少年编程能力等级测评CPA C一级试卷&#xff08;1&#xff09; 一、单项选择题&#xff08;共20题&#xff0c;每题3.5分&#xff0c;共70分&#xff09; CP1_1_1&#xff0e;在C中&#xff0c;下列变量名正确的是&#xff08; &#xff09;。 A&#xff0e;$123 B&#…

Redis 的安装与部署(图文)

前言 Redis 暂不支持Windows 系统&#xff0c;官网上只能下载Linux 环境的安装包。但是启用WSL2 就可以在Windows 上运行Linux 二进制文件。[要使此方法工作&#xff0c;需要运行Windows 10 2004版及更高版本或Windows 11]。本文在CentOS Linux 系统上安装最新版Redis&#xf…

【C++】unordered_set、unordered_map超详细封装过程,处理底层细节

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言1、数据泛型2、迭代器2.1 重载2.2 begin、end2.3 const迭代器2.4 unordered_map中[]重载 3、特殊类型 总结 前…