构建RPM之SPEC详解
一.简单说明
在centos/rhel的系统使用中,我们会涉及自己构建一些rpm包在centos/rhel的系统中进行安装,这里涉及rpm打包环境的部署、SPEC文件的编写相关,下面我们具体进行说明。
二.部署rpm打包环境
2.1 安装rpm-build的相关rpm包
yum -y install rpm-build rpmdevtools
2.2 生成打包目录结构
[root@centos7 ~]# rpmdev-setuptree
[root@centos7 rpmbuild]# ls /root/rpmbuild/
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
目录解释:
- BUILD:源码解压后存放的目录
- RPMS:制作完成后的RPM存放目录
- SOURCES:存放源文件,配置文件,补丁文件等放置的目录
- SPECS:存放SPEC文件,制作RPM包的目录
- SRPMS:src格式的RPM包目录
- BUILDROOT:虚拟安装目录,在整个install的过程中临时安装到此目录,把这个目录当做根来使用。所有在这个目录下的文件才是真正的目录文件,最后SPEC文件中有清理阶段,这个目录下的内容将被删除。
2.3 改变打包目录
这里在2.2章节我们默认生成的rpmbuild目录在/root目录下,如果我们想将构建RPM包的打包目录改变其它目录,可以参照如下方式进行:
例如,我们将rpmbuild目录移动到/home目录:
[root@centos7 ~]# mv /root/rpmbuild /home
[root@centos7 ~]# vi /root/.rpmmacros
[root@centos7 ~]# vi /root/.rpmmacros
# 这里改变%_topdir的目录为新移动的rpm构建目录
%_topdir /home/rpmbuild
%_smp_mflags %( \
[ -z "$RPM_BUILD_NCPUS" ] \\\
&& RPM_BUILD_NCPUS="`/usr/bin/nproc 2>/dev/null || \\\
/usr/bin/getconf _NPROCESSORS_ONLN`"; \\\
if [ "$RPM_BUILD_NCPUS" -gt 16 ]; then \\\
echo "-j16"; \\\
elif [ "$RPM_BUILD_NCPUS" -gt 3 ]; then \\\
echo "-j$RPM_BUILD_NCPUS"; \\\
else \\\
echo "-j3"; \\\
fi )
%__arch_install_post \
[ "%{buildarch}" = "noarch" ] || QA_CHECK_RPATHS=1 ; \
case "${QA_CHECK_RPATHS:-}" in [1yY]*) /usr/lib/rpm/check-rpaths ;; esac \
/usr/lib/rpm/check-buildroot
%debug_package %{nil}
改变后,我们可以通过如下的命令查看工作目录的路径:
[root@centos7 rpmbuild]# rpmbuild --showrc | grep topdir
-14: _builddir %{_topdir}/BUILD
-14: _buildrootdir %{_topdir}/BUILDROOT
-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir /home/yushengyin/rpmbuild
三.SPEC文件详解
RPM包的SPEC文件有许多配置信息,包含:软件基础信息、安装卸载前后执行的脚本、对源码包打补丁、解压、编译、安装等。
SPEC文件中包含了很多关键字,具体参考如下:
- Name: 软件包的名称,在后面的变量中即可使用%{name}的方式引用
- Summary: 软件包的内容
- Version: 软件的实际版本号,例如:1.12.1等,后面可使用%{version}引用
- Release: 发布序列号,例如:1%{?dist},标明第几次打包,后面可使用%{release}引用
- Group: 软件分组,建议使用:Applications/System
- License: 软件授权方式GPLv2
- Source: 源码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
- BuildRoot: 这个是安装或编译时使用的临时目录,即模拟安装完以后生成的文件目录:%_topdir/BUILDROOT 后面可使用$RPM_BUILD_ROOT 方式引用。
- URL: 软件的URI
- Vendor: 打包组织或者人员
- Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
- Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
- Prefix: %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
- Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
libxxx-devel >= 1.1.1 openssl-devel 。 注意:“>=”号两边需用空格隔开,而不同软件名称也用空格分开 - %description: 软件的详细说明
- %define: 预定义的变量,例如定义日志路径: _logpath /var/log/weblog
- %prep: 预备参数,通常为 %setup -q
- %build: 编译参数 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx/……
- %install: 安装步骤,此时需要指定安装路径,创建编译时自动生成目录,复制配置文件至所对应的目录中
- %pre: 安装前需要做的任务,如:创建用户
- %post: 安装后需要做的任务 如:自动启动的任务
- %preun: 卸载前需要做的任务 如:停止任务
- %postun: 卸载后需要做的任务 如:删除用户,删除/备份业务数据
- %clean: 清除上次编译生成的临时文件,就是上文提到的虚拟目录
- %files: 设置文件属性,包含编译文件需要生成的目录、文件以及分配所对应的权限
- %changelog: 修改历史
四.构建RPM包
这里,我们制作一个RPM包用于配置centos7.x各系统之间的无密钥访问:
4.1 创建ssh-no-rsa的源文件
[root@centos7 SOURCES]# mkdir ssh-no-rsa-1.0.0
# 将涉及到的无密钥访问的文件移动到源码目录
[root@centos7 SOURCES]# cp -a {authorized_keys,id_rsa.pub,id_rsa} ssh-no-rsa-1.0.0
4.2 创建一个spec文件
[root@centos7 SPECS]# touch ssh-no-rsa-1.0.0.spec
[root@centos7 SPECS]# vim ssh-no-rsa-1.0.0.spec
[root@centos SPECS]# cat ssh-no-rsa-1.0.0.spec
#----------------------------------------------------------------------------------------------------------------------------------
Name: ssh-no-rsa
Version: 1.0.0
Release: 0
Summary: kubernetes system config
License: Shareware
Source0: %{name}-%{version}
# 这里我们定义一个无密钥访问时密钥的存放目录
%define sshdir /root/.ssh
%description
ssh and other config
%install
# 创建上面定义的无密钥存放目录,注意使用-d
install -d -m 0700 %{buildroot}%{sshdir}
# 安装无密钥访问的文件到指定的目录
install -D -p -m 0755 %{SOURCE0}/authorized_keys %{buildroot}%{sshdir}/authorized_keys
install -D -p -m 0755 %{SOURCE0}/id_rsa.pub %{buildroot}%{sshdir}/id_rsa.pub
install -D -p -m 0755 %{SOURCE0}/id_rsa %{buildroot}%{sshdir}/id_rsa
%pre
rm -rf %{sshdir}/{authorized_keys,id_rsa.pub,id_rsa}
%postun
rm -rf %{sshdir}
%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
%files
%attr(-,root,root) %{sshdir}/*
%changelog
* Mon Apr 20 2020 yuhaohao <yuhaohaozz@163.com>
- 1.配置无密钥访问
4.3 构建rpm包
[root@centos7 SPECS]# rpmbuild -bb ssh-no-rsa-1.0.0.spec
# 构建成功后,查看构建的RPM
[root@centos7 SPECS]# ls /home/rpmbuild/RPMS/x86_64/ssh-no-rsa-1.0.0-0.x86_64.rpm
/home/rpmbuild/RPMS/x86_64/ssh-no-rsa-1.0.0-0.x86_64.rpm
# 查看RPM包内容
[root@centos7 SPECS]# rpm -qpl /home/rpmbuild/RPMS/x86_64/ssh-no-rsa-1.0.0-0.x86_64.rpm
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_rsa.pub
4.4 验证安装
[root@centos ~]# rpm -ivh ssh-no-rsa-1.0.0-0.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:ssh-no-rsa-1.0.0-0 ################################# [100%]
0K,到这里我们成功创建了一个RPM。
总结:RPM包的构建本身是个比较简单的过程,但是还是要结合实际的业务需求去定制。定制时,需要考虑整个安装流程需要考虑流程。
构建RPM之SPEC详解的更多相关文章
- 前端构建:Source Maps详解
一.前言 当使用CoffeeScript.ClojureScript编写前端脚本时,当使用Less.Sacc编写样式规则时,是否觉得调试时无法准确找到源码位置呢?当使用jquery.min.js等经压 ...
- RPM命令用法详解
RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证. 下面我们就来逐一的讲解吧. 一. 安装RPM包 RPM 软件包通常具有类似foo-1.0-1.i386.rp ...
- RPM Database 实战详解
RPM 是 RPM Package Manager 的简写,是发源于 Red-hat 系统的软件管理工具,所以最初的名字叫做 Red-hat Packager Manager.目前,RPM 已发展成为 ...
- rpm包名详解-rpm命令使用方法
linux软件包管理-rpm mount # 挂载 1.将光盘镜像插入光驱 2.创建挂载目录 mkdir /guangqu 3.挂载到/guangqu [root@gong ~]# mount /de ...
- AngularJS开发指南16:AngularJS构建大型Web应用详解
AngularJS是由Google创建的一种JS框架,使用它可以扩展应用程序中的HTML功能,从而在web应用程序中使用HTML声明动态内容.在该团队工作的软件工程师Brian Ford近日撰写了一篇 ...
- ECharts概念学习系列之ECharts官网教程之自定义构建 ECharts(图文详解)
不多说,直接上干货! 官网 http://echarts.baidu.com/tutorial.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9E%84%E5%BB%BA%2 ...
- webpack(构建一个前端项目)详解--升级
升级一个正式的项目结构 分离webpack.config.js文件: 新建一个webpack.config.base.js任何环境依赖的wbpack //public webpack const pa ...
- Linux上构建一个RADIUS服务器详解
作为一名网络管理员,您需要为您所需管理的每个网络设备存放用于管理的用户信息.但是网络设备通常只支持有限的用户管理功能.学习如何使用Linux上的一个外部RADIUS服务器来验证用户,具体来说是通过一个 ...
- 使用Gradle构建web工程配置详解
- Gradle构建Java工程配置详解
随机推荐
- gorm stdErr = sql: Scan error on column index 0, name "total": converting NULL to float64 is unsupported
前言 使用 gorm 查询时,报错:stdErr = sql: Scan error on column index 0, name "total": converting NUL ...
- 更新docker配置,重启docker进程,容器不重启
前言 想重启 dockerd ,重新加载配置文件,可又怕重启容器,影响线上业务. reload 重新加载配置 dockerd reload 配置,不会重启 dockerd kill -SIGHUP $ ...
- 怎么解决DB读写分离,导致数据不一致问题?
前言 在互联网中大型项目中,读写分离应该是我们小伙伴经常听说的,这个主要解决大流量请求时,提高系统的吞吐量.因为绝大部分互联网产品都是读多写少,大部分都是读请求,很小部分是写请求. 上图: 1)一个主 ...
- wincurl:一款基于HTTP协议的轻量级web资源抓取和上传工具
编写web程序经常要进行接口调测,通常我们会使用curl或者postman等工具,通过这些工具可以方便的发送GET或POST请求来验证接口的正确与否. 对于复杂的接口业务,我们可以通过这些工具构造po ...
- 连接MySQL数据库出现时Authentication plugin 'caching_sha2_password' cannot be loaded的解决办法
问题描述:用Navicat Premium或HeidiSQL连接MySQL数据库时会弹出下面的情况 解决方法: 1.运行命令行窗口,输入以下命令,输入密码后进入到mysql中,(最好将MySQL安装目 ...
- 队列的实现方式(先进先出 FIFO)--环形队列
博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- class Queue: def __init__(self, size= ...
- 有限Abel群的结构(1)
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 https://www.cnblogs.com/Colin-Cai/p/18774816.html 作者:窗户 ...
- EagleOS 9.5-基于AlmaLinux 9.5深度定制优化
EagleOS 9.5 说明文档 一.系统简介 EagleOS 9.5基于AlmaLinux 9.5进行深度定制优化. EagleOS 9.5根据AlmaLinux 9.5官方AlmaLinux-9. ...
- Java中的常见排查问题命令
一.线上服务排查,从三个方面负载.cpu.内存 这三个方面着手 1:top 命令是比较常见的,也是最常用的,因为他显示的信息也是最全的 2:针对负载的问题,我们怎么能确定负载当前是高还是低? 一般来说 ...
- 🧠 Model Context Protocol(MCP)详解:AI 编程新时代的“USB 接口
目标读者:具备一定编程基础,但尚未涉足 AI 编程的开发者 本文目的:帮助你理解 MCP 的核心概念.技术优势.运作机制,并指导你如何使用 MCP 构建智能体项目. 什么是 MCP? MCP,全称 M ...