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

目录说明:

生成 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脚本参数说明

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:构建和安装包的位置
上一篇 下一篇

猜你喜欢

热点阅读