Solaris 10 8/07 安装指南:Solaris Live Upgrade 和升级规划

附录 B 附加 SVR4 打包要求(参考)

本附录适用于安装或删除软件包(特别是第三方软件包)的系统管理员。遵循这些打包要求可实现以下目的:

本章包含以下几节:

禁止修改当前的 OS

遵守本节中的要求可确保当前运行的 OS 不被更改。

使用绝对路径

为了成功地安装操作系统,软件包必须能识别和正确地遵守备用根 (/) 文件系统,如 Solaris Live Upgrade 非活动引导环境。

软件包可以在其 pkgmap 文件(软件包映射)中包括绝对路径。如果这些文件存在,则将相对于 pkgadd 命令的 -R 选项来写它们。还可以将同时包含绝对和相对(可重定位)路径的软件包安装到备用根 (/) 文件系统上。 $PKG_INSTALL_ROOT 可放在绝对和可重定位文件之前,这样在使用 pkgadd 安装时,可正确解析所有路径。

使用 pkgadd -R 命令

使用 pkgadd -R 选项安装的或使用 pkgrm -R 选项删除的软件包不得更改当前正在运行的系统。此功能由自定义 JumpStart、Solaris Live Upgrade、非全局区域和无盘客户 机使用。

使用 pkgadd 命令 -R 选项安装的或使用 pkgrm 命令 -R 选项删除的软件包中包括的任何过程脚本均不得更改当前正在运行的系统。您提供的任何安装脚本必须引用前缀为 $PKG_INSTALL_ROOT 变量的目录或文件。软件包必须对所有带有 $PKG_INSTALL_ROOT 前缀的目录和文件进行写操作。软件包不得删除不带 $PKG_INSTALL_ROOT 前缀的目录。

表 B–1 提供了脚本语法的示例。

表 B–1 安装脚本语法示例

脚本类型 

正确的语法 

错误的语法 

Bourne shell “if”语句段 

if [ -f ${PKG_INSTALL_ROOT}\
/etc/myproduct.conf ] ; then
if [ -f /etc/myproduct.conf ] ; \
 then

删除文件 

/bin/rm -f ${PKG_INSTALL_ROOT}\
/etc/myproduct.conf
/bin/rm -f /etc/myproduct.conf 

更改文件 

echo "test=no" > ${PKG_INSTALL_ROOT}\
/etc/myproduct.conf
echo "test=no" > \
/etc/myproduct.conf

$PKG_INSTALL_ROOT $BASEDIR 之间的差别概述

$PKG_INSTALL_ROOT 表示您要向其添加软件包的计算机的根 (/) 文件系统的位置。该位置被设置为 pkgadd 命令的 -R 参数。例如,如果调用以下命令,则在软件包安装过程中 $PKG_INSTALL_ROOT 将成为 /a


# pkgadd -R /a SUNWvxvm

$BASEDIR 指向安装可重定位的软件包对象的可重定位基目录。在此仅安装可重定位的对象。不可重定位的对象(即那些在 pkgmap 文件中具有绝对路径的对象)的安装实际上始终相对于非活动的引导环境,而不是相对于 $BASEDIR。如果一个软件包没有可重定位的对象,则该软件包被称为绝对软件包(或不可重定位的软件包),系统将不定义 $BASEDIR,因而不可用于软件包过程脚本。

例如,假定一个软件包的 pkgmap 文件包含以下两项:


1 f none sbin/ls 0555 root sys 3541 12322 1002918510
1 f none /sbin/ls2 0555 root sys 3541 12322 2342423332

pkginfo 文件对 $BASEDIR 进行了说明:


BASEDIR=/opt

如果使用以下命令安装软件包,则 ls 安装在 /a/opt/sbin/ls 中,而 ls2 安装为 /a/sbin/ls2


# pkgadd -R /a SUNWtest

编写脚本的原则

软件包过程脚本必须独立于当前正在运行的 OS,以防止修改 OS。过程脚本定义在软件包安装和删除过程中的特定时刻所发生的操作。可以使用以下预定义的名称创建四个过程脚本:preinstallpostinstallpreremovepostremove

表 B–2 创建脚本的原则

原则 

影响 Solaris Live Upgrade 

影响非全局区域 

