Linux之rpm本地打包

Linux之rpm本地打包

rpm简介

  • RPM是RPM Package Manager(RPM软件包包管理器)的缩写,这一文件格式起源于RedHat操作系统,后来逐渐成为行业里面的标准,目前广泛应用于RHEL、Centos、Fedora等各种linux发行版中。
  • rpm在linux操作系统中的作用类似于Windows操作系统里面的”添加/删除程序”

rpm相关命令

安装命令

linux安装包的包文件分两种:
二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译。源代码包(Source)经常以.src.rpm作为文件后缀名。

rpm -ivh ***.rpm: 安装软件(并且显示安装进度 --install--verbose--hash)
rpm -Uvh ***.rpm: 升级软件(--Update)
rpm -e: 卸载软件
rpm -q [软件名称]: 查询程序是否安装
rpm -qa: 查询已经安装的所有软件(Query All)
rpm -qi [软件名称]: 列出该软件的详细信息
rpm -qf [指定文件名]: 查找指定文件属于哪个RPM软件包(Query Files)
rpm -qc [软件名称]: 列出该软件的所有文件
rpm -qpi [软件名称]: 列出RPM软件包的描述信息(Query Packages install package(s))
rpm -qpl [软件名称]: 列出该软件的所有文件(Query Packages list)
rpm -qRp [软件名称]: 列出该软件的依赖(Query Rely Packages)
rpm -Va [软件名称]: 校验所有的RPM软件包,查找丢失的文件(View List) 

更多的选项使用, 请查阅man rpm

rpm命令的常用参数(Install/Upgrade/Erase options:)

-i, --install install package(s)
-v, --verbose provide more detailed output
-h, --hash print hash marks as package installs (good with -v)
-e, --erase erase (uninstall) package
-U, --upgrade=<packagefile>+ upgrade package(s)
--replacepkge 无论软件包是否已被安装,都强行安装软件包
--test 安装测试,并不实际安装
--nodeps 忽略软件包的依赖关系强行安装
--force 忽略软件包以及文件的冲突

Query options (with -q or --query):
-a, --all query/verify all packages
-p, --package query/verify a package file
-l, --list list files in package
-d, --docfiles list all documentation files
-f, --file query/verify package(s) owning file

打包命令 rpmbuild

  • rpmbuild是rpm最新的打包工具,可以制作和发布rpm格式的源码包或者二进制包。主要依赖本地源码文件和spec说明文件,来进行安装构建。

安装rpmbuild

centos上:yum install rpm-build -y
ubuntu上:sudo apt-get install rpmbuild -y

rpmbuild常用命令

rpmbuild [options] [spec文档|tarbal包|源码包]
1. -bb 只建立二进制包(常用)
2. -ba 建立源码与二进制包(常用)
3. -bi 执行spec中%pre, %build与%install(准备, 编译并安装)
4. 一些不常用options:-bl, -bc, -bp, -tp, -tc, -ti, -ta, -tb, -ts

rpmbuild打包一般步骤

  • 根据rpmbuild标准,创建打包的目录结构
  • 将源码和辅助文件放到指定目录
  • 编写spec文件,放到指定目录
  • 根据需要构建rpm,或者rpmsrpm等。

rpmbuild构建目录结构

文件名 类型 说明
SPECS 目录 包含rpm的xxx.spec文件(打包的描述文件)
SOURCES 目录 包含源码包(如.tar包)和所有patch补丁、service启动文件等
BUILD 目录 源码包被解压至此, 并在该目录的子目录完成编译
BUILDROOT 目录 存放编译后的文件的临时目录(保存%install阶段安装的文件)
RPMS 目录 经过编译成功后, 打包文件放在这个目录, 包含i386、i686、noarch等次级目录
SRPMS 目录 包含.src.rpm的SPRM包(通常用于审核和升级软件包)

rpmbuild内置变量

rpmbuild --showrc 可查看内置的变量

常用的几个变量:

$RPM_BUILD_DIR /$HOME/rpmbuild/BUILD
$RPM_BUILD_ROOT /$HOME/rpmbuild/BUILDROOT
%{_sysconfigdir} /etc
%{_sbindir} /usr/sbin
%{_bindir} /usr/bin
%{_prefix} /usr
%{_localstatedir} /var
更多的可以查看 --showrc

rpmbuild spec规范说明

Summary: 软件包的内容概要描述
Name: 软件包的名称(spec文件名与其一致)
Version: 软件的实际版本号,具体和源码包一致
Release: 软件包的发布实际版本号
Url: 软件的主页
License: 软件授权方式(GPL等)
Group: 软件分组,如(Application/System)
Source: 软件的来源
Patch: 补丁patch file依赖的软件,安装的时候需要检查的
BuildRoot: 安装或者编译时使用的"虚拟目录",一般默认 
BuildRequires: 编译过程中需要的软件
Requires: 依赖的软件, 安装的时候需要检查的
Packager: 软件的打包者
Vendor: 软件发行商或者打包组织信息,如(Apache Software Foundation)

