Linux 自定义 RPM 包及制作 YUM 仓库

导读:本篇文章讲解 Linux 自定义 RPM 包及制作 YUM 仓库,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

一、定制 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

六、制作 YUM 仓库 

前期准备

制作步骤


一、定制 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.

Linux 自定义 RPM 包及制作 YUM 仓库

报错原因:安装 childprocess-4.1.0.gem 包时,要求 ruby 版本必须 >=2.4.0。我们使用命令“ruby -v”查看 ruby 版本,如下: 

Linux 自定义 RPM 包及制作 YUM 仓库

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

安装完毕,应该是如下这样: 

Linux 自定义 RPM 包及制作 YUM 仓库

查看帮助命令:fpm -help

Linux 自定义 RPM 包及制作 YUM 仓库

说明,已经安装成功。 

三、源码编译安装 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
# 注册 nginx 服务
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

# 启动 nginx 并设置开机自启 
systemctl enable nginx.service --now

# 设置环境变量
echo 'export PATH="/usr/local/nginx/sbin/:$PATH"' >> /etc/profile
echo 'nginx 安装成功! 请手动执行 "source /etc/profile" 或者重启终端, 使环境变量生效!'
  •  卸载后脚本: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 目录)。如下:

Linux 自定义 RPM 包及制作 YUM 仓库

# 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 参数指定的名称。

六、制作 YUM 仓库 

        有些服务器要求使用内网环境,安装一些软件时,需要下载依赖,也可能某个依赖还会依赖其他软件包,如上面的 nginx,需要依赖些软件包。所以这个时候,我们可以搭建一个本地的 yum 仓库服务,在不能访问外网的环境下,本地安装软件。

前期准备

        两台虚拟机,一台可以访问外网并且安装 nginx 提供 yum 仓库服务,另一台则测试本地安装 nginx。

制作步骤

  • 在可以访问外网的虚机下执行下面操作:
#1. 创建自制仓库目录
[root@nginx01 ~]# mkdir -p /diy_repo/nginx_repo

#2. 下载 nginx 所需依赖
方法一(推荐):使用 yumdownloader 命令,yumdownloader 在 yum-utils 软件包里面
[root@nginx01 ~]# yum install yum-utils -y
[root@nginx01 ~]# yumdownloader --destdir=/diy_repo/nginx_repo --resolve openssl-devel pcre-devel zlib-devel

# yumdownloader --destdir=指定下载的软件包存放路径 --resolve 要安装的软件包

方法二:此方法下载软件包的同时也把软件安装了
[root@nginx01 ~]# yum install --downloadonly --downloaddir=/diy_repo/nginx_repo openssl-devel pcre-devel zlib-devel
# yum install --downloadonly --downloaddir=指定下载的软件包存放路径 
# 注意:若系统已经安装了此软件,需要使用 reinstall 进行下载

#3. 把上面制作的 nginx rpm 包也放在这个目录下
[root@nginx01 ~]# mv nginx-1.20.2-1.x86_64.rpm /diy_repo/nginx_repo/

#4. 用 nginx 代理仓库服务
[root@nginx01 ~]# cd /usr/local/nginx/conf/
[root@nginx01 conf]# mkdir conf.dmkdir conf.d
[root@nginx01 conf]# vim nginx.conf
    include /usr/local/nginx/conf/conf.d/*.conf;    # 把这行加到 http 模块里面
    server {

[root@nginx01 conf]# cd conf.d/ 
[root@nginx01 conf.d]# vim diy_repo.conf
server{
        # 监听88端口
        listen 88;

        # 指定访问的 ip
        server_name 192.168.78.135;

        # 配 URL
        location / {
        # 站点目录
        root /diy_repo/nginx_repo/;
        # 以列表形式展示(在站点目录下没有默认页面的情况)
        autoindex on;
        # 修改时间为当前系统时间(不使用格林威治时间)
        autoindex_localtime on;
        # 显示文件大小(显示单位)
        autoindex_exact_size off;
        }
}

[root@nginx01 conf.d]# systemctl reload nginx.service

#5. 安装仓库创建命令
[root@nginx01 conf.d]# yum install -y createrepo

#6. 制作仓库
[root@nginx01 conf.d]# createrepo /diy_repo/nginx_repo/

在浏览器访问 ip:88 

Linux 自定义 RPM 包及制作 YUM 仓库

  • 在另一台用来测试的虚机执行下面操作:
#1. 压缩本地的仓库源(因为我这台可以访问外网,来模拟内网环境)
# 解压为 gunzip /etc/yum.repos.d/*.gz
[root@shell ~]# gzip /etc/yum.repos.d/*

#2. 编写 yum 仓库文件
[root@shell ~]# vim /etc/yum.repos.d/local_nginx.repo
[nginx_test]
name=local_nginx
baseurl=http://192.168.78.135:88/nginx_repo/
gpgcheck=0
enabled=1

#3. 生成缓存
[root@shell ~]# yum makecache

#4. 安装 nginx;所需依赖也会一并安装上
[root@shell ~]# yum install -y nginx

至此,本地环境 yum 仓库制作成功!!! 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74546.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!