脚本必须在 Bourne shell (/bin/sh) 中编写。Bourne shell 是 pkgadd 命令用来执行过程脚本的解释程序。

脚本不得启动或停止任何进程,或者依赖于某些命令(例如 pstruss)的输出,因为这些进程或命令都与操作系统有关,并且会报告关于当前正在运行的系统的信息。

脚本可自由使用其他标准 UNIX 命令,例如 exprcpls 以及其他有助于编写 shell 脚本的命令。

脚本调用的任何命令必须在所有支持的发行版中可用,因为软件包必须在所有这些发行版上运行。所以,不能使用在 Solaris 8 发行版之后添加或删除的命令。 

要验证在 Solaris 8、9 或 10 发行版中是否支持某个特定的命令或选项,请参见 http://docs.sun.com 上的 Solaris Reference Manual AnswerBook 的特定版本。

 

维护无盘客户机兼容性

软件包不得执行由软件包本身提供的命令。这是为了维护无盘客户机的兼容性,同时避免运行那些可能需要尚未安装的共享库的命令。

验证软件包

所有软件包都必须通过 pkgchk 验证。在创建软件包之后以及安装它之前,必须使用以下命令对其进行检查。


# pkgchk -d dir_name pkg_name
dir_name

指定该软件包所驻留的目录的名称

pkg_name

指定该软件包的名称


示例 B–1 测试软件包

创建软件包后,必须通过使用 pkgadd-R dir_name 选项将该软件包安装到备用根 (/) 文件系统位置,以便对该软件包进行测试。安装完软件包后,必须使用 pkgchk 命令检查软件包的正确性,如本例所示。


# pkgadd -d . -R /a SUNWvxvm
# pkgchk -R /a SUNWvxvm

不应显示任何错误。



示例 B–2 在 /export/SUNWvxvm 中测试软件包

如果软件包位于 /export/SUNWvxvm,则可发出以下命令。


# pkgchk -d /export SUNWvxvm

不应显示任何错误。


在创建、修改和删除文件时,其他命令可检查软件包。以下是一些命令示例。


# TEMPDIR=/a; export TEMPDIR
# truss -t open /usr/sbin/pkgadd -R ${TEMPDIR} SUNWvxvm \
2>&1 > /dev/null | grep -v O_RDONLY | grep -v \
'open("'${TEMPDIR}

安装或升级时禁止用户交互

使用下列标准的 Solaris 实用程序时,必须在无用户输入信息提示的情况下,添加或删除软件包。

要测试软件包以确保该软件包能在无用户交互的情况下安装,可使用 pkgadd 命令的 -a 选项创建一个新管理文件。-a 选项将定义一个安装管理文件,该文件用来替代缺省的管理文件。使用缺省文件时可能会导致提示用户输入更多信息。您可以创建一个管理文件,该文件指示 pkgadd 应绕过这些检查并安装软件包,无需用户确认。有关详细信息,请参见手册页 admin(4)pkgadd(1M)

以下示例说明了 pkgadd 命令如何使用管理文件。


示例 B–3 安装管理文件

以下是一个安装管理文件示例,该安装管理文件几乎不需要与 pkgadd 实用程序进行用户交互。除非软件包需要的空间大于系统中的可用空间,否则 pkgadd 实用程序将使用此文件并安装软件包,而不会提示用户输入更多的信息。

mail=
instance=overwrite
partial=nocheck
runlevel=nocheck
idepend=nocheck
space=ask
setuid=nocheck
confiict=nocheck
action=nocheck
basedir=default

为区域设置软件包参数

软件包具有一些参数,用以控制在安装了非全局区域的系统上如何分布和显示软件包的内容。在安装了区域的系统上,SUNW_PKG_ALLZONES SUNW_PKG_HOLLOWSUNW_PKG_THISZONE 这三个软件包参数定义了软件包的特征。必须对这些参数进行设置,才能在安装了非全局区域的系统中管理软件包。

下表列出了四种用于设置软件包参数的有效组合。如果所选的设置组合不是表中所列的设置组合,则该设置无效,并将导致无法安装软件包。


注 –

请确保设置了所有这三个软件包参数。可以将这三个软件包参数保留为空。如果不设置这些参数,软件包工具会将缺少区域软件包参数视为该设置设为 "false",但强烈建议您设置这些参数。通过设置这三个软件包参数,可以指定安装或删除软件包时软件包工具所应呈现的确切行为。


