linux 打 rpm 包
2021-09-14 本文已影响0人
缘木与鱼
打rpm方式
1. 安装rpmbuild
[root@VM-0-8-centos ~]# yum install -y rpm-build rpmdevtools
2. 生成rpm打包的目录
# 通过rpm指令生成目录
[root@VM-0-8-centos ~]# rpmdev-setuptree
[root@VM-0-8-centos ~]# cd /root/rpmbuild/
[root@VM-0-8-centos rpmbuild]# ll
total 20
drwxr-xr-x 2 root root 4096 Sep 13 11:09 BUILD
drwxr-xr-x 2 root root 4096 Sep 13 11:09 RPMS
drwxr-xr-x 2 root root 4096 Sep 13 11:09 SOURCES
drwxr-xr-x 2 root root 4096 Sep 13 11:09 SPECS
drwxr-xr-x 2 root root 4096 Sep 13 11:09 SRPMS
[root@VM-0-8-centos rpmbuild]#
[root@VM-0-8-centos ~]# tree rpmbuild/
rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
5 directories, 0 files
目录说明:
- SOURCES 放置打包资源,包括源码打包文件和补丁文件等
- SPECS 放置SPEC文档 (打rpm包的脚本)
- BUILD 打包过程中的工作目录
- RPMS 存放生成的二进制包(生成的rpm包)
- SRPMS 存放生成的源码包
生成 spec 示例文件:
[root@VM-0-8-centos SPECS]# rpmdev-newspec
newpackage.spec created; type minimal, rpm version >= 4.11.
[root@VM-0-8-centos SPECS]# ls
newpackage.spec
[root@VM-0-8-centos SPECS]#
3. 打包步骤
先创建一个要打包的示例:
[root@VM-0-8-centos /]# cd /opt/
[root@VM-0-8-centos opt]# mkdir demoTool
[root@VM-0-8-centos opt]# cd demoTool/
[root@VM-0-8-centos demoTool]# touch run.sh
[root@VM-0-8-centos demoTool]# chmod 755 run.sh
[root@VM-0-8-centos demoTool]# vim run.sh
# run.sh只用作示例,随便写点内容即可。
[root@VM-0-8-centos demoTool]# cat run.sh
java -version
[root@VM-0-8-centos demoTool]# ./run.sh
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
[root@VM-0-8-centos demoTool]#
准备rpm打包脚本: demoTool.spec
Name: demoTool
Version: V1.0
Release: 1
Summary: demoTool
Group: System Environment/Daemons
License: demoTool
Vendor: http://www.123.com
Autoreqprov : no
%description
demoTool
%install
mkdir -p %{buildroot}/opt/
cd /opt
tar -zcf demoTool.tar.gz ./demoTool
cp demoTool.tar.gz %{buildroot}/opt/
cd %{buildroot}/opt
tar -zxf demoTool.tar.gz
rm -rf demoTool.tar.gz
%pre
%post
%preun
%clean
%postun
rm -rf /opt/demoTool
%files
%defattr (-,-,-,-)
/opt/demoTool
开始打包:
[root@VM-0-8-centos SPECS]# rpmbuild -ba demoTool.spec
问题:
[root@VM-0-8-centos SPECS]# rpmbuild -ba demoTool.spec
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.LDvmc2
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64
++ dirname /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64
+ $'\r'
/var/tmp/rpm-tmp.LDvmc2: line 32: $'\r': command not found
error: Bad exit status from /var/tmp/rpm-tmp.LDvmc2 (%install)
RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.LDvmc2 (%install)
[root@VM-0-8-centos SPECS]#
原因分析:可能是linux和windows的换行符不同导致的(windows是\r\n, Linux是\n)。
尝试解决办法: 将spec文本转换成 Unix 格式,方式如下:
[root@VM-0-8-centos SPECS]# yum install -y dos2unix
[root@VM-0-8-centos SPECS]# dos2unix demoTool.spec
dos2unix: converting file demoTool.spec to Unix format ...
[root@VM-0-8-centos SPECS]#
再次执行打包脚本:
[root@VM-0-8-centos ~]# rpmbuild -ba /root/rpmbuild/SPECS/demoTool.spec
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.qd9sRa
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64
++ dirname /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64/opt/
+ cd /opt
+ tar -zcf demoTool.tar.gz ./demoTool
+ cp demoTool.tar.gz /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64/opt/
+ cd /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64/opt
+ tar -zxf demoTool.tar.gz
+ rm -rf demoTool.tar.gz
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS=1
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: demoTool-V1.0-1.x86_64
Provides: demoTool = V1.0-1 demoTool(x86-64) = V1.0-1
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Requires(pre): /bin/sh
Requires(post): /bin/sh
Requires(preun): /bin/sh
Requires(postun): /bin/sh
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/demoTool-V1.0-1.x86_64
Wrote: /root/rpmbuild/SRPMS/demoTool-V1.0-1.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/demoTool-V1.0-1.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.pi7dyt
+ umask 022
+ cd /root/rpmbuild/BUILD
+ exit 0
[root@VM-0-8-centos ~]#
查看打好的rpm包:
[root@VM-0-8-centos ~]# cd rpmbuild/RPMS/
[root@VM-0-8-centos RPMS]# ls
x86_64
[root@VM-0-8-centos RPMS]# cd x86_64/
[root@VM-0-8-centos x86_64]# ls
demoTool-V1.0-1.x86_64.rpm
[root@VM-0-8-centos x86_64]#
4.结果检测
测试rpm包:
[root@VM-0-8-centos ~]# cd /opt/
[root@VM-0-8-centos opt]# mv demoTool demoToolBak
[root@VM-0-8-centos opt]# cd /root/rpmbuild/RPMS/x86_64/
[root@VM-0-8-centos x86_64]# rpm -ivh demoTool-V1.0-1.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:demoTool-V1.0-1 ################################# [100%]
[root@VM-0-8-centos x86_64]#
[root@VM-0-8-centos x86_64]# cd /opt/demoTool
[root@VM-0-8-centos demoTool]# ls
run.sh
[root@VM-0-8-centos demoTool]# ./run.sh
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
[root@VM-0-8-centos demoTool]#
以上完成示例。
5. spec脚本参数说明
-
%pre 在安装包之前运行
-
%post 在安装包之后运行
-
%preun 在卸载包之前运行
-
%postun 在卸载包之后运行
-
%install 构建RPM 时,在开发机器上运行
Name: 软件包名称
Version:软件包主版本号
Release:软件包次版本号
Summary:摘要是对软件包的简短描述。
License: 授权协议,通用的是GPL。
URL: 在url下放置包的主页。
Source0: 源目录中tar源码包的名称。可以有很多个源码。
BuildRequires:列出创建包所需包的列表。
Requires:创建包所需依赖。
%description:描述不应与摘要相同。描述要更具体一些,但是不应太长。并且不要在描述句尾加句号。
%prep:表示预操作字段。在install之前执行(准备源码,唯一的操作是%setup -q)
%setup -q :表示构建BUILD环境,会解压压缩包到BUILD目录下。
%preun :在uninstall之前执行
%post :在install 之后执行
%postun:在uninstall之后执行
%build :表示通过直接调用源码目录中自动构建工具(比如说,configure文件)完成源码编译操作。
%configure:
make:表示在源码目录中执行make命令。
%install :安装字段。
%files:文件说明字段。告诉make install指令,需要安装那些文件。
%defattr(-,root,root,-) :设置默认权限
%doc:标记所有的文本文件。
%doc docs/LICENSE:安装许可证。
%doc docs/README:安装README。
%changelog:更新日志。有固定格式(填错会报错)。比如说:
*Sun Jul 13 2008 <bjlongo@ncsu.edu> 1
--Initial Build.
--Added setup.py file.
--Fixed bin/vpd, src/vpd.py.
Copyright:软件包版权规则,GPL(自由软件),BSD,MIT,
Public Domain(公共域), Distributable(贡献),
commercial(商业),Share(共享)等。
Group:用于对包进行分类。可以查看/usr/share/doc/GROUPS文件中所有组的完整列表。
Buildroot:构建和安装包的位置