- 浏览: 466897 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
alvin198761:
<div class="quote_title ...
别给12306 辩解了 -
renzhengzhi:
我参与过12306余票查询系统的开发,用户请求被前面3层缓存拦 ...
别给12306 辩解了 -
renzhengzhi:
写的很好。
JAVA线程dump的分析 -
liyonghui160com:
说好的附件呢
分布式服务框架 Zookeeper -- 管理分布式环境中的数据 -
ghpaas:
orbeon作为xforms标准的实现,不论其设计器还是运行时 ...
XForms 1.1 中文翻译—第1章 关于XForms标准
安装和卸载脚本看起来很简单,但它们工作原理中的一些意外可能会引起大问题。
这里是一些基本信息。可以将下列四节中的任意一个添加到 .spec 文件, 它列出了在您的包安装期间各个点上运行的 shell 脚本:
尤其要注意 %install
与这些节之间的差异。构建 RPM 时, %install
在开发机器上运行; 它应该将产品安装在开发机器上或安装到一个构建根目录中。 另一方面,这些节指定当用户正在安装或卸载您的 RPM 包时将在 用户的机器上运行什么。
这里有一个示例,是在前文基础上建立的。我们要使用 install-info
将 GNU indent 的 info 文件添加到目录中。
清单 1. indent-4.spec
# Simplistic example of install scripts - do not use
Summary: GNU indent
Name: indent
Version: 2.2.6
Release: 4
Source0: %{name}-%{version}.tar.gz
License: GPL
Group: Development/Tools
BuildRoot: %{_builddir}/%{name}-root
%description
The GNU indent program reformats C code to any of a variety of
formatting standards, or you can define your own.
%prep
%setup -q
%build
./configure
make
%install
rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
%post
if [ -x /sbin/install-info ]; then
/sbin/install-info /usr/local/info/indent.info /usr/local/info/dir
fi
%preun
if [ -x /sbin/install-info ]; then
/sbin/install-info --delete /usr/local/info/indent.info /usr/local/info/dir
fi
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
/usr/local/bin/indent
%doc /usr/local/info/indent.info
%doc %attr(0444,root,root) /usr/local/man/man1/indent.1
%doc COPYING AUTHORS README NEWS
|
请注意,在尝试使用 install-info
工具之前,首先对它进行检查。我们不希望只是因为我们不能提供至产品文档的链接而使安装失败。
但也有可能在某种情况下您希望安装过程失败。一种好的技术是使用 %pre
脚本来检查安装前提条件,它们比 RPM 可以直接支持的更复杂。 如果不符合前提条件,那么脚本以非零状态退出,而且 RPM 不会继续安装。
另外请注意,我们必须小心地使用卸载脚本来撤销安装脚本。
现在,让我们着手升级。如果用户只安装和删除您自己的包,那么前面节中的指令将正常工作;但在升级期间,它们会完全失效。
以下是 RPM 如何执行升级:
- 运行新包的 %pre
- 安装新文件
- 运行新包的 %post
- 运行旧包的 %preun
- 删除新文件未覆盖的所有旧文件
- 运行旧包的 %postun
如果我们使用前面的示例来升级,那么 RPM 最后将运行 %postun 脚本, 它将除去我们在安装脚本中所做的所有工作!使用 RPM 的一般开发人员可能不会想到这一点。 我不会尝试解释其原因,只是解释您必须为此做点什么。
相当幸运的是,在一定程度上,脚本有一种方法可以告之是否正在安装、删除或升级包。每个脚本都被传递单一命令行参数 ― 一个数字。 这应该告诉脚本 在当前包完成安装或卸载之后将安装多少个包的副本。
只查看在各种情况下传递的值或许更容易,而不是尝试计算它。
这里是在安装期间传递的实际值:
- 运行新包的 %pre (1)
- 安装新文件
- 运行新包的 %post (1)
这里是在升级期间传递的值:
- 运行新包的 %pre (2)
- 安装新文件
- 运行新包的 %post (2)
- 运行旧包的 %preun (1)
- 删除新文件未覆盖的任何旧文件
- 运行旧包的 %postun (1)
这里是在删除期间传递的值:
- 运行旧包的 %preun (0)
- 删除文件
- 运行旧包的 %postun (0)
可以通过将类似下例的一些东西添加到您的包中来自己测试它。 然后创建一个带稍高发行版号的新包,安装第一个,然后升级到第二个,最后卸载它,以查看所有可能性。 当然,在信任的公共社区上发布任何 RPM 之前,您总是要对它进行几次这样的尝试。
清单 2. 脚本执行的测试顺序和参数
%pre
echo This is pre for %{version}-%{release}: arg=$1
%post
echo This is post for %{version}-%{release}: arg=$1
%preun
echo This is preun for %{version}-%{release}: arg=$1
%postun
echo This is postun for %{version}-%{release}: arg=$1
|
这里是另一个示例,这次正确地处理升级过程:
清单 3. indent-5.spec
Summary: GNU indent
Name: indent
Version: 2.2.6
Release: 5
Source0: %{name}-%{version}.tar.gz
License: GPL
Group: Development/Tools
BuildRoot: %{_builddir}/%{name}-root
%description
The GNU indent program reformats C code to any of a variety of
formatting standards, or you can define your own.
%prep
%setup -q
%build
./configure
make
%install
rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
%post
if [ "$1" = "1" ] ; then # first install
if [ -x /sbin/install-info ]; then
/sbin/install-info /usr/local/info/indent.info /usr/local/info/dir
fi
fi
%preun
if [ "$1" = "0" ] ; then # last uninstall
if [ -x /sbin/install-info ]; then
/sbin/install-info --delete /usr/local/info/indent.info /usr/local/info/dir
fi
fi
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
/usr/local/bin/indent
%doc /usr/local/info/indent.info
%doc %attr(0444,root,root) /usr/local/man/man1/indent.1
%doc COPYING AUTHORS README NEWS
|
现在,仅当完全删除这个包时才会除去 info 链接。
假设在安装或卸载 其它包时要运行您包中的一些代码。 可以用 触发器(trigger)脚本来完成这一任务。
您为什么要这样做?通常是因为您的包使用一个或多个其它包的服务,或者提供服务给一个或多个其它包。
这里有一个示例。假设您正在为 Emacs 和 Xemacs 编辑器打包一个极好的附加工具。它可以与其中任何一个或两个编辑器一起工作, 但根据所安装的编辑器,需要做一些少量的配置。
安装时,可以对 Emacs 和 Xemacs 进行测试,并配置您的工具以使可用编辑器可以访问它。 但是,如果用户稍后安装 Xemacs,那么会发生什么情况呢?您的工具在 Xemacs 中不可用,除非用户卸载并重新安装您的工具。 如果您的包可以告诉 RPM,“让我知道是否安装了 Xemacs”,这是否会更好呢?
这是触发器脚本的思想。可以将它添加到 .spec 文件中:
清单 4. 触发器示例
%triggerin -- emacs
# Insert code here to run if your package is already installed,
# then emacs is installed,
# OR if emacs is already installed, then your package is installed
%triggerin -- xemacs
# Insert code here to run if your package is already installed,
# then xemacs is installed,
# OR if xemacs is already installed, then your package is installed
%triggerun -- emacs
# insert code here to run if your package is already installed,
# then emacs is uninstalled
%triggerun -- xemacs
# insert code here to run if your package is already installed,
# then xemacs is uninstalled
%postun
# Insert code here to run if your package is uninstalled
|
触发器脚本被传递了 两个参数。第一个参数是当触发器脚本完成运行时将安装的 您的包的实例数。第二个参数是当触发器脚本完成运行时将安装的 要触发的包的实例数。
这里是 RPM 升级期间脚本执行和文件安装及卸载的完整顺序,它来自 RPM 分发版中的 triggers
文件:
清单 5. 脚本顺序
new-%pre for new version of package being installed
... (all new files are installed)
new-%post for new version of package being installed
any-%triggerin (%triggerin from other packages set off by new install)
new-%triggerin
old-%triggerun
any-%triggerun (%triggerun from other packages set off by old uninstall)
old-%preun for old version of package being removed
... (all old files are removed)
old-%postun for old version of package being removed
old-%triggerpostun
any-%triggerpostun (%triggerpostun from other packages set off by old un
install)
|
通常,所有安装时脚本和触发器脚本都是使用 /bin/sh
shell 程序运行的。如果您更喜欢另一个脚本语言,比方说 Perl,那么可以通过将 -p interpreter
添加到脚本行来告诉 RPM 应该使用另一种解释器运行您的脚本。例如:
清单 6. 备用解释器示例
%post -p /usr/bin/perl
# Perl script here
%triggerun -p /usr/bin/perl -- xemacs
# Another Perl script here
|
请注意,这 不适用于 RPM 的构建时脚本,如 %install
。
RPM 在将 RPM 变量存储到 RPM 包文件之前先在您的脚本中扩充它们,有时候这是有用的。 例如,可以在 .spec 文件顶部附近定义您自己的参数,然后在整个 .spec 文件 ― 甚至在您的脚本中使用 %{variable_name}
引用它们:
清单 7. RPM 变量示例
...
%define foo_dir /usr/lib/foo
...
%install
cp install.time.message $RPM_BUILD_ROOT/%{foo_dir}
%files
%{foo_dir}/install.time.message
%post
/bin/cat %{foo_dir}/install.time.message
|
您可能会在安装时试图做一些事情,但结果会证明这是一个坏主意。 例如,与用户交互的任何尝试或许不能很好地工作。RPM 被设计成在无需用户出现的情况下允许进行批处理安装。 如果在安装期间 RPM 包停下来并提出问题,而没有人看到这个问题,那么安装将一直挂起。
您可能要避免的另一件事情是启动任何服务。 在完整安装期间,您不能确定程序所需的每样东西是否已经在那里(例如,可能还没有任何网络); 另外,如果在完整操作系统安装期间每个 RPM 服务都尝试启动,那么整个安装过程大概会花很长时间。 这种情况下您可以做的就是打印消息,告诉用户有关任何所需配置或需要启动的服务的信息。 如果用户正在手工安装您的 RPM 包, 那么他或她将看到这些消息;如果它是较大批处理安装的一部分,那么它不会损害任何东西, 机器几乎肯定在结束时重新引导,启动您的服务。
如果您的包安装了 init 脚本,则可以使用 chkconfig
来安排将在适当运行级别上启动和停止的服务。 虽然可以通过将必需的符号链接直接安装为包的一部分来实现同一件事情, 但要使它们恢复正常会有很多麻烦,您可能宁愿使用 chkconfig
。
为了安全起见,许多服务在一个特定的用户标识下运行; 如果您的服务是这样的话,当系统上不存在该用户时,您需要在系统上创建它。
如果您的包安装了任何 GNU info 文件,那么在 Info 目录中将看不到它们,除非在安装时使用 install-info
工具添加它们。
当然,在卸载之前,必须试图停止您的包可能正在运行的任何服务(但如果服务不在运行,请确保卸载不会失败)。
当然,在卸载时,应该将您在安装时可能对系统做的大多数更改恢复成原来状态。 但稍微考虑一下您的操作;例如,卸载 RPM 包时不应该意外地删除任何用户创建的文件。 所以,请不要尝试除去用户标识或删除整个目录树,这样可能会好一些。
发表评论
-
使用 RPM 打包软件,第 1 部分: 构建和分发包
2012-03-26 10:31 1198顾名思义,开源软件 ... -
用 RPM 打包软件,第 2 部分
2012-03-26 10:28 1117不作为 root 用户来构建 RPM 包 正如您在第 1 ... -
用 RPM 打包软件,第 1 部分
2012-03-26 10:23 945RPM(Red Hat Package Manager)是用于 ... -
Memory usage analysis
2010-09-03 23:33 1187Memory usage analysis Syste ... -
Linux: How to measure actual memory usage of an application or process?
2010-09-03 23:31 1245http://stackoverflow.com/questi ... -
HowTo: Profile Memory in a Linux System
2010-09-03 22:56 1152HOWTO: Profile Memory in a Li ... -
Linux内存管理机制
2010-09-03 22:48 2038内存是Linux内核所管理的最重要的资源之一,内存管理 ... -
linux内存管理概述
2010-09-03 22:44 2387Linux中的地址空间(一)有这么一系列的问题,是否在困扰 ... -
linux上buffer和cache的区别
2010-09-03 15:14 1493free free 命令相对于top 提供了更简洁的查看系统 ... -
linux下top命令参数解释
2010-09-03 14:56 841top命令是Linux下常用的性能分析工具,能够实时显示系统中 ... -
smem memory reporting tool
2010-08-25 15:41 932smem is a tool that can give ... -
Linux进程虚拟内存和物理内存
2010-08-25 15:39 4997先介绍几个基本概念: SIZE: 进程使用的 ... -
Memory: VSS/RSS/PSS/USS
2010-08-25 13:54 1475Terms VSS - Virtual Set ... -
Linux 内核的文件 Cache 管理机制介绍
2010-08-18 18:21 9801 前言 自从诞生以来,Linux 就被不断完善和普及 ... -
运行时: 块内存复制,第 2 部分
2010-08-06 12:33 1189我的 前一专栏专注于 ... -
RunTime: 块内存复制
2010-08-06 12:32 1152内存复制 在计算机中,内存复制经常而普遍。它们出现在联网 ... -
内存详解
2010-08-06 11:34 892文档选项 ... -
Linux slab 分配器剖析
2010-08-06 11:32 1233良好的操作系统性能部分依赖于操作系统有效管理资源的能力。在 ... -
降低 Linux 内存开销
2010-08-06 11:30 1070Linux 广受追捧的一个优点是它比 Microsoft® ... -
在 Linux 平台中调试 C/C++ 内存泄漏方法
2010-08-06 11:29 1782由于 C 和 C++ 程序中完全由程序员自主申请和释放内存 ...
相关推荐
第四部分 Linux使用者管理 第14章 Linux账号管理与ACL权限设置 第15章 磁盘配额(Quota)与高级文件系统管理 第16章 例行性工作(crontab) 第17章 程序管理与SELinux初探 第18章 认识系统服务(daemons) 第19章 ...
当然,也有用rpm格式打包的源代码,用gzip压缩过的可执行程序包。只要您理解了以下的思路,这两种形式的安装包也不在话下了。 下面,我们就分成两个部分来说明软件安装思路: 第一部分:搞定.tar.gz 1.首先,使用t
概述 一些常见包的二进制发行版的 RPM 规范。 RPM 通常是从源代码构建的... 我们没有将整个Java程序重新打包,而是将noarch部分(大部分包)打包成一个-common包,将原生组件放在自己的架构依赖包中,然后让架构依赖包
在RHEL8中把软件源分成了两部分,一个是BaseOS,另一个是AppStream。在Red Hat Enterprise?Linux?8.0中,统一的ISO自动加载BaseOS和AppStream安装源存储库。已经存在于光盘链接中,只不过要分别去配置.repo文件。...
第一部分:常用命令 常用命令/文件处理 0:基础功能 1:ls 显示文件目录 语法:ls 选项[-ald][文件或目录] 2:cat 显示文件内容(内容少适合) 语法:cat[文件名] 3:tac 显示文件内容 语法:tac[文件名] 4:more 分页...
第1部分 基础篇 第1章 Linux与开源软件 1.1 自由软件和开源运动 1.1.1 自由软件简介 1.1.2 FSF、GNU和GNU Project 1.1.3 自由软件协议 1.1.4 自由软件及其商业价值 1.1.5 开源软件及其相关组织 1.1.6 自由软件v.s...
rpm -q -a --qf '{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示...
最初只有.tar.gz 的打包文件,用户必须编译每个他想在GNU/Linux 上运行的软件。用户们普遍认为系统很 有必要提供一种方法来管理这些安装在机器上的软件包,当Debian诞生时,这样一个管理工具也就应运而生, 它被命名...
如果你能把第一和第二部分学好。那么你已经具有RHCT(红帽认证技师的能力了) 第三部分、RH253 高级部分分为服务器架设和安全模块 1、DNS服务器的配置(挺麻烦的一个服务) RHCE课程-RH253Linux服务器架设笔记五-...
第六章:软件安装及RPM的使用 在Windows下安装软件时,只需运行软件的安装程序(Setup, Install等)或者用解压缩软件解开即可安装,运行反安装程序(Uninstall, Unware, 卸载等)就能将软件清除干净。这些...
pkgBackup是一个Perl程序,用于使用基于* .rpm或* .deb的发行版来备份家用Linux系统。 它仅归档(A)是软件包一部分的那些文件; 和(B)自安装软件包以来已更改。 您可以存储非打包文件。