表 B–3 区域的有效软件包参数设置

SUNW_PKG_ALLZONES 设置

SUNW_PKG_HOLLOW 设置

SUNW_PKG_THISZONE 设置

软件包说明 

false 

false 

false 

这是软件包的缺省设置,即,对于所有区域软件包参数都不指定值。 

具有这些设置的软件包既可以安装在全局区域中,也可以安装在非全局区域中。 

  • 如果在全局区域中运行 pkgadd 命令,则软件包将安装在全局区域以及所有非全局区域中。

  • 如果在某个非全局区域中运行 pkgadd 命令,则软件包将只安装在此非全局区域中。

在上述两种情况下,软件包的全部内容在安装了该软件包的所有区域中都是可见的。 

false 

false 

true 

具有这些设置的软件包既可以安装在全局区域中,也可以安装在非全局区域中。如果在安装软件包之后创建新的非全局区域,则软件包不会传播到这些新的非全局区域中。 

  • 如果在全局区域中运行 pkgadd 命令,则软件包将只安装在全局区域中。

  • 如果在某个非全局区域中运行 pkgadd 命令,则软件包将只安装在此非全局区域中。

在上述两种情况下,软件包的全部内容在安装了该软件包的区域中都是可见的。 

true 

false 

false 

具有这些设置的软件包只能安装在全局区域中。运行 pkgadd 命令后,软件包将安装在全局区域以及所有非全局区域中。软件包的全部内容在所有区域中都是可见的。


注 –

在非全局区域中安装软件包的任何尝试都将失败。


true 

true 

false 

具有这些设置的软件包只能由全局管理员安装在全局区域中。运行 pkgadd 命令后,软件包的内容将全部安装在全局区域中。如果将软件包的软件包参数设置为这些值,则软件包本身的内容并不会传送到任何非全局区域中,而只会将那些使软件包看起来似乎已安装的必要的软件包安装信息安装到所有非全局区域中。这样,将可以安装其他与此软件包相关联的软件包。有关 "hollow" 软件包的更多信息,请参见《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 23  章 “关于安装了区域的 Solaris 系统上的软件包和修补程序(概述)”

出于软件包相关性检查目的,软件包看起来像是安装在所有区域中。 

  • 在全局区域中,软件包的全部内容都是可见的。

  • 在完全根非全局区域中,软件包的所有内容都是不可见的。

  • 如果非全局区域从全局区域继承某个文件系统,则安装在此文件系统中的软件包在非全局区域中是可见的。由软件包传送的所有其他文件在此非全局区域中都是不可见的。

    例如,稀疏根非全局区域将与全局区域共享某些目录。这些目录是只读的。稀疏根非全局区域将与其他区域共享 /platform 文件系统。另外一个示例是只传送与引导硬件相关的文件的软件包。


注 –

在非全局区域中安装软件包的任何尝试都将失败。


描述 

更多信息 

有关软件包和区域的更多详细信息 

《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 23  章 “关于安装了区域的 Solaris 系统上的软件包和修补程序(概述)”

有关稀疏根区域和完全根区域的概述 

《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 16  章 “Solaris Zones 介绍”

有关软件包特征和参数的信息 

pkginfo(4)

有关显示软件包参数值的信息 

pkgparam(1)

有关背景信息

下列参考提供有关打包要求和特定命令语法的背景信息。

有关打包要求和术语定义的详细信息 

《Application Packaging Developer’s Guide》中的第 6  章 “Advanced Techniques for Creating Packages”

有关添加和删除软件包以及安装管理文件的基本信息 

《系统管理指南:基本管理》中的第 16  章 “管理软件(概述)”

有关本附录中引用的特定命令的详细信息,请参见手册页 

dircmp(1)fssnap(1M)ps(1)truss(1) pkgadd(1M)pkgchk(1M)pkgrm(1M)

有关 Solaris Live Upgrade 的概述 

第 2 章,Solaris Live Upgrade(概述)

有关自定义 JumpStart 的概述 

《Solaris 10 8/07 安装指南:自定义 JumpStart 和高级安装》中的第 2  章 “自定义 JumpStart(概述)”

有关 Solaris Zones 的概述 

《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 16  章 “Solaris Zones 介绍”