%description: 软件包描述
%prep: 编译前预处理。如: 1.打补丁; 2. 解压源码等
%setup: 解压源码(一般是位于%prep下的macro, 自动解压源码)
%build: 编译
%install: 安装, 即把一些可执行文件和配置复制到目标目录中。
%clean: 清理一些暂存文件
%files: 定义哪些文件或者目录会放入rpm中
%pre: rpm安装前执行的动作
%post: rpm安装后执行的动作
%preun: 卸载前执行脚本程序(preun)开始执行
%postun: 卸载后执行脚本程序(postun)开始执行

rpmbuild spec 示例

%global pypi_name aodh
%{!?upstream_version: %global upstream_version %{version}%{?milestone}}
Name:       openstack-aodh
Version:    2.0.0
Release:    %{es_versions}%{?dist}
Summary:    OpenStack Telemetry Alarming
License:    ASL 2.0
URL:        https://github.com/openstack/aodh.git
BuildArch:  noarch
Source0:    http://tarballs.openstack.org/%{pypi_name}/%{pypi_name}-%{version}.tar.gz

...
%description
Aodh is the alarm engine of the Ceilometer project.

%prep
%setup -q -n %{pypi_name}-%{upstream_version}

%build
%{__python2} setup.py build

%install
%{__python2} setup.py install --skip-buid --root %{buildroot}

%files -n python-aodh
%{python2_sitelib}/aodh
... 
%files common
%doc README.rst
%dir %{_sysconfdir}/aodh
%attr(-, root, aodh) %{_datadir}/aodh/aodh-dist.conf
%config(noreplace) %attr(-, root, aodh) %{_sysconfdir}/aodh/aodh.conf
...
%changelog

如何从python源码包构建rpm

  • 在python源码目录执行
python setup.py bdist_rpm # 即可在当前dist目录下生成rpm包
  • 定制spec:
python setup.py bdist_rpm --spec-only # 只生成dist/<module>.spec
# 重新编辑 dist/<module>.spec
python setup.py bdist_rpm --spec-file=dist/<module>.spec
  • 在了解了rpm和打包基本知识后,就可以结合estack-packages中打包方法,编写打包spec,然后提交jenkins打包。
  • estack-packages操作方法详见:build_rpm

rpm安装卸载注意

rpm -ivh

  • -i: 被用来安装一个新的软件包。总是用于内核安装和升级使用。
  • 如果环境已经安装了该软件包,会提示包已经存在的警告。

rpm -Uvh

  • -U: 使用这个选项时,如果环境不存在该包,则安装上;如果当前已经安装了一个包,那么升级当前已安装的包到一个新的版本。此外,在新安装的包安装后,所有其他版本的软件包将被移除
  • 相比于-i,对于非内核的软件包使用、或者非固定版本的软件包,使用-U是个更好的选择。如果是内核软件包安装,最好使用-i,避免使用-U导致的内核更新,引起下次启动时,内核无法引导的问题。

rpm -e

  • -e: 只是像-i一样简单的移除该软件包,如果有其他安装包依赖此包,则报错。强制移除,需要添加-nodeps选项。

rpm spec配置对rpm不同命令的影响

  • rpm spec中, 针对%files指令部分的文件列表,对于某些特定的配置文件,需要使用%config指令来做特殊处理。因为当软件包被移除,安装和升级期间,RPM会执行额外的处理(保存历史文件或者新文件等)。
  • 如上文spec示例中的:
%config(noreplace) %attr(-, root, aodh) %{_sysconfdir}/aodh/aodh.conf
  • %config对rpm包影响如下图所示:
    rpm_config
  • 上图主要包括以下三种情况,以rpm报中的a.txt为例。
  • %config情况下使用rpm-Uvh
  • 如果磁盘上原始文件a.txt无改动,则会被新版本文件a.txt取代;
  • 如果磁盘上原始文件a.txt有改动,但是新版本文件并没有改动,则磁盘上原始文件保持不变;
  • 如果新版本文件有改动,则新版本文件a.txt取代原始文件a.txt,而原始文件a.txt改名变成a.txt.rpmsave
  • %config(noreplace)情况下使用rpm-Uvh
  • 如果磁盘上原始文件a.txt有改动,但是新版本文件并没有改动,则磁盘上原始文件保持不变;
  • 如果新版本文件有改动,则保留原始文件a.txt,来自于新版本的a.txt改名变成a.txt.rpmsave
  • %config(noreplace)情况下使用rpm -e
  • 如果文件a.txt无改动,则会被删除; 如果文件a.txt有改动,则生成a.txt.rpmsave
  • 更多详情参考: rpm_config

猜你喜欢

转载自blog.csdn.net/XXJ19950917/article/details/81664234