跳过导航链接 | |
退出打印视图 | |
应用程序包开发者指南 Oracle Solaris 10 1/13 Information Library (简体中文) |
此案例研究描述如何使用 sed 类和过程脚本安装驱动程序。该案例研究还与前面的案例研究(请参见使用过程脚本安装和删除驱动程序)有所不同,因为此软件包由绝对和可重定位的对象组成。
此案例研究展示以下技术:
使用绝对和可重定位的对象生成 prototype 文件。
有关生成 prototype 文件的更多信息,请参见创建 prototype 文件。
使用 postinstall 脚本
有关此脚本的更多信息,请参见编写过程脚本。
使用 preremove 脚本
有关此脚本的更多信息,请参见编写过程脚本。
使用 copyright 文件
有关此文件的更多信息,请参见编写版权信息。
创建包含绝对和可重定位的软件包对象的 prototype 文件。
将会在prototype 文件中详细讨论此内容。
将 sed 类脚本添加到 prototype 文件。
脚本的名称必须是将编辑文件的名称。在本例中,将编辑的文件是 /etc/devlink.tab,因此 sed 脚本被命名为 /etc/devlink.tab。对于 sed 脚本的模式、所有者和组没有要求(在样例 prototype 中由问号表示)。sed 脚本的文件类型必须是 e(表示可编辑)。
设置 CLASSES 参数以包括 sed 类。
创建 sed 类操作脚本 (/etc/devlink.tab)。
创建 postinstall 脚本。
postinstall 脚本需要执行 add_drv 命令以向系统添加设备驱动程序。
创建 preremove 脚本。
preremove 脚本需要执行 rem_drv 命令以在删除软件包之前从系统删除设备驱动程序。
创建 copyright 文件。
copyright 文件包含版权信息的 ASCII 文本。样例文件中所示的信息将在软件包安装期间显示在屏幕上。
PKG=SUNWsst NAME=Simple SCSI Target Driver VERSION=1 CATEGORY=system ARCH=sparc VENDOR=Sun Microsystems BASEDIR=/opt CLASSES=sed
图 5-1 分层软件包目录结构
软件包对象的安装位置与上图 pkg 目录中的位置相同。驱动程序模块(sst 和 sst.conf)安装在 /usr/kernel/drv 中,而头文件安装在 /usr/include/sys/scsi/targets 中。sst、sst.conf 和 sst_def.h 文件是绝对对象。测试程序 sstest.c 及其目录 SUNWsst 是可重定位对象;它们的安装位置由 BASEDIR 参数设置。
软件包的其余组件(所有控制文件)安装在开发计算机上软件包的顶层目录中,但 sed 类脚本除外。它根据所修改的文件命名为 devlink.tab 并安装到 etc,该目录包含实际的 devlink.tab 文件。
find usr SUNWsst -print | pkgproto > prototype
上述命令的输出如下所示:
d none usr 0775 pms mts d none usr/include 0775 pms mts d none usr/include/sys 0775 pms mts d none usr/include/sys/scsi 0775 pms mts d none usr/include/sys/scsi/targets 0775 pms mts f none usr/include/sys/scsi/targets/sst_def.h 0444 pms mts d none usr/kernel 0775 pms mts d none usr/kernel/drv 0775 pms mts f none usr/kernel/drv/sst 0664 pms mts f none usr/kernel/drv/sst.conf 0444 pms mts d none SUNWsst 0775 pms mts f none SUNWsst/sstest.c 0664 pms mts
此 prototype 文件并不是完整文件。要完成此文件,您需要进行以下修改:
插入控制文件(文件类型 i)条目,因为它们与其他软件包对象的格式不同。
删除目标系统上已存在的目录的条目。
更改每个条目的访问权限和拥有权。
在绝对软件包对象之前添加一个斜线。
以下是最终的 prototype 文件:
i pkginfo i postinstall i preremove i copyright e sed /etc/devlink.tab ? ? ? f none /usr/include/sys/scsi/targets/sst_def.h 0644 bin bin f none /usr/kernel/drv/sst 0755 root sys f none /usr/kernel/drv/sst.conf 0644 root sys d none SUNWsst 0775 root sys f none SUNWsst/sstest.c 0664 root sys
sed 脚本条目中的问号表明不应更改安装计算机上现有文件的访问权限和拥有权。
在驱动程序示例中,sed 类脚本用于向 /etc/devlink.tab 文件中添加一个驱动程序条目。devlinks 命令使用此文件创建从 /dev 到 /devices 的符号链接。以下是 sed 脚本:
# sed class script to modify /etc/devlink.tab !install /name=sst;/d $i\ type=ddi_pseudo;name=sst;minor=character rsst\\A1 !remove /name=sst;/d
pkgrm 命令不运行该脚本的删除部分。您可能需要向 preremove 脚本中添加一行,以便直接运行 sed 从 /etc/devlink.tab 文件删除条目。
在此示例中,该脚本所需要做的只是运行 add_drv 命令。
# Postinstallation script for SUNWsst # This does not apply to a client. if [$PKG_INSTALL_ROOT = "/" -o -z $PKG_INSTALL_ROOT]; then SAVEBASE=$BASEDIR BASEDIR=””; export BASEDIR /usr/sbin/add_drv sst STATUS=$? BASEDIR=$SAVEBASE; export BASEDIR if [ $STATUS -eq 0 ] then exit 20 else exit 2 fi else echo "This cannot be installed onto a client." exit 2 fi
add_drv 命令使用 BASEDIR 参数,因此该脚本必须在运行此命令之前取消设置 BASEDIR,并在以后恢复它。
add_drv 命令的操作之一是运行 devlinks,它使用由 sed 类脚本放置在 /etc/devlink.tab 中的条目为驱动程序创建 /dev 条目。
postinstall 脚本的退出代码作用很重要。退出代码 20 告诉 pkgadd 命令告知用户重新引导系统(安装驱动程序后必须这样做),而退出代码 2 则告诉 pkgadd 命令告知用户安装部分失败。
在此驱动程序示例中,该脚本删除 /dev 中的链接并对驱动程序运行 rem_drv 命令。
# Pre removal script for the sst driver echo “Removing /dev entries” /usr/bin/rm -f /dev/rsst* echo “Deinstalling driver from the kernel” SAVEBASE=$BASEDIR BASEDIR=””; export BASEDIR /usr/sbin/rem_drv sst BASEDIR=$SAVEBASE; export BASEDIR exit
该脚本删除 /dev 条目本身; /devices 条目由 rem_drv 命令删除。
以下是一个包含版权声明文本的简单 ASCII 文件。该声明在软件包安装开始时显示,显示时与此文件中的形式完全相同。
Copyright (c) 1999 Drivers-R-Us, Inc. 10 Device Drive, Thebus, IO 80586 All rights reserved. This product and related documentation is protected by copyright and distributed under licenses restricting its use, copying, distribution and decompilation. No part of this product or related documentation may be reproduced in any form by any means without prior written authorization of Drivers-R-Us and its licensors, if any.