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
本文出自 “流星工作室” 博客,请务必保留此出处http://redone.blog.51cto.com/5382451/1888821
原文地址:http://redone.blog.51cto.com/5382451/1888821