制作rpm包实例

RPM包是Red Hat Package Manager的简称,主要用于基于Red Hat的Linux系统,如Fedora、CentOS等。它包含了可执行文件、配置文件和其他文档。RPM包遵循特定的命名规则,并通过.spec文件定义构建方式。创建RPM包涉及准备环境、编写.spec文件、构建源码和安装。通过`rpmbuild`命令可以制作和安装RPM包,而`rpm`命令用于查询、安装和卸载。
摘要由CSDN通过智能技术生成

RPM包是什么

RPM:Red Hat Package Manager。由Red Hat开发,最初使用在基于Red Hat的Linux操作系统(Fedora、CentOS,RHEL等等)。

RPM包

RPM包以.rpm扩展名,包含多种文件

  • 可执行文件(比如sshd命令)
  • 配置文件(比如sshd.conf)
  • 其他文档(比如README)

命名规则

<name>-<version>-<release>.<arch>.rpm

举个例子:bdsync-0.11.1-1.x86_64.rpm

也有些package包含系统发行版的缩写,比如:

bdsync-0.11.1-1.el8.x86_64.rpm

如何创建RPM包

准备工作

  • A worksation or a VM running an RPM-based distribution, such RHEL or Fedora.
  • Software to build the package.
  • Source code to package.
  • SPEC file to build the RPM.

安装必要的软件包:

sudo dnf install -y rpmdevtools rpmlint

然后创建构造RPM所需的文件树目录

$ rpmdev-setuptree
# 该命令将会在当前用户的home目录下创建rpmbuild文件夹,比如root用户:
$ tree /root/rpmbuild
rpmbuild/
├── BUILD	#构建RPM包过程中临时文件存放目录
├── RPMS	#存放不同架构的目标RPM包
├── SOURCES	#存放源码,比如脚本、C代码等,按.tar.gz或.tgz压缩文件
├── SPECS	#存放.spec文件,定义如何制作一个RPM包
└── SRPMS	#存放.src.rpm包,Source RPM不依赖任何架构或发行版,实际上.rpm是基于.src.rpm制作而来

.src.rpm包可以用于在任何RPM-base发行版和架构版本上进行built或re-built制作成.rpm包。

实例

源码构建

创建hello.sh脚本,并赋予可执行权限

$ cat << EOF >> hello.sh
> #!/bin/sh
> echo "Hello RPM!"
> EOF

$ chmod +x hello.sh

创建源码打包文件,并存放到SOURCES目录

$ mkdir hello-0.0.1
$ mv hello.sh hello-0.0.1/
$ tar --create --file hello-0.0.1.tar.gz hello-0.0.1/
$ mv hello-0.0.1.tar.gz ~/rpmbuild/SOURCES/

创建.spec文件,并编辑

$ rpmdev-newspec hello
$ mv hello.spec ~/rpmbuild/SPECS/
Name:           hello
Version:        0.0.1
Release:        1%{?dist}
Summary:        A simple hello RPM script
BuildArch:      noarch

License:        GPL
Source0:        %{name}-%{version}.tar.gz

Requires:       bash

%description
A demo RPM build

%prep
%setup -q

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/%{_bindir}
cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir}

%clean
rm -rf $RPM_BUILD_ROOT

%files
%{_bindir}/%{name}.sh

%changelog
* Thu Aug 11 2022 - 0.0.1
- First version being packaged

检查.spec文件错误

$ rpmlint ~/rpmbuild/SPECS/hello.spec

# 会有警告
  /root/rpmbuild/SPECS/hello.spec: W: no-%build-section
  /root/rpmbuild/SPECS/hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz
  0 packages and 1 specfiles checked; 0 errors, 2 warnings.
  #这里可以不用管,我们只是个脚本,不需要指定 %build,只是个内部例子,也不需要URL

制作RPM包

# 制作.src.rpm包
# 参数含义: -b:build  -s:source
[root@localhost rpmbuild]# rpmbuild -bs ~/rpmbuild/SPECS/hello.spec
Wrote: /root/rpmbuild/SRPMS/hello-0.0.1-1.el7.src.rpm

# 制作.rpm包
# 参数含义: -b:build  -b:binary
$ rpmbuild -bb ~/rpmbuild/SPECS/hello.spec

# 也可以一起制作
$ rpmbuild -ba ~/rpmbuild/SPECS/hello.spec
[root@localhost rpmbuild]# tree
.
├── BUILD
│   └── hello-0.0.1
│       └── hello.sh
├── BUILDROOT
├── RPMS
│   └── noarch
│       └── hello-0.0.1-1.el7.noarch.rpm
├── SOURCES
│   └── hello-0.0.1.tar.gz
├── SPECS
│   └── hello.spec
└── SRPMS
    └── hello-0.0.1-1.el7.src.rpm

8 directories, 5 files
安装RPM包
# 两种命令都可以
$ dnf install ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el7.noarch.rpm
$ rpm -ivh ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el7.noarch.rpm
确认RPM包已经被安装
[root@localhost rpmbuild]# rpm -qi hello
Name        : hello
Version     : 0.0.1
Release     : 1.el7
Architecture: noarch
Install Date: Thu 11 Aug 2022 06:10:31 AM EDT
Group       : Unspecified
Size        : 28
License     : GPL
Signature   : (none)
Source RPM  : hello-0.0.1-1.el7.src.rpm
Build Date  : Thu 11 Aug 2022 06:07:19 AM EDT
Build Host  : localhost
Relocations : (not relocatable)
Summary     : A simple hello RPM script
Description :
A demo RPM build
查看changelog
[root@localhost rpmbuild]# rpm -q hello --changelog
* Thu Aug 11 2022 - 0.0.1
- First version being packaged
查看RPM包中内容
[root@localhost rpmbuild]# rpm -ql hello
/usr/bin/hello.sh
[root@localhost rpmbuild]# hello.sh
Hello RPM!
卸载RPM包
[root@localhost rpmbuild]# rpm --verbose --erase hello
Preparing packages...
hello-0.0.1-1.el7.noarch
src.rpm构建RPM包
$ rpmdev-setuptree    #构建~/rpmbuild目录
$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros    #该步骤测试了下似乎可省略
$ rpmbuild --rebuild /home/xxxxxx.src.rpm

执行效果:

[root@localhost src]# tree ~/rpmbuild/
/root/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
│   └── x86_64
│       ├── xxxxxx.x86_64.rpm
│       ├── xxxxxx.x86_64.rpm
│       └── xxxxxx.x86_64.rpm
├── SOURCES
├── SPECS
└── SRPMS

7 directories, 3 files
[root@localhost src]# rpm -ivh ~/rpmbuild/RPMS/x86_64/xxxxxx.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:xxxxxx    ################################# [100%]

Reference

构建RPM包

Rebuild a SRPM package

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值