如何打一个RPM包
如何打一个RPM包
参考链接:RPM打包原理、示例、详解及备查
前言
本文只是一个RPM安装的例子,并没有对RPM做比较详尽的叙述,更为详尽的讲解,可以在上面的链接中找到。
RPM是啥?
RPM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。
话不多说,让我们开始打RPM包!我们将以打Supervisor包为例。
安装rpmbuild
在开始之前,我们先做好准备工作:
RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包。
$ yum install rpm-build
$ yum install rpmdevtools
打成的包要做什么?
接着,我们来看看如果手动安装Supervisor,我们可能要的步骤:
- 将压缩包上传至: /tmp/
- cd /tmp/
- tar -C /opt/ -xzf supervisor-4.0.2.tar.gz
- cd /opt/
- mv supervisor-4.0.2 supervisor
- cd supervisor
- python setup.py install
- echo_supervisord_conf > /etc/supervisord.conf
- supervisord -c /etc/supervisord.conf
即解压 / 重命名文件夹 / 运行安装脚本 / 增加配置文件 / 启动进程
创建RPM文件
接下来,我们将上面的操作转为RPM操作,首先我们需要编写一个spec
文件。我们可以通过spec
文件来配置要生成的rpm包(有点类似Docker的Dockerfile
)。
新建spec文档
我们不妨先找到rpmbuild
所在目录,通过yum install
安装,一般位置为
/用户名/rpmbuild
查看下面的目录
$ ll
total 0
drwxr-xr-x 6 root root 88 May 13 14:30 BUILD
drwxr-xr-x 5 root root 129 May 13 14:30 BUILDROOT
drwxr-xr-x 3 root root 20 May 10 17:04 RPMS
drwxr-xr-x 3 root root 150 May 13 10:29 SOURCES
drwxr-xr-x 2 root root 88 May 13 14:30 SPECS
drwxr-xr-x 2 root root 163 May 13 14:30 SRPMS
这些目录都是干嘛的呢?请看:
默认位置 | 宏代码 | 名称 | 用途 |
---|---|---|---|
~/rpmbuild/SPECS | %_specdir | Spec 文件目录 | 保存 RPM 包配置(.spec)文件 |
~/rpmbuild/SOURCES | %_sourcedir | 源代码目录 | 保存源码包(如 .tar 包)和所有 patch 补丁 |
~/rpmbuild/BUILD | %_builddir | 构建目录 | 源码包被解压至此,并在该目录的子目录完成编译 |
~/rpmbuild/BUILDROOT | %_buildrootdir | 最终安装目 | 保存 %install 阶段安装的文件 |
~/rpmbuild/RPMS | %_rpmdir | 标准 RPM 包目录 | 生成/保存二进制 RPM 包 |
~/rpmbuild/SRPMS | %_srcrpmdir 源代码 | RPM 包目录 | 生成/保存源码 RPM 包(SRPM) |
正如上文所说,我们不妨把编写的spec
文件放在SPECS
目录里面。
$ cd /root/rpmbuild/SPEC/
$ vim supervisor.spec
向spec文档添加内容
基于哪个代码包?
首先我们要知道rpm包生成基于哪个文件生成,一般都是压缩包格式的源代码软件包,比如
supervisor-4.0.2.tar.gz
添加下面的内容
# 软件包的名称
Name: supervisor
# 软件包的版本
Version: 4.0.2
# 源代码软件包的名字
Source0: %{name}-%{version}.tar.gz
上面的Source即指定了源代码软件包。我们同时需要将supervisor-4.0.2.tar.gz
文件,放入
上面所说的SOURCES
目录。
解压缩代码包
setup -q
命令会自动将上一步指定的压缩包解压,并将文件包内容放置到BUILD
目录里;然后cd
到解压后的目录中。
# 安装前的准备工作,一般用于解压源码包
%prep
# 解压并cd到相关目录
%setup -q
进行安装
这一步,按照我的感觉,是要把python setup.py install
内容加进来的,但是实验后发现,这句命令在%install
区内无法执行,需要放置到下一步的区域中。
# 源码安装,如:make install 命令
%install
mkdir -p %{buildroot}/opt/supervisor/
cp -rp %{_builddir}/%{name}-%{version}/* %{buildroot}/opt/supervisor/
安装后置操作
所有文件安装成功后,就可以执行剩下的操作了。%post
区域里就是存放这些操作的。
## 安装后执行的脚本
%post
cd /opt/supervisor/
python setup.py install
echo_supervisord_conf > /etc/supervisord.conf
supervisord -c /etc/supervisord.conf
这样一来,spec的主要内容部分就都写好了,剩下的就补充一些细枝末节了。
完善spec内容
将剩余的字段完善后,得到的最终文件如下所示:
# 软件包的名称
Name: supervisor
# 软件包的版本
Version: 4.0.2
# 软件包发布序列号,1表示第几次打包
Release: 1%{?dist}
# 软件包的概要信息,不要超过50个
Summary: The supervisor is a client/server system.
# 软件授权方式
License: BSD-derived
# 软件分类
Group:System Environment/Daemons
# 源代码软件包的官方地址或源码包的下载地址
URL: https://pypi.org/project/supervisor/
# 源代码软件包的名字
Source0: %{name}-%{version}.tar.gz
# install使用的虚拟目录,安装后就在该目录下打包
BuildRoot: %_topdir/BUILDROOT
#软件包详细描述信息
%description
The supervisor is a client/server system that allows its users to control a number of processes on UNIX-like operating systems.
# 安装前的准备工作,一般用于解压源码包
%prep
#解压并cd到相关目录
%setup -q
# 源码编译,如: ./configure && make命令
%build
# 源码安装,如:make install 命令
%install
mkdir -p %{buildroot}/opt/supervisor/
cp -rp %{_builddir}/%{name}-%{version}/* %{buildroot}/opt/supervisor/
## 安装后执行的脚本
%post
cd /opt/supervisor/
python setup.py install
echo_supervisord_conf > /etc/supervisord.conf
supervisord -c /etc/supervisord.conf
# 清理临时文件
%clean
# rm -rf %{buildroot}
# 定义那些文件或目录放入RPM当中 %file是在虚拟根目录(BuildRoot)下进行,千万不要写绝对路径,应该使用宏或者变量表示相对路径
%files
/
%doc
# RPM包软件的每次修改记录到这里
%changelog
* Fri May 13 2019 MG
- Initial Supervisor 4.0.2 RPM release
生成RPM包并安装
我们可以使用上面所编写的spec
文件来生成RPM
包。
生成rpm
$ rpmbuild -ba supervisor.spec
运行完上述命令后,我们可以进入RPMS
目录。发现多了一个rpm文件。
$ ll RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm
-rw-r--r-- 1 root root 643728 May 13 14:16 RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm
安装RPM包
将生成的rpm文件复制到另外一台机器上,执行下面的命令,就可以发现rpm包可以正常安装了。
rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm
大功告成!
可能遇到的问题
问题1:rpm conflicts with file from package
安装的时候增加–replacefiles
参数,例如
rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacefiles
问题2:xxx is already installed
安装的时候增加--replacepkgs
参数,例如
rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacepkgs
问题3:如何查看当前系统发行版
$ cat /proc/version
Linux version 3.10.0-693.25.4.el7.x86_64 (mockbuild@x86-030.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Sat Apr 28 14:04:53 EDT 2018
如何打一个RPM包的更多相关文章
- C0302 将一个代码块中的内容保存在文件中, 查看一个rpm包是否可以安装
#!/bin/bash # 这个脚本是用来描述和确认是否可以安装一个rpm包 # 在一个文件中保存输出 SUCCESS=0 E_NOARGS=65 if [ -z "$1" ] t ...
- 《Advanced Bash-scripting Guide》学习(七):描述、列表和确定是否可以安装一个rpm包
本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 Example 3-2.将一个代码块的结果保存到文件 #!/bin/bash # ...
- RPM包制作教程
一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...
- Centos下安装nginx rpm包
1 在nginx官方网站下载一个rpm包,下载地址是:http://nginx.org/en/download.html wget http://nginx.org/packages/centos/6 ...
- 安装RPM包或者安装源码包
本系列的博客来自于:http://www.92csz.com/study/linux/ 在此,感谢原作者提供的入门知识 这个系列的博客的目的在于将比较常用的liunx命令从作者的文章中摘录下来,供自己 ...
- 烂泥:Linux源码包制作RPM包之Apache
本文由秀依林枫提供友情赞助,首发于烂泥行天下 公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装.apache的rpm包安装方式比源码安装方式比较快,这能 ...
- 安装rpm包
下载好一个rpm包怎样安装? [root@localhost ~]# ls anaconda-ks.cfg install.log install.log.syslog jboss-as-7.1.1- ...
- rpm包制作(待实验)
作者:firefoxbug 时间:July 18, 2014 rpm包命名规范 对于rpm包的命名符合如下规范. %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm N ...
- 安装 RPM 包或者安装源码包
安装 RPM 包或者安装源码包 在windows下安装一个软件很轻松,只要双击.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件似乎并不那么轻松了,因为我们不是在图形界面下. ...
随机推荐
- Python高阶之多线程锁机制
'''1.多进程的优势:为了同步完成多项任务,通过提高资源使用效率来提高系统的效率.2.查看线程数:threading.enumerate()函数便可以看到当前线程的数量.3.查看当前线程的名字:th ...
- NOI2021游记
NOI2021游记 前言 写于 2021.7.28,成绩榜刚出后几个小时.总分 345 拿到银牌 183 名. 我的高中 OI 生活在这里画上句号.结局对我而言虽然不够完美,但是无论怎样都是我人生道路 ...
- RHEL7通过Rsyslog搭建集中日志服务器
说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独搭建rsyslog日志服务器的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需要查看相 ...
- 解决pip下载速度慢的问题
解决链接:https://blog.csdn.net/u013901768/article/details/82343512 感谢这位博主的分享. 博客内容如下: 1. 安装时强制使用国内源进行安装, ...
- 100的累加和 for循环
1 int main() 2 { 3 int sum ; 4 int i; 5 for(i = 0; i<101; i++) 6 { 7 sum += i; 8 } 9 printf(" ...
- 做了两年多的安卓,突然想转Java后端,感觉Android职业前景不太好,转还是不转?
近几年相信很多Android开发者都有过这种想法,最终还是有些Android 开发选择了转行,但是还有些开发者选择了坚持. 因为现在Android开发确实竞争很大,很多公司抛出几个岗位,每天能收到成百 ...
- 我一个五年Android开发,居然被一个技术不如我的面试官嫌弃了......
背景 首先介绍一下自己的情况.目前所在的是一家小的创业公司,待了5年多,薪资一般吧.由于这几年公司也在转型.工作经历大概可以分为 3 个阶段. 第一阶段是从进公司开始做 android app 开发, ...
- 冲击BATZ!GitHub近8.3K+的Android进阶指南,面试再也不愁了
过去十年是移动互联网蓬勃发展的黄金期,相信每个人也都享受到了移动互联网红利,在此期间,移动互联网经历了曙光期.成长期.成熟期.现在来说已经进入饱和期. 依然记得在 2010-2013 年期间,从事移动 ...
- Prettier-Code Formater代码格式化插件使用教程
目录 Prettier-Code Formater代码格式化插件使用教程 插件的安装 插件的使用 方式一: 配置VScode代码格式化后, 结合VScode快捷键使用 方式二: CLI中使用命令行的方 ...
- SaToken学习笔记-03
SaToken学习笔记-03 如果排版有问题,请点击:传送门 核心思想 所谓权限验证,验证的核心就是一个账号是否拥有一个权限码 有,就让你通过.没有?那么禁止访问! 再往底了说,就是每个账号都会拥有一 ...