跳过导航链接 | |
退出打印视图 | |
在 Oracle Solaris 11.1 中使用映像包管理系统打包和交付软件 Oracle Solaris 11.1 Information Library (简体中文) |
本节显示了将 SVR4 软件包转换为 IPS 软件包的示例,并强调了可能需要特别注意的区域。
要将 SVR4 软件包转换为 IPS 软件包,请遵循本章中上面所介绍的有关在 IPS 中打包任何软件的相同步骤。其中大部分步骤对于 SVR4 到 IPS 软件包的转换都是相同的,因此在本节中不再解释。本节介绍了转换软件包(而非创建新软件包)时的不同步骤。
pkgsend generate 命令的 source 参数可以是 SVR4 软件包。有关支持的源的完整列表,请参见 pkgsend(1) 手册页。当 source 是 SVR4 软件包时,pkgsend generate 将使用该 SVR4 软件包中的 pkgmap(4) 文件,而不是软件包中所交付文件所在的目录。
扫描 prototype 文件时,pkgsend 实用程序同时查找将软件包转换为 IPS 时可能导致问题的项。pkgsend 实用程序将报告那些问题并打印生成的清单。
本节中使用的示例 SVR4 软件包包含以下 pkginfo(4) 文件:
VENDOR=My Software Inc. HOTLINE=Please contact your local service provider PKG=MSFTmypkg ARCH=i386 DESC=A sample SVR4 package of My Sample Package CATEGORY=system NAME=My Sample Package BASEDIR=/ VERSION=11.11,REV=2011.10.17.14.08 CLASSES=none manpage PSTAMP=linn20111017132525 MSFT_DATA=Some extra package metadata
本节中使用的示例 SVR4 软件包包含以下相应的 prototype(4) 文件:
i pkginfo i copyright i postinstall d none opt 0755 root bin d none opt/mysoftware 0755 root bin d none opt/mysoftware/lib 0755 root bin f none opt/mysoftware/lib/mylib.so.1 0644 root bin d none opt/mysoftware/bin 0755 root bin f none opt/mysoftware/bin/mycmd 0755 root bin d none opt/mysoftware/man 0755 root bin d none opt/mysoftware/man/man1 0755 root bin f none opt/mysoftware/man/man1/mycmd.1 0644 root bin
对使用这些文件创建的 SVR4 软件包运行 pkgsend generate 命令可以生成以下 IPS 清单:
$ pkgsend generate ./MSFTmypkg | pkgfmt pkgsend generate: ERROR: script present in MSFTmypkg: postinstall set name=pkg.summary value="My Sample Package" set name=pkg.description value="A sample SVR4 package of My Sample Package" set name=pkg.send.convert.msft-data value="Some extra package metadata" dir path=opt owner=root group=bin mode=0755 dir path=opt/mysoftware owner=root group=bin mode=0755 dir path=opt/mysoftware/bin owner=root group=bin mode=0755 file reloc/opt/mysoftware/bin/mycmd path=opt/mysoftware/bin/mycmd owner=root \ group=bin mode=0755 dir path=opt/mysoftware/lib owner=root group=bin mode=0755 file reloc/opt/mysoftware/lib/mylib.so.1 path=opt/mysoftware/lib/mylib.so.1 \ owner=root group=bin mode=0644 dir path=opt/mysoftware/man owner=root group=bin mode=0755 dir path=opt/mysoftware/man/man1 owner=root group=bin mode=0755 file reloc/opt/mysoftware/man/man1/mycmd.1 \ path=opt/mysoftware/man/man1/mycmd.1 owner=root group=bin mode=0644 legacy pkg=MSFTmypkg arch=i386 category=system \ desc="A sample SVR4 package of My Sample Package" \ hotline="Please contact your local service provider" \ name="My Sample Package" vendor="My Software Inc." \ version=11.11,REV=2011.10.17.14.08 license install/copyright license=MSFTmypkg.copyright
请注意有关 pkgsend generate 输出的以下几点:
pkg.summary 和 pkg.description 属性是根据 pkginfo 文件中的数据自动创建的。
set 操作是根据 pkginfo 文件中的额外参数生成的。set 操作在 pkg.send.convert.* 名称空间下设置。使用 pkgmogrify(1) 转换可将此类属性转换为更合适的属性名称。
legacy 操作是根据 pkginfo 文件中的数据生成的。
生成了 license 操作,指向 SVR4 软件包中所使用的版权文件。
发出了有关无法转换的脚本操作的错误消息。
以下检查显示了 pkgsend generate 的错误消息和非零返回代码:
$ pkgsend generate MSFTmypkg > /dev/null pkgsend generate: ERROR: script present in MSFTmypkg: postinstall $ echo $? 1
SVR4 软件包使用的 postinstall 脚本无法直接转换为 IPS 等效项。必须手动检查该脚本。
软件包中的 postinstall 脚本包含以下内容:
#!/usr/bin/sh catman -M /opt/mysoftware/man
可以使用指向现有 SMF 服务 svc:/application/man-index:default 的 restart_fmri 执行器归档与该脚本相同的结果,如添加需要的任何侧面或执行器中所述。有关执行器的详尽说明,请参见第 7 章。
pkgsend generate 命令还检查是否存在类操作脚本,并生成错误消息来指示应该检查哪些脚本。
在由 SVR4 软件包到 IPS 软件包的所有转换中,需要的功能可以通过使用现有操作类型或 SMF 服务来实现。有关可用操作类型的详细信息,请参见软件包内容:操作。有关 SMF 和软件包操作的信息,请参见第 7 章。
添加软件包元数据和解析相关项的方式与创建并发布软件包中所述相同,因此在本节中不再讨论。对于转换的软件包,软件包创建过程中下一个可能显示其特有问题的步骤是验证步骤。
转换 SVR4 软件包时的一个常见错误源自通过 SVR4 软件包交付的目录与通过 IPS 软件包交付的相同目录中存在不匹配的属性。
在此示例中的 SVR4 软件包中,样例清单中 /opt 的目录操作的属性与系统软件包为该目录定义的属性不同。
目录操作一节说明所有的引用计数操作必须使用相同的属性。当尝试安装目前生成的 mypkg 版本时,出现以下错误:
# pkg install mypkg Creating Plan / pkg install: The requested change to the system attempts to install multiple actions for dir 'opt' with conflicting attributes: 1 package delivers 'dir group=bin mode=0755 owner=root path=opt': pkg://mypublisher/mypkg@1.0,5.11-0:20111017T020042Z 3 packages deliver 'dir group=sys mode=0755 owner=root path=opt': pkg://solaris/developer/build/onbld@0.5.11,5.11-0.175.0.0.0.1.0:20111012T010101Z pkg://solaris/system/core-os@0.5.11,5.11-0.175.0.0.0.1.0:20111012T023456Z These packages may not be installed together. Any non-conflicting set may be, or the packages must be corrected before they can be installed.
要在发布软件包之前(而不是安装时)捕捉到错误,可以对引用系统信息库使用 pkglint(1) 命令,如以下示例所示:
$ pkglint -c ./cache -r file:///scratch/solaris-repo ./mypkg.mf.res Lint engine setup... PHASE ITEMS 4 4292/4292 Starting lint run... ERROR pkglint.dupaction007 path opt is reference-counted but has different attributes across 5 duplicates: group: bin -> mypkg group: sys -> developer/build/onbld system/core-os system/ldoms/ldomsmanager
请注意有关 path opt 在不同软件包中包含不同属性的错误消息。
pkglint 报告的额外 ldomsmanager 软件包位于引用软件包系统信息库中,但没有安装在测试系统中。先前由 pkg install 报告的错误中没有列出 ldomsmanager 软件包,因为该软件包没有安装。
虽然可以在 Oracle Solaris 11 系统上直接安装 SVR4 软件包,但是您应该创建相应的 IPS 软件包。安装 SVR4 软件包是临时的解决方案。
除传统操作中所介绍的 legacy 操作以外,这两个包管理系统间不存在任何链接,并且 SVR4 和 IPS 软件包不会相互引用软件包元数据。
IPS 具有可以确定打包内容是否已正确安装的命令,如 pkg verify。但是,如果其他包管理系统合法安装了软件包或运行了可修改 IPS 软件包所安装的目录或文件的安装脚本,则会导致错误。
IPS 的 pkg fix 和 pkg revert 命令可以覆盖通过 SVR4 软件包和 IPS 软件包交付的文件,可能会导致已打包的应用程序出现故障。
pkg install 等命令通常用于检查重复操作和引用计数操作的常见属性,当来自其他包管理系统的文件发生冲突时,该命令可能无法检测到潜在的错误。
考虑到这些潜在错误以及 IPS 中的完整软件包开发工具链,建议为 Oracle Solaris 11 开发 IPS 软件包而不是 SVR4 软件包。