Linux Rpm 包制作

 

一、简介

    RPM(Red Hat Package Manager)的最常见的软件包管理器。

   

    软件包管理器

            rpm,deb(dpkg)

    

    RPM包命名:name-version-release.architecture.rpm。

            xorg-x11-xsm-1.0.2 -4.fc6.i386.rpm

            包名       版本号 编译次数 厂商 平台

 

    RPM功能:安装、卸载、升级、查询和验证。

    rpm     -ivh              安装  

    rpm    -Uvh             升级

    rpm      -e                卸载

    rpm      -q                查询一个包是否被安装 |查询包版本

    rpm     -q --scripts   查询指定包中包含的脚本

               preinstall

               postinstall

               preuninstall

               postuninstall

    rpm     -qp               查询未安装的软件包

    rpm     -qa               查询所有安装过的包的版本

    rpm     -qi               查询包详细信息

    rpm     -ql               查询包安装路径

    rpm     -qf filename      查询一个文件归属于哪个包

     rpm    -qpR file.rpm     查看包依赖关系

    rpm     --rebuilddb       手动更新数据库

    rpm     -ivh pkgname.rpm  --nodeps --force    不考虑依赖关系,强制安装(不建议)

    rpm     -V                 rpm验证                        ##

    rpm     -Va                rpm验证所有                    ##

    rpm     -K |--checksig     pkgname.rpm检查rpm包的数字签名 ##

    rpm  --import              RPM-GPG-KEY-*


    如果想发布rpm格式的源码包或者是二进制包,就要使用rpmbuild工具。

    rpmbuild --rebuild src.rpm  #重新编译成RPM包到工作车间里,直接使用即可

    rpm2cpio *.src.rpm | cpio -id  解压里面的文件到当前目录

                       | cpio -t 查看包含文件

 

rpmbuild 步骤:

1. 准备阶段:The prep section

2. 编译阶段: The build section

3. 安装阶段:The install section

4. 脚本段:安装、卸载、升级、依赖脚本

5. 清理段:The clean section

6. 文件段:The files section

7. 改变日志段:%chagelog

 

二、参数解释:

%prep预处理脚本程序(prep)开始执行"
%setup
%build"编译连接脚本程序(build)开始执行"
make
%install"安装脚本程序(install)开始执行"
make install
%clean"建包结束后清理脚本程序(clean)开始执行"
%pre"安装前执行脚本程序(pre)开始执行"
%post"安装后执行脚本程序(post)开始执行"
%preun"卸载前执行脚本程序(preun)开始执行"
%postun"卸载后执行脚本程序(postun)开始执行"
%veryfiscript "软件包校验脚本程序(verifyscript)开始执行"
%triggerin -- xiuwu"软件包安装时触发脚本程序(triggerin)开始执行"
%triggerun -- yuntaishan < 2.0 "软件包卸载前触发脚本程序(triggerun)开始执行"
%triggerpostun – dapubu"软件包卸载后触发脚本程序(triggerpostun)开始执行"
%files
%defattr (-,root,root)
%config /etc/funkey.def
%doc
%changelog更改日志

Spec文件中常用的变量

变量系统目录
RPM_BUILD_DIR:/$HOME/rpmbuild/BUILD
RPM_BUILD_ROOT:/$HOME/rpmbuild/BUILDROOT
%{_sysconfdir}:/etc
%{_sbindir}:/usr/sbin
%{_bindir}:/usr/bin
%{_datadir}:/usr/share
%{_mandir}:/usr/share/man
%{_libdir}:/usr/lib64
%{_prefix}:/usr
%{_localstatedir}:/usr/var

spec文档建立有以下选项

选项含义
-bp文件中安装执行前的地方
-bc执行spec的%pre和%build 段(准备并编译)
-bi执行spec中%pre,%build与%install(准备,编译并安装)
-bl检查spec中的%file段(查看文件是否齐全)
-ba建立源码与二进制包(常用)
-bb只建立二进制包(常用)
-bs只建立源码包

其他的一些选项

选项含义
--buildroot=DIRECTORY确定以root目录建立包
--clean完成打包后清除BUILD下的文件目录
--nobuild不进行%build的阶段
--nodeps不检查建立包时的关联文件
--rmsource完成打包后清除SOURCES
--rmspec完成打包后清除SPEC
--target=CPU-VENDOR-OS确定包的最终使用平台

打补丁

%patch

* -p :这个选项用于确定patch所要操作的文件。它针对补丁文件头部的文件名,删除名字中指定数目个斜杠(/)前面的所有字符,从而得到要操作的文件名。

* -s :这个选项指示patch在打补丁过程中不输出任何信息,即使有错误发生。

(2) -P N :

使用此选项以指示RPM使用第N个补丁文件(由文件头PatchN域定义)。

(3) -p N :

此选项与其参数是由%patch宏直接传给patch命令的。请参见上面patch命令所用的-p选项的介绍。

(4) -b name :

当有多个patch命令操作同一个文件时,patch会将原文件换名保存(其后缀变作.orig)

(5) -E :

此选项直接传给patch命令,其作用是:如果一个文件打完补丁后内容为空(字节数为0),则删除这个文件。

 

 

 

RPM组: /usr/share/doc/rpm-4.4.2.3/GROUPS

软件包所属类别,具体类别有:

Amusements/Games (娱乐/游戏)

Amusements/Graphics(娱乐/图形)

Applications/Archiving (应用/文档)

Applications/Communications(应用/通讯)

Applications/Databases (应用/数据库)

