Rpm 打包原理详解
rpm打包整理
rpm打包整理最近在学习之余,学习了rpm打包,整理了一些资料(基于Qomo平台)首先介绍下RPMRPM 是 Red Hat Package Manager 的缩写,原意是Red Hat 软件包管理。
这里先介绍一下RPM的一些用法。
查询功能:1、对系统中已经安装的软件查询:rpm -q softwarename2、查询系统中已安装的包:rpm -qa [softwarename]3、查询已安装软件包都安装到何处:rpm -ql softwarename安装,删除 rpm -ivh softwarename.rpm rpm -e softwarename其余更多的用法参照man rpm打包前的工作:1、安装打包套件:$sudo yum install rpm-build2、建立打包的环境:不建议用 root 来打包套件,所以请改用一般的使用者身分来打包套件,首先要安装 fedora-rpmdevtools 这个套件.接著执行 fedora-buildrpmtree 来建立打包的环境:$sudo yum install fedora-rpmdevtools 执行完后,就会在HOME目录下生成rpmbuild目录在 rpmbuild 目录底下又有 BUILD RPMS SOURCES SPECS SRPMS 五个子目录也可以自己手动创建这五个目录:mkdir -p ~/{BUILD,RPMS,S{OURCE,PEC,RPM}S}这些目录的作用如下BUILD 编译时所用的暂存目录RPMS 放置打包好的套件SOURCES 放置套件的原始码及修补档等等SPECS 放置 .spec 档 SRPMS 放置 Source RPMS (.src.rpm)3、这里为了提高书写spec文件的效率,介绍几个vim的插件spec文件里面有Group和%Changelog书写比较麻烦,将rpmgroups文件放在/usr/share/vim/vim72/plugin/下,然后执行source /usr/share/vim/vim72/plugin/rpmgroups.vim在/etc/vimrc文件最后加上:letpackager="<********************>",“ ”中的是你的邮箱名。
RPM打包浅析
RPM打包浅析RPM打包浅析0:需要储备的知识及其⽬的:需要要储备的知识对makefile有⼀定的了解。
C代码的编译及基本的C语法。
注:只需要能基本看懂第⼆节做好准备打包⼀个简单程序的内容即可。
教学⽬的能将⾃⼰编写的程序打包成RPM包,发布到⽹上供⼤家下载并安装使⽤。
⼀:RPM 基础知识若要构建⼀个标准的 RPM 包,您需要创建.spec⽂件,其中包含软件打包的全部信息。
然后,对此⽂件执⾏rpmbuild命令,经过这⼀步,系统会按照步骤⽣成最终的 RPM 包。
⼀般情况,您应该把源代码包,⽐如由开发者发布的以.tar.gz结尾的⽂件,放⼊~/rpmbuild/SOURCES⽬录。
将.spec⽂件放⼊~/rpmbuild/SPECS ⽬录,并命名为 "软件包名.spec" 。
当然,软件包名就是最终 RPM 包的名字。
为了创建⼆进制(Binary RPM)和源码软件包(SRPM),您需要将⽬录切换⾄~/rpmbuild/SPECS并执⾏:$ rpmbuild -ba NAME.spec当执⾏此命令时,rpmbuild会⾃动读取.spec⽂件并按照下表列出的步骤完成构建。
下表中,以%开头的语句为预定义宏,每个宏的作⽤如下:阶段读取的⽬录写⼊的⽬录具体动作%prep%_sourcedir%_builddir读取位于%_sourcedir⽬录的源代码和 patch 。
之后,解压源代码⾄%_builddir的⼦⽬录并应⽤所有 patch。
%build%_builddir%_builddir编译位于%_builddir构建⽬录下的⽂件。
通过执⾏类似 "./configure && make" 的命令实现。
%install%_builddir%_buildrootdir 读取位于%_builddir构建⽬录下的⽂件并将其安装⾄%_buildrootdir⽬录。
如何使用rpm打包文件
用Rpmbuild打包总结这些都是对这些软件简单的介绍,一些基本的信息!!Name: SipMonitorVersion: 1.0Release: 1%{?dist}Summary: for qt studyGroup: Development/ToolsLicense: GPLURL: /178926426Source0: %{name}-%{version}.tar.gzBuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root%descriptionThe GNU wget program downloads files from the Internet using the command-line.%prep //这个是编译之前预处理!一般就是解压,然后进入到解压文件夹下。
下面有一段文字对%prep与%setup的一些参数讲解很详细的文章%setup -q%build%install%{__rm} -rf %{buildroot}make#%makeinstallmake install%{__install} -d %{buildroot}%{_datadir}/SipMonitorcp -a ./* %{buildroot}%{_datadir}/SipMonitor%postcp %{_datadir}/SipMonitor/sip_monitor %{_bindir}ln -sf %{_datadir}/SipMonitor/sip_monitor /root/Desktop%postun%{__rm} -rf %{_bindir}/sip_monitor%{__rm} -rf /root/Desktop/sip_monitor%cleanrm -rf $RPM_BUILD_ROOT%files%{_datadir}/SipMonitor%changelog* Wed Sep 10 2008 Wangjun- Make the spec file,first%prep :此为预处理段,其内容为预处理脚本程序。
RPM打包技术和典型SPEC文件分析
7 + cd /usr/src/dist/BUILD
生成的文件会在刚才建立的RPM目录下存在。
2)只生成src格式的rpm包
rpmbuild -bs xxx.spec
生成的文件会在刚才建立的SRPM目录下存在。
3) 只需要生成完整的源文件
rpmbuild -bp xxx.spec
二.典型spec文件分析
通过第一部分的介绍,我们对软件包的管理及spec文件的一些细节应该掌控的差不多了,接下来通过分析kaffeine.spec(kaffeine是linux平台下的媒体播放器)文件来让读者朋友实践一回spec文件的规范和书写。
Kaffeine.spec文件内容如下:
%define debug_package %
1) 只生成二进制格式的rpm包
rpmbuild -bb xxx.spec
用此命令生成软件包,执行后屏幕将显示如下信息:(每行开头为行号)
1 Executing: %prep
2 + umask 022
3 + cd /usr/src/dist/BUILD
4 + exit 0
5 Executing: %build
(3)build段
本段是建立段,所要执行的命令为生成软件包服务,如make 命令。
(4)%install段
本段是安装段,其中的命令在安装软件包时将执行,如make install命令。
(5)%files段
本段是文件段,用于定义软件包所包含的文件,分为三类--说明文件(doc),设置文件(config)及执行程式,还可定义文件存取权限,拥有者及组别。
Rpm打包原理详解
Rpm打包原理详解Rpm打包原理详解为什么要打包?制作rpm 不仅仅是打包,更可以解决菜单创建、打补钉、完成大量预配置、与其他软件包互动等操作。
使用源代码安装要求用户了解基本的编译过程、能够应付各种不能编译的意外、必须自己完成抽象的配置、甚至懂得软件开发,能够自己打补钉,……对非计算机专业的用户而言简直就是天方夜谭。
这是把软件开发的最后一步抛给了用户,作为发行版,这是极不负责任的!也是不现实的,除非用lfs,但那是一本菜谱,不是真正的发行版。
软件作者发布源代码是正确的,负责的作者一般都同时提供rpm 和deb 包以及它们的源代码包。
除非他们不会制作。
愿意使用什么,那是个人的自由,但对外就不能只想到自己。
GNU 精神是一种公益精神,没有奉献精神,在自由软件领域是要遭唾弃的!直接使用其他发行版的rpm 常常是不行的。
不知道大家看没看“恼人的依赖关系”这个帖子。
可以在技术支持区搜索一下。
任何两个发行版本在二进制上都是不能兼容的!他们实际是不同的操作系统。
不仅使用的库文件不同,配置也迥异。
特别是同一个发行版的不同版本更不兼容。
任何包都必须在本地重新编译,而且不一定通得过,因为还有spec 宏的兼容问题!如果要在别的发行版上使用,必须用源码编译,这是常识。
考虑文件布局和配置问题,有时直接编译也是不够的,必须修改spec,甚至自己打补丁。
如何创建rpm 包?rpm 建包原理其实不复杂。
写spec 相当于一种脚本编程,主要是在spec 里提供一些软件相关信息,以及安装、卸载前后要执行的脚本,然后展开压缩的源代码包,打上补丁,执行编译,然后利用make install 可以重新指定安装目的地的特性,把编译好的文件安装到指定的虚拟根目录下的指定位置里,一般是虚拟的/usr 里,然后把这些目录、信息和脚本打成一个压缩包,即rpm 包。
同时可选地生成源码包src.rpm。
当然有很多具体细节问题。
您应该首先阅读软件的readme 和INSTALL 文件。
自动化利器-RPM自定义打包
⾃动化利器-RPM⾃定义打包1.Rpm打包程序1.1为什么要使⽤rpm打包1、编译安装软件,优点是可以定制化安装⽬录、按需开启功能等,缺点是需要查找并实验出适合的编译参数,诸如MySQL之类的软件编译耗时过长。
2、yum安装软件,优点是全⾃动化安装,不需要为依赖问题发愁了,缺点是⾃主性太差,软件的功能、存放位置都已经固定好了,不易变更。
===>如果你现在还为是使⽤编译安装软件还是使⽤yum安装软件发愁,那你就out了。
3、编译源码,根据⾃⼰的需求做成定制RPM包-->搭建内⽹yum仓库--yum安装。
结合前两者的优点,暂未发现什么缺点。
可能的缺点就是RPM包的通⽤性差,只能适⽤于本公司的环境。
另外⼀般⼈不会定制RPM包。
这是中⼤型互联⽹企业运维⾃动化的必要技能。
2 fpm⼯具打包详解FPM的作者是jordansisselFPM功能简单说就是将⼀种类型的包转换成另⼀种类型。
2.1 ⽀持的源类型包dir #将⽬录打包成所需要的类型,可以⽤于源码编译安装的软件包rpm #对rpm进⾏转换gem #对rubygem包进⾏转换python #将python模块打包成相应的类型2.2⽀持的⽬标类型包rpm #转换为rpm包deb #转换为deb包solaris #转换为solaris包puppet #转换为puppet模块2.3 fpm安装[root@student ~]# yum -y install ruby rubygems ruby-devel ß安装ruby模块[root@student ~]# gem install fpm ß安装fpm3.fpm常⽤参数-s #指定源类型-t #指定⽬标类型,即想要制作为什么包-n #指定包的名字-v #指定包的版本号-C #指定打包的相对路径 Change directory to here before searching forfiles-d #指定依赖于哪些包-f #第⼆次打包时⽬录下如果有同名安装包存在,则覆盖它-p #输出的安装包的⽬录,不想放在当前⽬录下就需要指定--post-install #软件包安装完成之后所要运⾏的脚本;同--after-install--pre-install #软件包安装完成之前所要运⾏的脚本;同--before-install--post-uninstall #软件包卸载完成之后所要运⾏的脚本;同--after-remove--pre-uninstall #软件包卸载完成之前所要运⾏的脚本;同--before-remove4.实战定制Nginx的Rpm包编写脚本[root@oldboy ~]# cd /server/scripts/ ß进⼊到/server/scripts[root@oldboy scripts]# vim nginx_rpm.sh ß这是安装完rpm包要执⾏的脚本#!/bin/bashuseradd nginx -M -s /sbin/nologinln -s /application/nginx-1.6.2/ /application/nginx[root@student scripts]# fpm -s dir -t rpm -n nginx -v 1.6.3 -d 'pcre-devel,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.3/ ß打包no value for epoch is set, defaulting to nil {:level=>:warn}no value for epoch is set, defaulting to nil {:level=>:warn}Created package {:path=>"nginx-1.6.3-1.x86_64.rpm"}[root@student scripts]# rpm -qpl nginx-1.6.3-1.x86_64.rpm ß查看包内容[root@student scripts]# rpm -qp --scripts nginx-1.6.3-1.x86_64.rpm ß查看脚本postinstall scriptlet (using /bin/sh):#!/bin/shuseradd nginx -M -s /sbin/nologinln -s /application/nginx/nginx-1.6.3/ /application/nginx5.实战定制LNMP的Rpm包如果是rpm包直接依赖---然后替换配置⽂件,启动即可。
rpm 编译原理-概述说明以及解释
rpm 编译原理-概述说明以及解释1.引言1.1 概述概述部分:RPM(Red Hat Package Manager)是一种用于管理和安装软件包的工具,在Linux系统中被广泛使用。
通过RPM,用户可以轻松地安装、升级、卸载软件包,使得软件管理更加便捷和高效。
RPM编译原理是指在安装软件包时,系统是如何根据软件包的源代码文件进行编译和打包的过程。
本文将详细介绍RPM的编译原理,包括RPM的定义和概念、编译原理的详细解释,以及编译的步骤和流程。
通过深入了解RPM编译原理,读者可以更好地理解软件包管理的原理和过程,为之后的软件安装和管理提供指导。
1.2 文章结构文章结构主要包括引言、正文和结论三部分。
1. 引言部分介绍了文章的概述,包括对RPM编译原理的初步介绍,文章结构的概览以及撰写本文的目的。
2. 正文部分主要分为三个小节:2.1 RPM的定义和概念,该部分主要介绍RPM的定义和相关概念,让读者对RPM有一个基本的认识和了解。
2.2 RPM编译原理详解,详细解释RPM编译原理的相关内容,包括核心概念、理论基础等,帮助读者深入理解RPM的编译原理。
2.3 RPM编译的步骤和流程,具体介绍RPM编译的步骤和流程,让读者掌握RPM编译的实际操作方法。
3. 结论部分包括三个小节:3.1 总结RPM编译原理的重要性,总结RPM编译原理在软件开发中的重要性,并提出相关建议和看法。
3.2 未来发展方向,探讨RPM编译原理的未来发展方向和趋势,展望RPM编译原理在未来的应用和发展。
3.3 结论,对全文内容进行总结,强调RPM编译原理的重要性和价值,为读者留下深刻印象。
1.3 目的本文的主要目的是深入探讨RPM 编译原理,帮助读者更好地理解RPM 软件包管理工具的工作原理。
通过对RPM 的定义和概念、编译原理的详细解释以及编译步骤和流程的分析,读者将能够更全面地了解RPM 软件包是如何被创建、编译和安装的。
此外,我们还将探讨RPM 编译原理的重要性,以及对未来发展方向的展望。
5、RPM包及打包及压缩命令
第五讲 RPM管理及文件打包和压缩一、 rpm 包1、rpm=redhat package managment红帽子担保理器,已成为整个linux行业的担保理的标准;2、linux下的软件安装方式<1>源代码安装<2>rpm包安装3、rpm 包安装的特色<1>长处:简单,方便,快捷<2>弊端:包的安装有依靠性4.rpm 包的安装:<1>rpm包名的命名规则:软件名 - 主版本号 . 次版本号 - 补丁次数 . 机型 .rpm 包补丁次数中:奇数表示测试版,偶数表示正式版;<2>安装 rpm 包:#rpm -ivh包名.rpm升级安装:#rpm -Uvh 包名 .rpm-U: 表示如未安装就安装,已安装则升级;#rpm -Fvh包名.rpm-F: 表示只做升级,不做新装;可支持通配符安装:#rpm -ivh dhcp*<3>查察已安装的 RPM包:#rpm -qa包名*#rpm -qa |grep包名参数: -q:query查问-a:all全部<4>查察已经安装的RPM包产生的文件及寄存路径#rpm -ql已安装的包名<5>经过文件查问根源的包名#rpm -qf文件名<6>查察 RPM包的详尽信息<7>卸载已安装的 rpm 包#rpm -e已安装的RPM包名注意:不支持通配符卸载;<8> --force即便覆盖属于其余包的文件也逼迫安装--nodeps假如该RPM包的安装依靠其余包,即便其余包没装,也逼迫安装。
二、打包、查察、解包、压缩文件和目录命令:tar 1、对文件和目录的打包和压缩2、查察归档和压缩文件3、恢复归档文件和压缩文件三、压缩命令:gzip (gzip的压缩率高于bzip2)功能:用于压缩文件,不可以压目录,先把目录打包,再压缩。
选项:-c压缩结果写入标准输出,原文件保持不变。
rpm_精品文档
rpm
RPM: 快速包管理器简介
引言
RPM (Red Hat Package Manager) 是一种流行的包管理系统,用于在基于RPM 的Linux 发行版中安装、更新、卸载和管理软件包。
RPM 的设计旨在提供快速和可靠的软件包管理,使用户能够轻松地安装和管理他们的软件资源。
本文将介绍 RPM 的基本概念、工作
原理以及在 Linux 系统中使用 RPM 进行软件包管理的常用命令。
1. RPM 的基本概念
1.1 RPM 软件包
RPM 软件包是一组预编译的二进制文件,通常包括软件的可执行文件、库文件、配置文件以及其他与软件相关的资源文件。
通过打包
这些文件,RPM 软件包可以被轻松地安装、卸载、更新和管理。
RPM 软件包还包含一些元数据,如软件包的名称、版本、作者等信息。
1.2 RPM 数据库
RPM 数据库是一个存储所有已安装和可用软件包的索引。
它类似于一个目录,帮助系统在需要时查找、管理和验证软件包。
RPM 数据库会记录已安装软件包的版本、文件位置等信息,方便后续的升级和管理操作。
2. RPM 的工作原理
RPM 的工作原理可以简单概括为以下几个步骤:
2.1 RPM 的安装
首先,需要在系统中安装 RPM 软件包管理器。
这可以通过基于RPM 的发行版的软件包管理工具来完成,如在 Red Hat 系统中使用 \。
RPM打包指南系列一
RPM打包指南系列⼀RPM 打包指南简介这个指南包括以下三个部分如何准备⽤于 RPM 打包的源码包这是给没有软件开发背景的⼈准备的,参见如何把源码包打包进 RPM 包这适⽤于需要将源码包打包到 RPM 中的开发⼈员,参见⾼级打包技巧这是处理⾼级 RPM 打包⽅案的参考资料,参阅准备完成这个教程需要准备以下的包$ yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils patch rpmdevtools为什么需要 RPM 来打包呢RPM 是运⾏在Redhat CentOS和Fedora上的包管理系统。
RPM 帮助你更简单的分发,管理和更新软件。
很多软件供应商通过传统的压缩包来分发软件。
但是,将软件打包到 RPM 中有⼏个优点,这些优点概述如下安装,重新安装,删除,升级和验证包⽤户可以使⽤标准的包管理⼯具(例如 Yum 或者 PackageKit)来安装,重新安装,移除升级和验证你的 RPM 包使⽤已安装软件包的数据库来查询和验证已安装软件包因为 RPM 维护已安装软件包及其⽂件的数据库,因此⽤户可以轻松查询和验证其系统上的软件包使⽤元数据来描述包,安装说明等每个 RPM 软件包都包含描述软件包组件,版本,发⾏版,⼤⼩,项⽬ url,安装说明等的元数据将原始软件打包为源包和⼆进制包RPM允许您获取原始软件源并将其打包为⽤户的源和⼆进制包。
在源包中,您拥有原始源以及所使⽤的任何修补程序以及完整的构建说明。
随着软件的新版本发布,此设计可以简化软件包的维护。
将包添加到 Yum 仓库你可以将软件包添加到 yum 仓库,是客户端可以轻松查找和部署软件对包进⾏数字签名使⽤ GPG 签名秘钥,你可以对包进⾏数字签名,以便⽤户能够验证包的真实性你的第⼀个 RPM 包创建⼀个 RPM 包可能是很复杂的。
这⾥有⼀个略过了⼀些步骤的完整的,简化的 RPM 的 spec ⽂件。
Linux RPM包的制作详解
每个阶段的详细说明如下:
பைடு நூலகம்
%prep 阶段 这个阶段里通常情况,主要完成对源代码包的解压和打补丁(如果有的话),而解压时最 常见到的就是一句指令: %setup -q
当然,这句指令可以成功执行的前提是你位于 SOURCES 目录下的源码包必须是 name-ver sion.tar.gz 的格式才行,它还会完成后续阶段目录的切换和设置。如果在这个阶段你不用 这条指令,那么后面每个阶段都要自己手动去改变相应的目录。解压完成之后如果有补丁文 件,也在这里做。想了解的童鞋可以自己去查查如何实现,也不难,这里我就不展开了。
时使用的“虚拟”根目录,最终制作 rpm 安装包的文件就来自这里。
BuildRequires:
<=== 在本机编译 rpm 包时需要的辅助工具,以逗号分
隔。假如,要求编译 myapp 时,gcc 的版本至少为 4.4.2,则可以写成 gcc >=4.2.2。还有
其他依赖的话则以逗号分别继续写道后面。
rpm 的打包流程相比 deb 的要稍微麻烦一些,因为它对打包目录有一些严格的层次上的 要求。如果你的 rpm 的版本<=4.4.x,那么 rpmbuid 工具其默认的工作路径是/usr/src/redh at,这就使得普通用户不能制作 rpm 包,因为权限的问题,在制作 rpm 软件包时必须切换到 root 身份才可以。所以,rpm 从 4.5.x 版本开始,将 rpmbuid 的默认工作路径移动到用户家 目录下的 rpmbuild 目录里,即$HOME/rpmbuild,并且推荐用户在制作 rpm 软件包时尽量不要 以 root 身份进行操作。
0.tar.gz,那么 myapp-0.1.0.spec 的头部一般如下的样子:
RPM
具有相关性套件之间的问题,就是所谓的套件相依属性, RPM 就在提供套件打包的档案时,同时加入一些讯息登
录的功能,这些讯息包括套件的版本、 打包套件者、相 依属性的套件、套件的功能说明、该套件的所有档案与 目录纪录、等等,
然后在 Linux 系统上面亦建立一个 RPM 套件资料库
( database ),如此一来,当您要安装某个以 RPM 型态提 供的套件时,在安装的过程中, RPM 会去检验一下资料 库里面是否已经存在相关的套件了, 如果资料库显示不 存在,那么这个 RPM 档案『预设』就不能安装( 会显示 一些错误讯息 )。 这个就是 RPM 类型的档案最为人所诟病的『 套件的属 性相依』问题
或相当;
需要满足套件的相依属性需求;
反安装时需要特别小心,最底层的套件不 可先移除,否则可能造成整个系统的问题!
那怎么办?还好,还有 SRPM 这个东西!
SRPM 是什么呢?顾名思义,他是 Source RPM 的意思,也就是这个 RPM 档案里面含 有原始码( Source Code )哩!特别注意的是, 这个 SRPM 所提供的套件内容『并没有经 过编译』, 他提供的是原始码
怎么 SRPM 这么麻烦!还要重新编译一次,那 么我们直接使用 RPM 来安装不就好了!? 通常一个套件在释出的时候,都会同时释出该
套件的 RPM 与 SRPM 。 我们现在知道 RPM 档案必须要在相同的 Linux 环境下才能够安装,而 SRPM 既然是原始码的 格式,自然我们就可以透过修改 SRPM 内的参 数设定档,然后重新编译产生能适合我们 Linux 环境的 RPM 档案, 如此一来,就可以将该套件安装到我们的系统 当中,而不必与原作者打包的 Linux 环境相同 了?这就是 SRPM 的用处了!
RPM打包入门教程
RPM打包教程内容目录1.Linux一般软件的安装 (1)2.Linux包类型 (1)3.RPM介绍 (2)3.1.例子 (2)3.2格式 (2)3.3rpm支持的架构 (2)4.RPM使用 (3)4.1RPM的运用 (3)4.2YUM的运用 (4)5.RPM打包 (4)5.1预备工作 (4)5.1.1预装软件 (4)5.1.2建立文件夹树 (4)5.2.创建RPM Spec文件 (5)5.2.1导言 (5)5.2.2 %description区段 (5)5.2.3 %prep 区段 (5)5.2.4 %build区段 (5)5.2.5 %install区段 (6)5.2.6 %clean区段 (6)5.2.7 %files区段 (6)5.2.8 %changelog区段 (6)5.3 调用rpmbuild命令编译rpm软件包 (7)6. Fedora哦也,酷毙了~ (7)1.Linux一般软件的安装./cofiguremake && make install2.Linux包类型软件包简单的说就是像Windows下.exe或者.msi的样子的安装包。
可以将编译好的二进制文件,源代码,文档等以特定格式压缩。
使用软件包管理工具可以直接安装。
RPM ——RPM(Redhat Packager Manager),最初是Redhat公司引进在RedhatLinux上的,是以自由软件许可证发布的软件。
主要使用的发行版有:RHEL,Fedora,CentOS,Mandriva,openSUSE,国内的Redflag,Qomo,还有一个值得关注的是就快出现的Meego也是用RPM的。
They say they like “yum”Deb——也有不使用RPM管理的发行版,那就是所谓的Debian系,主要是Debian,Ubuntu,Knoppix。
Portage——是Gentoo引入的,类似与FreeBSD中的一个port的一个管理。
RPM及其rpm命令详解
二、高中地理必修1案例解析
此外,教材中的“活动”板块设计了大量的实验、观察、调查等实践性强的 学习任务,有助于培养学生的实践能力。
二、高中地理必修1案例解析
4、价值观引导分析:高中地理必修1深入浅出地介绍了自然地理学的相关知 识,不仅让学生掌握一定的科学知识,还注重引导学生树立正确的价值观。例如, 通过了解全球气候变化、生物多样性、水资源短缺等环境问题,培养学生的环保 意识和可持续发展观念。同时,教材中的案例分析注重引导学生当代社会面临的 重大问题,如气候变化、自然灾害等,帮助学生认识到科学在解决这些问题中的 作用,激发他们的社会责任感和科学探究精神。
一、宏观层面地理教材分析的基 本方法
一、宏观层面地理教材分析的基本方法
宏观层面地理教材分析主要包括对教材整体结构、内容逻辑、学科特征、价 值观引导等方面的分析。具体方法如下:
一、宏观层面地理教材分析的基本方法
1、整体结构分析:教材的章节设置、标题与提示、引言与总结等,以了解教 材的编排思路与整体框架。
内容摘要
随着教育的不断发展和进步,教材的二次开发越来越受到人们的。尤其是对 于地理学科,为了更好地适应时代的需求和学生的实际情况,教材的二次开发显 得尤为重要。本次演示将以高中地理必修教材为例,探讨地理教材二次开发的理 论与实践。
一、理解地理教材二次开发的重 要性
一、理解地理教材二次开发的重要性
高中地理必修教材是地理教学中的基础教材,涵盖了自然地理、人文地理、 区域地理等方面的内容。通过对教材的分析,可以发现其中隐含的地理原理和规 律,为二次开发提供理论支持。例如,教材中对地形地貌、气候、植被等地理要 素的描述和分析,都涉及到自然地理学的基本理论。
三、高中地理必修教材二次开发 的实践
rpm包 二进制 结构体
rpm包二进制结构体摘要:1.RPM 包的概述2.RPM 包的二进制结构3.结构体的概念和应用4.RPM 包与结构体的关系5.总结正文:1.RPM 包的概述RPM(Red Hat Package Manager)是红帽Linux 发行版中的一种软件包管理器,主要用于安装、卸载、更新和查询软件包。
RPM 包是一种包含软件及其依赖关系的归档文件,可以方便地在不同的Linux 发行版之间进行软件的移植。
2.RPM 包的二进制结构RPM 包采用二进制格式存储,主要包括以下几个部分:- 文件头:RPM 包的开始部分,包含了RPM 包的魔数(Magic Number)以及版本信息,用于标识RPM 包的格式和版本。
- 签名区:用于存储RPM 包的数字签名,确保RPM 包在传输过程中没有被篡改。
- 摘要信息:包括RPM 包的名称、版本、描述、依赖关系等基本信息。
- 软件包信息:存储了软件包的具体内容,包括二进制文件、配置文件、文档等。
- 依赖关系:记录了该软件包所需的其他软件包及其版本要求。
- 安装脚本:包含了安装、卸载和升级该软件包所需的脚本。
- 验证信息:用于验证RPM 包的完整性和正确性。
3.结构体的概念和应用结构体是一种复合数据类型,它可以将不同类型的数据组织在一起。
结构体在C 语言中广泛应用,尤其在操作系统、编译器等底层软件开发中。
结构体可以描述一个实体,如一个人、一台电脑等,也可以描述一个数据集合,如RPM 包的摘要信息。
4.RPM 包与结构体的关系RPM 包的二进制结构采用了结构体的形式来存储和组织数据。
例如,在RPM 包的摘要信息部分,可以使用结构体来描述软件包的名称、版本、描述等信息。
这样,可以方便地对RPM 包进行解析和处理。
5.总结RPM 包是红帽Linux 发行版中的一种软件包管理器,采用二进制格式存储。
其结构主要包括文件头、签名区、摘要信息、软件包信息、依赖关系、安装脚本和验证信息等部分。
rpm 依赖关系 -回复
rpm 依赖关系-回复主题:RPM依赖关系引言:在Linux系统中,RPM(Red Hat Package Manager)是一种常用的软件包管理工具。
它允许用户轻松安装、升级、删除软件包,并处理软件包之间的依赖关系。
RPM的依赖关系是指在安装或升级软件包时,系统需要满足的其他软件包的条件。
本文将为您详细介绍RPM的依赖关系,并逐步解释其工作原理。
第一步:什么是RPM依赖关系RPM依赖关系是指在安装或升级软件包时,系统所需满足的其他软件包条件。
换句话说,一个软件包可能会依赖于其他软件包,而这些依赖关系需要在安装或升级软件包之前满足。
RPM依赖关系可以使系统管理员轻松管理软件包的安装和升级,确保系统的稳定性和可靠性。
第二步:RPM依赖关系的类型RPM依赖关系有两种类型:必需依赖和建议依赖。
- 必需依赖:这些是软件包在安装或升级时必须满足的依赖关系。
如果系统中没有满足这些依赖关系的软件包,则无法安装或升级软件包。
- 建议依赖:这些依赖关系是可选的,如果满足则会提供更好的功能或体验,但系统可以在没有它们的情况下正常工作。
第三步:RPM依赖关系的表示方法RPM依赖关系可以通过两种方式来表示:需求标记和提供标记。
- 需求标记:软件包可以通过需求标记指定对其他软件包的依赖关系。
需求标记通常包括软件包名称、版本号和发布号等信息。
- 提供标记:软件包可以通过提供标记指定自己可以满足其他软件包的依赖关系。
提供标记通常与软件包的名称和版本号相关联。
第四步:RPM依赖关系的解析和满足RPM在安装或升级软件包时,会解析软件包的依赖关系并尝试满足这些依赖关系。
它会检查系统中是否已安装了满足软件包依赖关系的软件包。
如果依赖关系已满足,RPM将继续安装或升级软件包;否则,它将返回一个错误,并提示用户安装或升级所需的软件包。
第五步:RPM依赖关系的管理系统管理员可以使用RPM依赖关系管理工具来管理软件包的依赖关系,以确保系统的稳定性和可靠性。
制作PHP的RPM包详解及实例
制作PHP的RPM包详解及实例制作PHP的RPM包教程有时候为了⽅便源码包的安装,我们需要⾃⼰订制软件包的需求,我们会把⼀些源码包按照我们的需求来做成rpm包,当有了源码包就可以直接编译得到⼆进制安装包和其他任意包。
spec file是制作rpm 包最核⼼的部分,rpm包的制作就是根据spec file来实现的。
下⾯是我以制作php的rpm开始介绍其制作⽅法。
以下操作在CentOS6.6 64位系统进⾏。
下⾯我们以制作php的rpm开始介绍其制作⽅法。
以下操作在CentOS6.6 64位系统进⾏。
安装rpm-build[************************]#yum-yinstallrpm-build建⽴⼯作车间⽬录[************************]#vim~/.rpmmacros%_topdir /root/rpmbuild[************************]#mkdir-pv~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}在redhat下,rpm包的默认制作路径在/usr/src/redhat下,但CentOS并没有该⽬录,因此,我们不得不⾃定义⼯作⽬录,这其中包含了6个⽬录(要求全部⼤写)BUILD:源代码解压以后放的位置RPMS:制作完成后的rpm包存放⽬录,为特定平台指定⼦⽬录(x86_64)SOURCES:收集的源⽂件,源材料,补丁⽂件等存放位置SPECS:存放spec⽂件,作为制作rpm包的领岗⽂件,以rpm名.specSRPMS:src格式的rpm包位置,既然是src格式的包,就没有平台的概念了BuiltRoot:假根,使⽤install临时安装到这个⽬录,把这个⽬录当作根来⽤的,所以在这个⽬录下的⽬录⽂件,才是真正的⽬录⽂件。
当打包完成后,在清理阶段,这个⽬录将被删除[************************]#rpmbuild--showrc|greptopdir#⼯作车间⽬录:_topdir /root/rpmbuild-14: _builddir %{_topdir}/BUILD-14: _buildrootdir %{_topdir}/BUILDROOT-14: _rpmdir %{_topdir}/RPMS-14: _sourcedir %{_topdir}/SOURCES-14: _specdir %{_topdir}/SPECS-14: _srcrpmdir %{_topdir}/SRPMS-14: _topdir /root/rpmbuildrpmbuild --showrc显⽰所有的宏,以下划线开头,⼀个下划线:定义环境的使⽤情况,⼆个下划线:通常定义的是命令,为什么要定义宏,因为不同的系统,命令的存放位置可能不同,所以通过宏的定义找到命令的真正存放位置收集源码⽂件脚本⽂件[************************]#pwd/root/rpmbuild/SOURCES[************************]#lsphp-5.4.45.tar.gz编写SPEC⽂件[*********************]#pwd/root/rpmbuild/SOURCES[*********************]#vimphp.spec#内容如下:%define _user www%define _group www%define _prefix /usr/local/phpName: php #软件包名称Version: 5.4.45 #版本号(不能使⽤-)Release: 1%{?dist} #release号,对应下⾯的changelog,如php-5.4.45-1.el6.x86_64.rpmSummary: PHP is a server-side scripting language for creating dynamic Web pages #简要描述信息,最好不要超过50个字符,如要详述,使⽤下⾯的%descriptionGroup: Development/Languages #要全⽤这⾥⾯的⼀个组:less /usr/share/doc/rpm-version/GROUPSLicense: GPLv2 #软件授权⽅式URL: #源码相关⽹站Packager:yeho<*******************>#打包⼈的信息Vendor: OneinStack #发⾏商或打包组织的信息Source0: %{name}-%{version}.tar.gz #源代码包,可以带多个⽤Source1、Source2等源,后⾯也可以⽤%{source1}、%{source2}引⽤BuildRoot: %_topdir/BUILDROOT #安装或编译时使⽤的“虚拟⽬录”Requires: libmcryptRequires: mhashRequires: mcryptRequires: libiconv #定义php依赖的包,需要yum安装(此处使⽤epel源)%description #软件包详述PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML.%prep #软件编译之前的处理,如解压%setup -q #这个宏的作⽤静默模式解压并cd%build #开始编译软件%configure --prefix=%{_prefix} --with-config-file-path=%{_prefix}/etc \--with-fpm-user=%{_user} --with-fpm-group=%{_group} --enable-fpm --enable-fileinfo \--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \--with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib \--with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-exif \--enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-inline-optimization \--enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl \--with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-ftp --enable-calendar \--with-gettext --enable-zip --enable-soap --disable-ipv6 --disable-debugmake ZEND_EXTRA_LIBS='-liconv' %{?_smp_mflags} #%{?_smp_mflags} 的意思是:如果就多处理器的话make时并⾏编译%install #开始安装软件,如make installrm -rf %{buildroot}make INSTALL_ROOT=%{buildroot} installrm -rf %{buildroot}/{.channels,.depdb,.depdblock,.filemap,.lock,.registry}%{__install} -p -D -m 0755 sapi/fpm/init.d.php-fpm %{buildroot}/etc/init.d/php-fpm%{__install} -p -D -m 0644 php.ini-production %{buildroot}/%{_prefix}/etc/php.ini#rpm安装前执⾏的脚本%preecho '/usr/local/lib' > /etc/ld.so.conf.d/local.conf/sbin/ldconfigif [ $1 == 1 -a -z "`grep ^%{_user} /etc/passwd`" ]; then # $1有3个值,代表动作,安装类型,处理类型groupadd %{_group} -g 10000 # 1:表⽰安装useradd -u 10000 -g 10000 -m %{_user} # 2:表⽰升级fi # 0:表⽰卸载#rpm安装后执⾏的脚本%postif [ $1 == 1 ];then[ -z "`grep ^'export PATH=' /etc/profile`" ] && echo "export PATH=%{_prefix}/bin:\$PATH" >> /etc/profile[ -n "`grep ^'export PATH=' /etc/profile`" -a -z "`grep '%{_prefix}' /etc/profile`" ] && sed -i "s@^export PATH=\(.*\)@export PATH=%{_prefix}/bin:\1@" /etc/profile/sbin/chkconfig --add php-fpm/sbin/chkconfig php-fpm onMem=`free -m | awk '/Mem:/{print $2}'` #下⾯主要是参数的优化if [ $Mem -le 640 ];thenMem_level=512MMemory_limit=64elif [ $Mem -gt 640 -a $Mem -le 1280 ];thenMem_level=1GMemory_limit=128elif [ $Mem -gt 1280 -a $Mem -le 2500 ];thenMem_level=2GMemory_limit=192elif [ $Mem -gt 2500 -a $Mem -le 3500 ];thenMem_level=3GMemory_limit=256elif [ $Mem -gt 3500 -a $Mem -le 4500 ];thenMem_level=4GMemory_limit=320elif [ $Mem -gt 4500 -a $Mem -le 8000 ];thenMem_level=6GMemory_limit=384elif [ $Mem -gt 8000 ];thenMem_level=8GMemory_limit=448fised -i "s@^memory_limit.*@memory_limit = ${Memory_limit}M@" %{_prefix}/etc/php.inised -i 's@^output_buffering =@output_buffering = On\noutput_buffering =@' %{_prefix}/etc/php.inised -i 's@^;cgi.fix_pathinfo.*@cgi.fix_pathinfo=0@' %{_prefix}/etc/php.inised -i 's@^short_open_tag = Off@short_open_tag = On@' %{_prefix}/etc/php.inised -i 's@^expose_php = On@expose_php = Off@' %{_prefix}/etc/php.inised -i 's@^request_order.*@request_order = "CGP"@' %{_prefix}/etc/php.inised -i 's@^;date.timezone.*@date.timezone = Asia/Shanghai@' %{_prefix}/etc/php.inised -i 's@^post_max_size.*@post_max_size = 50M@' %{_prefix}/etc/php.inised -i 's@^upload_max_filesize.*@upload_max_filesize = 50M@' %{_prefix}/etc/php.inised -i 's@^;upload_tmp_dir.*@upload_tmp_dir = /tmp@' %{_prefix}/etc/php.inised -i 's@^max_execution_time.*@max_execution_time = 5@' %{_prefix}/etc/php.inised -i 's@^disable_functions.*@disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen@' %{_prefix}/etc/ sed -i 's@^session.cookie_httponly.*@session.cookie_httponly = 1@' %{_prefix}/etc/php.inised -i 's@^mysqlnd.collect_memory_statistics.*@mysqlnd.collect_memory_statistics = On@' %{_prefix}/etc/php.inicat > %{_prefix}/etc/php-fpm.conf <<EOF;;;;;;;;;;;;;;;;;;;;;; FPM Configuration ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Global Options ;;;;;;;;;;;;;;;;;;;[global]pid = run/php-fpm.piderror_log = log/php-fpm.loglog_level = warningemergency_restart_threshold = 30emergency_restart_interval = 60sprocess_control_timeout = 10sdaemonize = yes;;;;;;;;;;;;;;;;;;;;; Pool Definitions ;;;;;;;;;;;;;;;;;;;;;[%{_user}];listen = /dev/shm/php-cgi.socklisten = 127.0.0.1:9000listen.backlog = -1listen.allowed_clients = 127.0.0.1listen.owner = %{_user}listen.group = %{_group}listen.mode = 0666user = %{_user}group = %{_group}pm = dynamicpm.max_children = 12pm.start_servers = 8pm.min_spare_servers = 6pm.max_spare_servers = 12pm.max_requests = 2048pm.process_idle_timeout = 10srequest_terminate_timeout = 120request_slowlog_timeout = 0slowlog = log/slow.logrlimit_files = 51200rlimit_core = 0catch_workers_output = yes;env[HOSTNAME] = $HOSTNAMEenv[PATH] = /usr/local/bin:/usr/bin:/binenv[TMP] = /tmpenv[TMPDIR] = /tmpenv[TEMP] = /tmpEOFif [ $Mem -le 3000 ];thensed -i "s@^pm.max_children.*@pm.max_children = $(($Mem/2/20))@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.start_servers.*@pm.start_servers = $(($Mem/2/30))@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = $(($Mem/2/40))@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = $(($Mem/2/20))@" %{_prefix}/etc/php-fpm.confelif [ $Mem -gt 3000 -a $Mem -le 4500 ];thensed -i "s@^pm.max_children.*@pm.max_children = 80@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.start_servers.*@pm.start_servers = 50@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = 40@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = 80@" %{_prefix}/etc/php-fpm.confelif [ $Mem -gt 4500 -a $Mem -le 6500 ];thensed -i "s@^pm.max_children.*@pm.max_children = 90@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.start_servers.*@pm.start_servers = 60@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = 50@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = 90@" %{_prefix}/etc/php-fpm.confelif [ $Mem -gt 6500 -a $Mem -le 8500 ];thensed -i "s@^pm.max_children.*@pm.max_children = 100@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.start_servers.*@pm.start_servers = 70@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = 60@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = 100@" %{_prefix}/etc/php-fpm.confelif [ $Mem -gt 8500 ];thensed -i "s@^pm.max_children.*@pm.max_children = 120@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.start_servers.*@pm.start_servers = 80@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = 70@" %{_prefix}/etc/php-fpm.confsed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = 120@" %{_prefix}/etc/php-fpm.conffifi#rpm卸载前执⾏的脚本%preunif [ $1 == 0 ];then/etc/init.d/php-fpm stop > /dev/null 2>&1/sbin/chkconfig --del php-fpmif [ -e '/etc/profile.d/custom_profile_new.sh' ];thensed -i 's@%{_prefix}/bin:@@' /etc/profile.d/custom_profile_new.shelsesed -i 's@%{_prefix}/bin:@@' /etc/profilefifi#%postun rpm卸载后执⾏的脚本%clean #clean的主要作⽤就是删除BUILDrm -rf %{buildroot}%files #指定哪些⽂件需要被打包,如/usr/local/php%defattr(-,root,root,-)%{_prefix}%attr(0755,root,root) /etc/init.d/php-fpm%changelog #⽇志改变段,这⼀段主要描述软件的开发记录*SatOct242015yeho<*******************>5.4.45-1- Initial version下⾯是php-redis.spec[************************]#pwd/root/rpmbuild/SOURCES[************************]#lsredis-2.2.7.tgz[************************]#cd../SPEC[*********************]#vimphp-redis.spec%global php_extdir %(/usr/local/php/bin/php-config --extension-dir 2>/dev/null || echo "undefined")Name: php-redisVersion: 2.2.7Release: 1%{?dist}Summary: The phpredis extension provides an API for communicating with the Redis key-value store.Group: Development/LanguagesLicense: PHPURL: /package/redisSource0: redis-%{version}.tgzBuildRoot: %_topdir/BUILDROOTRequires: phpBuildRequires: php >= 5.4.40%descriptionThe phpredis extension provides an API for communicating with the Redis key-value store.%prep%setup -q -n redis-%{version}%build/usr/local/php/bin/phpize%configuremake %{?_smp_mflags}%installrm -rf %{buildroot}mkdir -p %{buildroot}%{php_extdir}make install INSTALL_ROOT=%{buildroot}find %{buildroot} -name redis.so -exec /bin/mv {} %{buildroot}%{php_extdir} \;#rpm安装后执⾏的脚本%postif [ $1 == 1 ];then[ -z "`grep '^extension_dir' /usr/local/php/etc/php.ini`" ] && echo "extension_dir = \"%{php_extdir}\"" >> /usr/local/php/etc/php.ini sed -i 's@^extension_dir\(.*\)@extension_dir\1\nextension = "redis.so"@' /usr/local/php/etc/php.inifi#rpm卸载前执⾏的脚本%preunif [ $1 == 0 ];then/etc/init.d/php-fpm stop > /dev/null 2>&1sed -i '/redis.so/d' /usr/local/php/etc/php.inifi#%postun rpm卸载后执⾏的脚本if [ $1 == 0 ];then/etc/init.d/php-fpm start > /dev/null 2>&1fi%cleanrm -rf %{buildroot}%files%defattr(-,root,root,-)%{php_extdir}/redis.so%changelog*SatOct242015yeho<*******************>2.2.7-1- Initial version编译rpm包[*********************]#rpmbuild-bbphp.spec制作php rpm⼆进制包[*********************]#rpmbuild-bbphp-redis.spec制作php-redis rpm⼆进制包感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
RPM打包教程
Rpm build(RPM包的制作)要想制作一个RPM格式的软件包,需要编写软件包描述文件。
其标准命名格式为:软件名-版本号-释出号.spec(现在大多情况下都是直接用:软件名.spec),这个文件,详细描述了有关该软件包的诸多信息,如软件名,版本,类别,说明摘要,创建时要执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件等等。
有了这个文件,RPM就可以制作出相应的包裹文件来。
下面以制作简易的realplayer软件包(realplayer-11.0.0-1.i386.rpm)为例,详细说明一下软件包描述文件的书写。
其描述文件为realplayer.spec,该文件内容的大概框架如下(spec文件中最好都用英文,用中文是方便说明):Name: realplayerVersion: 11.0.0Release: 1Summary: 视频播放工具Group: Applications/MultimediaLicense: SharewareVendor: HQ制作Source0: RealPlayer-11.0.0-1.tar.gzurl: /BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-rootRequires: bash%descriptionrealplayer是一款能播放mp3、rmvb等多种音视频格式文件的强大工具。
%prepecho "预处理脚本程序(prep)开始执行"%setup%buildecho "编译连接脚本程序(build)开始执行"make%installecho "安装脚本程序(install)开始执行"make install%cleanecho "建包结束后清理脚本程序(clean)开始执行"%preecho "安装前执行脚本程序(pre)开始执行"%postecho "安装后执行脚本程序(post)开始执行"%preunecho "卸载前执行脚本程序(preun)开始执行"%postunecho "卸载后执行脚本程序(postun)开始执行"%files打包的文件列表%changelog* Sun May 31 2009 小强- 修改信息该描述文件包括以下几方面的内容:一、文件头文件头描述软件包的基本信息,它包含若干个域,其中有必选的域,也有可选的域。
Linux_RPM包详解
Linux_RPM包详解原⽂:什么是RPM包RPM(RedHat Package Manager)⼀种通过资料库管理的⽅式将所需要的软件安装到主机上的管理程序.RPM包的特点1:事先已经编译好2:安装⽅便3:安装过程中要求环境⼀致4:反安装时要从最上层开始RPM包的命名规则⽰例:bind-9.8.2-0.47.rc1.el6.x86_64.rpm,如:bind,是软件的名称2.version,如:9.8.2-0,是软件的版本号,版本号格式通常为“主版本号.次版本号.修正号”。
47,是发布版本号,表⽰这个rpm软件包是第⼏次编译⽣成的3.arch,如i386,是表⽰包适⽤的硬件平台,⽬前rpm⽀持的平台有:i386,i586,i686,sparc和alpha4..rpm和.src.rpm,是rpm包类型后缀,rpm是编译好的⼆进制包,.src.rpm是源码包5.特殊名称:(1)el*:表⽰发⾏商的版本,el6表⽰这个软件包是在rhel6.x/centos6.x下使⽤;(2)devel:表⽰这个rpm包是软件的开发包(3)noarch:说明这样的软件包可以在任何平台安装和运⾏,不需要特定的硬件平台例如 httpd-manual- 2.0.40-21.i386.rpmhttpd-manual ----- 软件包名称2 ----- 主版本号0 ----- 次版本号40 ----- 次版本号21 ----- 编译的次数i386 ----- 适合的平台rpm ----- 说明是⼀个RPM包RPM包的安装RPM包的安装⾮常简单,只需要执⾏以下命令:rpm -ivh 软件包名参数说明:-i 安装-v 显⽰安装信息-h 显⽰安装进度rpm命令执⾏安装rpm包和源码包,rpm包以.rpm结尾,⽽源码包以.src.rpm结尾RPM常⽤命令-ivh 安装并显⽰安装进度(规则:rpm –ivh 包名)⽰例:rpm –ivh bind-9.8.2-0.47.rc1.el6.x86_64.rpm-Uvh 升级软件包(rpm –Uvh 包名 //升级软件包-旧升新,低升⾼)⽰例:rpm –Uvh --oldpackage bind-9.8.2-0.47.rc1.el6.x86_64.rpm(新版本软件包降级为旧版本)-ql 列出rpm软件包内的⽂件信息(显⽰已安装软件包内容)⽰例:rpm –ql vsftpd (规则:rpm –ql 软件名)-qi 列出rpm软件包描述信息(显⽰已安装软件包属性)⽰例:rpm –qi bind (规则:rpm –qi 软件名)-qf 查看指定⽂件属于哪个软件包(rpm –qf ⽂件名)⽰例:rpm –qf /etc/rc.d/init.d/named-Va 校验所有rpm包,查找丢失的⽂件-e 删除rpm软件包(rpm –e 包名)⽰例:rpm –e bind-9.8.2-0.47.rc1.el6.x86_64.rpm-qpR 查看rpm包依赖关系⽰例:rpm –qpR 包名--force 忽略软件包及⽂件的冲突,即强制安装(长格式命令)--nodeps 忽略软件包的依赖关系(长格式命令)--test 安装测试,并不实际安装(长格式命令)⽰例:测试--nodeps和--test,rpm –ivh httpd-2.2.15-53.el6.x86_64.rpm --test 并不安装,测试⼀下httpd软件包的依赖rpm –qa其中–a选项是查询所有已经安装的软件包。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Rpm打包原理详解为什么要打包?制作rpm 不仅仅是打包,更可以解决菜单创建、打补钉、完成大量预配置、与其他软件包互动等操作。
使用源代码安装要求用户了解基本的编译过程、能够应付各种不能编译的意外、必须自己完成抽象的配置、甚至懂得软件开发,能够自己打补钉,……对非计算机专业的用户而言简直就是天方夜谭。
这是把软件开发的最后一步抛给了用户,作为发行版,这是极不负责任的!也是不现实的,除非用lfs,但那是一本菜谱,不是真正的发行版。
软件作者发布源代码是正确的,负责的作者一般都同时提供rpm 和deb 包以及它们的源代码包。
除非他们不会制作。
愿意使用什么,那是个人的自由,但对外就不能只想到自己。
GNU 精神是一种公益精神,没有奉献精神,在自由软件领域是要遭唾弃的!直接使用其他发行版的rpm 常常是不行的。
不知道大家看没看“恼人的依赖关系”这个帖子。
可以在技术支持区搜索一下。
任何两个发行版本在二进制上都是不能兼容的!他们实际是不同的操作系统。
不仅使用的库文件不同,配置也迥异。
特别是同一个发行版的不同版本更不兼容。
任何包都必须在本地重新编译,而且不一定通得过,因为还有spec 宏的兼容问题!如果要在别的发行版上使用,必须用源码编译,这是常识。
考虑文件布局和配置问题,有时直接编译也是不够的,必须修改spec,甚至自己打补丁。
如何创建rpm 包?rpm 建包原理其实不复杂。
写spec 相当于一种脚本编程,主要是在spec 里提供一些软件相关信息,以及安装、卸载前后要执行的脚本,然后展开压缩的源代码包,打上补丁,执行编译,然后利用make install 可以重新指定安装目的地的特性,把编译好的文件安装到指定的虚拟根目录下的指定位置里,一般是虚拟的/usr 里,然后把这些目录、信息和脚本打成一个压缩包,即rpm 包。
同时可选地生成源码包src.rpm。
当然有很多具体细节问题。
您应该首先阅读软件的readme 和INSTALL 文件。
打包原则1. 任何人都应该在系统现有src.rpm 的spec 基础上修改更新,除非没有这样的包。
这可以省去很多麻烦,少走弯路。
2. 任何人都无权删除别人的changelog 和原始打包者的信息,这是对别人的不尊重。
但你可以追加自己的信息。
3. 尽可能在spec 里使用系统的标准宏定义,而不要用非标准写法。
4. 任何人都不应该直接提供修改后的源代码,而应该以补丁形式发布你的修改,在spec 里完成打补丁操作。
务必做到一个补丁只解决一个问题,这样才能确保补丁的可重用性,否则版本升级后补丁很容易失效。
如果你确信自己的补丁是清洁补丁,尽可能发给上游开发者,这样才能一劳永逸。
你所打的任何补丁,其授权方式必须和被修改源代码保持一致。
预备知识:首先我们观察一下rpm 文件名的特点。
一个rpm 包文件名通常由 5 段组成:%{name}-%{version}-%{release}.ix86.rpmcutedict-1.1-1mgc.i686.rpm这里%{name}=cutedict,%{version}=1.1,%{release}=1mgc,ix86=i686,如果是为athlon 芯片家族编译的包,这里就是athlon,依此类推。
注意:下面是一个spec 模板。
1. 凡是行首加上# 的都被注释掉了,实际运行时不起作用,如要使其生效,请去掉注释符#。
2. 凡是以%{***} 和%*** 形式出现的符号都是“宏”,很多宏都是系统预定义的[注2],也可以是自己定义的。
3. 下面的黑体字是spec 文件的关键字,不能写错。
4. 有不明白的地方可以参见跟帖里的参考文献。
5. 如果软件没有使用GNU autotool 创建,而是自己写的Makefile,这就导致不能按照常规方法打包,非常麻烦。
6. 服务器软件通常都需要大量预配置工作,spec 打包绝非一两天能解决,需要深入研究很多东西和反复实践,建议初学者不要尝试。
7. 其他发行版的spec 与src.rpm 是很好的教材,建议打包前先找找Fedora 或SuSE 的文件学习,能借鉴最好,但不应该不修改照搬过来或使用Mandrake 的文件,因为它使用的大量宏定义和我们不兼容,甚至src.rpm 直接编译都通不过。
------------------------------------------------------------------[spec 文件头部]# Initial spec file created by autospec #这里是一些注释%define _noautoreq perl(Plot) perl(WidgetDemo) #这里用%define 自定义一个系统里没有的叫做_noautoreq 的宏,后面可以用%{_noautoreq} 引用。
Name: software #这是软件包名称,后面可以用%{name} 引用Summary: a software #这是软件包的内容提要#Summary(zh_CN): #这里写入中文内容提要(如果有必要。
不建议使用,因为如果系统里的默认编码与此处不符,会导致显示乱码。
例如:我们使用GBK,如果这里的中文是UTF-8 编码,在kpackage 里就会显示乱码,但是synaptic 可能能够正确显示,但需要把zh_CN 改为zh_CN.UTF-8 )Version: number #这是软件的实际版本号,例如2.1.6、2.2final 等,后面可以用%{version} 引用Release: number #发布序列号,我们用1mgc、2mgc 等等,标明这是第几次打包。
如果软件本身是预览版,比如pre6 版,则写成pre6_1mgc、pre6_2mgc,后面可以用%{release} 引用Group: Applications/Multimedia #这是软件分组,建议使用标准分组,参见下面:[注1]#Group(zh_CN): #中文软件分组(如果有必要)License: GPL #这是软件版权证书,通常是GPLSource: %{name}-%{version}.tar.gz #这是源代码(通常是压缩包),可以带有完整的网址,可以用正整数标识多个源Source0 Source4 Source5 Source100,数字不必连续排列,后面可以用%{SOURCE0}、%{SOURCE4}、%{SOURCE5}、%{SOURCE100} 引用。
例如/src/%{name}-%{version}.tar.gzBuildRoo t: %{_tmppath}/%{name}-%{version}-%{release}-buildroot #这是make install 时使用的“虚拟”根目录也称为“构建根”目录,通常是/var/tmp/软件名称-版本号-发布序列号-buildroot,make install 时一般会将软件安装在/var/tmp/软件名称-版本号-发布序列号-buildroot/usr/ 下的bin/ 下(可执行文件)、share/ 下(数据、资源文件)、lib/ 下(共享库文件)等等,例如/var/tmp/cce-0.51-1mgc-buildroot/usr/bin/cce。
不过实际不一定都是这样,具体情况具体对待# 下面是可选的字段URL: / #这是软件主页地址#Vendor: Red Hat Co.,ltd. #这是发行商或者打包组织的信息,我们统一写成MGC Group,不过这一行可以省略,把它写入/usr/lib/rpm/macros 标准宏定义文件里,该文件的Vendor 这行定义是空的,而且通常前面用# 注释掉了#Distribution: Red Hat Linux #这是软件针对的发行版标识,我们是Magic LinuxPatch: src-%{version}.patch #这是补丁源代码(可以是压缩包),可以用正整数标识多个源Patch1 Patch4 Patch6,数字不必连续排列。
Prefix: %{_prefix} #指定make install 时在虚拟根目录里的安装位置,通常用标准的%{_prefix} 宏,它代表/usr。
这里指定后,用户可以在rpm 安装阶段重新指定安装到其他位置,如/opt,否则就不能改变安装位置。
Prefix: %{_sysconfdir} #如果软件有些文件并非都安装到%{_prefix},那么你需要指明其他位置。
例如你需要把一个配置文件放到/etc 下面,这显然不在/usr 下面,此时你需要前方这种写法。
%{_sysconfdir} 宏代表/etc。
这里指定后,用户可以在rpm 安装阶段重新指定这些文件安装到其他位置,如/opt/etc,否则就不能改变安装位置。
[注3]#BuildArch: noarch#编译目标处理器架构,就是今后软件运行时的CPU 类型。
noarch 是不指定架构,通常标准默认是i386,定义在了系统的标准宏定义文件/usr/lib/rpm/macros 里[注2]。
实际编译时可以在rpmbuild 命令行用--target=i686 参数,spec 里通常不写这行。
#Requires: XFree86>=4.3 zlib libpng #这里罗列所有安装本包时需要先行安装的包(依赖包),通常软件会依赖这些包里的一部分文件。
可以分成多行来写。
如果这里不写明依赖包,打包时系统会自动把具体依赖的.so 文件写进rpm 包,而不会注明这些文件属于哪些软件包,这会对用户造成困惑,因为他们很难知道这些文件属于哪些软件包#Obsoletes: #这里列出的软件包都是“陈旧”的,当安装本包的时候,这里列出的包都会被自动卸载!NoAutoReq: %{_noautoreq} #这里的意思是禁止自动查找对spec 文件头部预定义的_noautoreq 宏里定义的两个软件包[perl(Plot) 和perl(WidgetDemo)]的依赖关系,通常对于prel 模块需要这样处理。
因为即便你在Requires 字段指明了本包所依赖的包含这两个模块的那些软件包,安装本包的时候系统仍然会直接查找是否安装有这些perl 模块,而不会查找那些包含这两个模块的软件包是否已经安装。
#PreReq: loop #如果在%post 字段执行的脚本需要使用一些特殊命令,例如loop,你需要在此标明#Requires(post): loop #这是上面一行的另一种写法#Autoreq: 0 #这里使用0 关闭了自动标注本软件包需要的依赖关系的功能,使用1 或者不写此行(默认)就是开启自动标注依赖关系的功能。