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%]