Applications/Editors (应用/编辑器)

Applications/Emulators (应用/仿真器)

Applications/Engineering (应用/工程)

Applications/File (应用/文件)

Applications/Internet (应用/因特网)

Applications/Multimedia(应用/多媒体)

Applications/Productivity (应用/产品)

Applications/Publishing(应用/印刷)

Applications/System(应用/系统)

Applications/Text (应用/文本)

Development/Debuggers (开发/调试器)

Development/Languages (开发/语言)

Development/Libraries (开发/函数库)

Development/System (开发/系统)

Development/Tools (开发/工具)

Documentation (文档)

System Environment/Base(系统环境/基础)

System Environment/Daemons (系统环境/守护)

System Environment/Kernel (系统环境/内核)

System Environment/Libraries (系统环境/函数库)

System Environment/Shells (系统环境/接口)

User Interface/Desktops(用户界面/桌面)

User Interface/X (用户界面/X窗口)

User Interface/X Hardware Support (用户界面/X硬件支持)

 

 

三、rpmbuild制作rpm包步骤:

 

1、安装rpm-build软件包

[root@test01 ~]# yum install rpm-build

增加一个普通用户,不要以root身份来进行rpmbuild,防止它人恶作剧!

[root@test01 ~]# useradd nginx

[root@test01 ~]# su – nginx

 

2、定义宏变量

# vim ~/.rpmmacros

%_topdir /home/test/rpmbuild

%_signature gpg

%_gpg_name LN

 

3、 准备打包环境

创建rpmbuild所需要的目录

# mkdir -pv rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

BUILD #打包过程中的工作目录

BUILDROOT #编译后存放的路径

RPMS #打包完成后rpm包存放的路径,RPM包根据硬件平台不同分类,i386表示生成i386结构的包将存放在该目录下

SOURCES #源包所放置的路径,包括源码打包文件和补丁文件等

SPECS #spec文档放置的路径

SRPMS #源码rpm包放置的路径

#ll
#drwxr-xr-x 2 root root 4096 Jul 29 13:50 BUILD
#drwxr-xr-x 2 root root 4096 Jul 29 13:51 RPMS
#drwxr-xr-x 2 root root 4096 Jul 29 13:51 SOURCES
#drwxr-xr-x 2 root root 4096 Jul 29 13:51 SPECS
#drwxr-xr-x 2 root root 4096 Jul 29 13:51 SRPMS

如果你的用户目录主目录下没有类似目录结构,你可以通过一个工具软件来自动配置和生成。

#yum install rpmdevtools

默认将在当前用户主目录下创建一个RPM构建根目录结构

#rpmdev-setuptree

如果需要改变次默认位置,可以修改配置文件:~/.rpmmacros中变量_topdir对应的值即可。

一般rpmbuild会在当前用户的主目录下自动建立如上目录结构,如果在你对应用户的构建目录中没有自动建立如上目录,你可以通过手动方式建立。


4、撰写SPEC文档

SPEC撰写是打包RPM的核心,也算是最难的一步,好在我们可以从参照一个简单的模板文件开始,在可以实现基本功能的基础上再一步一步的扩充文档内容,直至完全达到要求。下面是一个简单的SPEC文档,其中包括了一些说明信息(注:#后面的内容为说明信息),该SPEC文档是对一个测试的软件项目hellorpm写的,hellorpm软件包编译后仅有一个执行文件、一个手册文件和一个项目说文件。


===============================================

Name:                              #软件名

Version:                           #版本

Release:        1%{?dist}   #版本

Summary:                        #摘要描述

Group:                             #软件包组

License:                           #软件授权

URL:

Source0:                         #制作rpm包的源文件文件

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root#安装或者编译时使用的“虚拟目录”

 

BuildRequires: gcc,gd-devel#需要依赖的软件包

%description

**********************描述信息*********************

#准备阶段

%prep

%setup -q  (静默模式)

 

#编译阶段

%build

./configure \

--参数

%{__make} %{?_smp_mflags}

 

#安装段

%install

%{__rm} -rf %{buildroot}

%{__make} install DESTDIR="%{buildroot}" #安装到buildroot下

      # install 【更容易做精确控制】

        -d      #创建目录

        -D      #创建<目的地>前的所有主目录,然后将<来源>复制至 <目的地>。

                  最后一个文件名不变,前面缺什么补什么

                                # install -D x a/b/c 效果类似: mkdir -p a/b && cp x a/b/c

#清理段

%clean

%{__rm} -fr %{buildroot}

 

#脚本段

#scripts

%pre            #安装前执行的脚本

%post          #安装后执行的脚本

%preun       #卸载前执行的脚本

%postun     #卸载后执行的脚本

 

#$1代表动作

0代表卸载

1代表安装

2代表升级


#文件段 *BUILDROOT中的内容必须要和 %file段中的相关项对应,BUILDROOT有什么写什么,不然会报错!!!

%files

%defattr(-,root,root,0755)

%doc %{_mandir}/man1/*

%config %{_sysconfdir}/

#更改日志段

%changelog

*    时间 

-    谁更改的

===============================================

 

RPM 建包参考文件

http://fedoraproject.org/wiki/Docs/Drafts/BuildingPackagesGuide

http://fedoraproject.org/wiki/ParagNemade/PackagingNotes

http://fedoraproject.org/wiki/Packaging/Guidelines

 

rpmbuild具体参考官方文档

http://docs.fedoraproject.org/enUS/Fedora_Draft_Documentation/0.1/html/RPM_Guide/index.html