目录
一、定制 rpm 包概述
1.1 什么是定制 rpm 包
1.2 为什么要定制 rpm 包
1.3 如何定制 rpm 包
二、安装 FPM 工具
2.1 我在安装过程出现如下错误:ERROR: Error installing fpm:childprocess requires Ruby version >= 2.4.0.
2.2 解决办法
2.3 再次执行安装 fpm
三、源码编译安装 nginx
四、使用 FPM
4.1 FPM 常用参数:
4.2 创建 NGINX 软件包脚本
4.3 打成 rpm 包
五、安装与卸载 RPM 包
5.1 测试 rpm 安装
5.2 测试卸载 nginx
一、定制 rpm 包概述
1.1 什么是定制 rpm 包
将原本,使用源码安装的服务,打包成 rpm 包。
1.2 为什么要定制 rpm 包
使用源码安装,步骤繁琐复杂,浪费时间,把源码包打成 rpm 包安装可以节省时间,提高工作效率,做好 rpm 包,可以将 rpm 包放入 yum 仓库中,方便安装。
1.3 如何定制 rpm 包
-
fpm 工具
-
rpmbuild 工具
本次以源码编译安装的 nginx 为例,使用 fpm 工具将其打成 rpm 包;使用的操作系统为 Centos 7.6。
二、安装 FPM 工具
fpm 是 ruby 语法写的一种定制 rpm 包的工具,所以安装 fpm 之前,需要安装 ruby 环境。
官方地址:Download RubyGems | RubyGems.org | your community gem host
阿里源地址:rubygems镜像_rubygems下载地址_rubygems安装教程-阿里巴巴开源镜像站
#1. 安装 ruby 环境
[root@nginx01 ~]# yum -y install ruby rubygems ruby-devel
#2. 查看 gem 默认的源
[root@nginx01 ~]# gem sources
*** CURRENT SOURCES ***
https://rubygems.org/
#3. 移除默认源
[root@nginx01 ~]# gem sources --remove https://rubygems.org/
https://rubygems.org/ removed from sources
#4. 添加阿里源
[root@nginx01 ~]# gem sources -a https://mirrors.aliyun.com/rubygems/
https://mirrors.aliyun.com/rubygems/ added to sources
[root@nginx01 ~]# gem sources
*** CURRENT SOURCES ***
https://mirrors.aliyun.com/rubygems/
#5. 安装 fpm 1.3.3 版本
[root@nginx01 ~]# gem install fpm -v 1.3.3
2.1 我在安装过程出现如下错误:ERROR: Error installing fpm:childprocess requires Ruby version >= 2.4.0.
报错原因:安装 childprocess-4.1.0.gem 包时,要求 ruby 版本必须 >=2.4.0。我们使用命令“ruby -v”查看 ruby 版本,如下:
2.2 解决办法
升级 ruby 版本。详细步骤如下:
#1. 离线安装 rvm:
# rvm 是用来管理 ruby 的,而 ruby 的其中一个“程序”叫 rubygems,也就是我们用它装 fpm 的,手动装各种库用 gem。
[root@nginx01 ~]# curl -sSL https://github.com/rvm/rvm/tarball/stable -o rvm-stable.tar.gz
#2. 解压 rvm 包:
[root@nginx01 ~]# tar -xzvf rvm-stable.tar.gz
#3. 进入解压目录,安装 rvm:
[root@nginx01 ~]# cd rvm-rvm-6bfc921/
[root@nginx01 rvm-rvm-6bfc921]# ./install --auto-dotfiles
#4. 重新加载 rvm:
[root@nginx01 rvm-rvm-6bfc921]# source /usr/local/rvm/scripts/rvm
#5. 查看 rvm 可安装版本:
[root@nginx01 rvm-rvm-6bfc921]# rvm list known
#6. 选择安装 ruby 2.6.3:
# 下载安装过程比较慢,请耐心等待
[root@nginx01 rvm-rvm-6bfc921]# rvm install 2.6.3
#7. 设置默认使用 ruby 版本:
[root@nginx01 rvm-rvm-6bfc921]# rvm use 2.6.3 --default
Using /usr/local/rvm/gems/ruby-2.6.3
[root@nginx01 rvm-rvm-6bfc921]# ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
可以看到 ruby 已升级至 2.6.3。再次执行 gem install fpm -v 1.3.3,就不会再报这个错误了,一会就安装完成了。
2.3 再次执行安装 fpm
[root@nginx01 rvm-rvm-6bfc921]# gem install fpm -v 1.3.3
安装完毕,应该是如下这样:
查看帮助命令:fpm -help
说明,已经安装成功。
三、源码编译安装 nginx
NGINX 下载官网:nginx: download
源码编译安装 NGINX 步骤:Linux CentOS 7 下安装Nginx详细过程_Stars.Sky的博客-CSDN博客_centos7安装nginx
四、使用 FPM
fpm 的使用也很简单,只要输入相应的参数值,就可以完成打包,并且支持 rpm 和 deb,这样可以在不同的平台下使用相同的方式来打包,一劳永逸。
4.1 FPM 常用参数:
- -s:指定源类型
- -t:指定目标类型,即想要制作为什么包
- -n:指定包的名字
- -v:指定包的版本号
- -C:指定打包的相对路径
- -d:指定依赖于哪些包
- -f:第二次包时目录下如果有同名安装包存在,则覆盖它;
- -p:制作的 rpm 安装包存放路径,不想放在当前目录下就需要指定;
- –post-install:软件包安装完成之后所要运行的脚本;同 –affer-install
- –pre-install:软件包安装完成之前所要运行的脚本;同 –before-install
- –post-uninstall:软件包卸载完成之后所要运行的脚本;同 –affer-remove
- –pre-uninstall:软件包卸载完成之前所要运行的脚本;同 —before-remove
- –prefix:制作好的 rpm 包默认安装路径;
支持的源类型包:
- dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包
- rpm: 对 rpm 进行转换
- gem: 对 rubygem 包进行转换
- python: 将 Python 模块打包成相应的类型
支持的目标类型包:
- rpm: 转换为 rpm 包
- deb: 转换为 deb 包
- solaris: 转换为 solaris 包
- puppet: 转换为 puppet 包
想要了解最新的参数,可以使用命令查看帮助:fpm -help
4.2 创建 NGINX 软件包脚本
- 安装后脚本:nginx_install.sh
[root@nginx01 ~]# vim nginx_install.sh
#!/bin/bash
echo '
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-Tookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target ' > /lib/systemd/system/nginx.service
systemctl enable nginx.service --now
- 卸载后脚本:remove_nginx.sh
[root@nginx01 ~]# vim remove_gninx.sh
#!/bin/bash
systemctl disable nginx.service
rm -rf /lib/systemd/system/nginx.service
rm -rf /usr/local/nginx
4.3 打成 rpm 包
[root@nginx01 ~]# fpm -s dir -t rpm -n nginx -v 1.20.2 -d 'pcre-devel,openssl-devel,zlib-devel' --post-install /root/nginx_install.sh --post-uninstall /root/remove_gninx.sh -f /usr/local/nginx
命令参数说明:
- -s dir:将目录进行打包。
- -t rpm:将目录打成 rpm 包。也可以写 deb,表示打成 deb 包。
- -n nginx:包名为 nginx,记住这个名字,卸载时,需要使用 nginx 名称。
- -v 1.20.2:包的版本号为 1.20.2。
- -d 'pere-devel.openssl-devel,zlib-devel':指定安装此包需要的依赖有哪些。(本地仓库会自动去下载指定的依赖,不指定则不去下载安装依赖)
- --post-install /root/nginx_install.sh:软件包安装完成之后运行 nginx_install.sh 脚本。
- --post-uninstall /root/remove_nginx.sh:软件包卸载完成之后运行 remove_nginx.sh 脚本。
- -f:多次打包时,输出目录下如果有同名安装包存在,则覆盖它。
- /usr/local/nginx:指定需要被打包的路径。
最后,打包生成的 rpm 文件在当前命令执行的目录下(/root 目录)。如下:
# RPM 包的组成格式:
nginx-1.20.2-1.x86_64.rpm
| | | | |
软件名称 | | | |
版本号 | | |
发布号| |
硬件平台 |
扩展名
# 例子备注:
nginx : 软件名称
1.20.2: 软件版本号
1 :发布号主要是对软件存在的 bug 或漏洞进行修补,在软件功能上并没有变化
x86_64: 指64位的 PC 架构,另外还有'i386' 'i686' 等32位的 PC 架构
rpm :文件扩展名
五、安装与卸载 RPM 包
5.1 测试 rpm 安装
把制作的包传到另一个机子:
# 使用 yum 本地安装会根据本地仓库去拉取所需的依赖
[root@shell ~]# yum -y localinstall nginx-1.20.2-1.x86_64.rpm
# 也可以使用 rpm 管理安装,但是不能下载 nginx 所需的依赖。nginx 依然可以安装成功,但是没有依赖的话有部分功能用不了,如 https,因为没有 OpenSSL。如果是其他不需要安装依赖的 rpm 包,可以用下面命令安装:
rpm -ivh nginx-1.20.2-1.x86_64.rpm
# 可以直接查看 nginx 状态
[root@shell ~]# systemctl status nginx.service
# 用 rpm 管理nginx
[root@shell ~]# rpm -ql nginx
[root@shell ~]# rpm -q --scripts nginx # 查看脚本信息
5.2 测试卸载 nginx
[root@shell ~]# rpm -e nginx
# 此时使用的软件包名 nginx,就是打包时,通过 -n 参数指定的名称。