アプリケーションパッケージ開発者ガイド

第 5 章 パッケージ作成のケーススタディー

この章では、パッケージ作成のさまざまなシナリオを、ケーススタディーとして示します。この章のケーススタディーでは、オブジェクトを条件に応じてインストールしたり、作成するファイル数を実行時に決定したり、パッケージのインストール時および削除時に既存のデータファイルを変更する例を取り上げます。

各ケーススタディーでは、最初に説明を示し、次にパッケージ作成に使用するテクニックのリストと、それらのテクニックを使用する際のアプローチにについて説明したあと、ケーススタディーに関連するサンプルのファイルとスクリプトを示します。

この章で説明するケーススタディーは次のとおりです。

管理者による入力の要求

このケーススタディーで使用するパッケージには、3 種類のオブジェクトがあります。インストールするオブジェクトの種類と、インストール先マシン内でオブジェクトを配置する場所は、管理者が選択できます。

手法

このケーススタディーでは、次の手法の実例を示します。

アプローチ

このケーススタディーで選択的インストールを設定するには、次の作業を完了する必要があります。

ケーススタディーで使用するファイル

pkginfo ファイル

PKG=ncmp
NAME=NCMP Utilities
CATEGORY=application, tools
BASEDIR=/
ARCH=SPARC
VERSION=RELEASE 1.0, Issue 1.0
CLASSES=""
NCMPBIN=/bin
NCMPMAN=/usr/man
EMACS=/usr/emacs

prototype ファイル

i pkginfo
i request
x bin $NCMPBIN 0755 root other
f bin $NCMPBIN/dired=/usr/ncmp/bin/dired 0755 root other
f bin $NCMPBIN/less=/usr/ncmp/bin/less 0755 root other
f bin $NCMPBIN/ttype=/usr/ncmp/bin/ttype 0755 root other
f emacs $NCMPBIN/emacs=/usr/ncmp/bin/emacs 0755 root other
x emacs $EMACS 0755 root other
f emacs $EMACS/ansii=/usr/ncmp/lib/emacs/macros/ansii 0644 root other
f emacs $EMACS/box=/usr/ncmp/lib/emacs/macros/box 0644 root other
f emacs $EMACS/crypt=/usr/ncmp/lib/emacs/macros/crypt 0644 root other
f emacs $EMACS/draw=/usr/ncmp/lib/emacs/macros/draw 0644 root other
f emacs $EMACS/mail=/usr/ncmp/lib/emacs/macros/mail 0644 root other
f emacs $NCMPMAN/man1/emacs.1=/usr/ncmp/man/man1/emacs.1 0644 root other
d man $NCMPMAN 0755 root other
d man $NCMPMAN/man1 0755 root other
f man $NCMPMAN/man1/dired.1=/usr/ncmp/man/man1/dired.1 0644 root other
f man $NCMPMAN/man1/ttype.1=/usr/ncmp/man/man1/ttype.1 0644 root other
f man $NCMPMAN/man1/less.1=/usr/ncmp/man/man1/less.1 0644 inixmr other

request スクリプト

trap 'exit 3' 15
# determine if and where general executables should be placed
ans=`ckyorn -d y \
-p "Should executables included in this package be installed"
` || exit $?
if [ "$ans" = y ]
then
   CLASSES="$CLASSES bin"
   NCMPBIN=`ckpath -d /usr/ncmp/bin -aoy \
   -p "Where should executables be installed"
   ` || exit $?
fi
# determine if emacs editor should be installed, and if it should
# where should the associated macros be placed
ans=`ckyorn -d y \
-p "Should emacs editor included in this package be installed"
` || exit $?
if [ "$ans" = y ]
then
   CLASSES="$CLASSES emacs"
   EMACS=`ckpath -d /usr/ncmp/lib/emacs -aoy \
   -p "Where should emacs macros be installed"
   ` || exit $?
fi

request スクリプトは、ファイルシステム上にファイルを残さずに終了できます。Solaris バージョン 2.5 よりも前のバージョンおよび互換バージョンでインストールを行う場合、checkinstall スクリプトが使用されていない可能性があるので、request スクリプトを使用してファイルシステムのテストを行い、インストールの成功を確認することをお勧めします。request スクリプトがコード 1 で終了すると、インストールはクリーンに終了します。

これらのファイル例では、パラメータ型パスを使用して複数のベースディレクトリを確立する方法が示されています。しかし、pkgadd コマンドによって管理および検証される BASEDIR パラメータを使用する必要が生じる場合もあります。複数のベースディレクトリを使用する際には、同じプラットフォームに複数のバージョンやアーキテクチャーをインストールする場合に備えて、特別な注意を払う必要があります。

インストール時のファイル作成と削除時のファイル保存

このケーススタディーでは、インストール時にデータベースファイルを作成し、パッケージの削除時にデータベースのコピーを保存します。

手法

このケーススタディーでは、次の手法の実例を示します。

アプローチ

このケーススタディーに従って、インストール時にデータベースファイルを作成し、削除時にコピーを保存するには、次の作業を完了する必要があります。

ケーススタディーで使用するファイル

pkginfo ファイル

PKG=krazy
NAME=KrAzY Applications
CATEGORY=applications
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1
CLASSES=none cfgdata admin

prototype ファイル

i pkginfo
i request
i i.admin
i r.cfgdata
d none bin 555 root sys
f none bin/process1 555 root other
f none bin/process2 555 root other
f none bin/process3 555 root other
f admin bin/config 500 root sys
d admin cfg 555 root sys
f admin cfg/datafile1 444 root sys
f admin cfg/datafile2 444 root sys
f admin cfg/datafile3 444 root sys
f admin cfg/datafile4 444 root sys
d cfgdata data 555 root sys

space ファイル

# extra space required by config data which is
# dynamically loaded onto the system
data 500 1

i.admin クラスアクションスクリプト

# PKGINST parameter provided by installation service
# BASEDIR parameter provided by installation service
while read src dest
do
   cp $src $dest || exit 2
done
# if this is the last time this script will be executed
# during the installation, do additional processing here.
if [ "$1" = ENDOFCLASS ]
then
# our config process will create a data file based on any changes
# made by installing files in this class; make sure the data file
# is in class `cfgdata' so special rules can apply to it during
# package removal.
   installf -c cfgdata $PKGINST $BASEDIR/data/config.data f 444 root
   sys || exit 2
   $BASEDIR/bin/config > $BASEDIR/data/config.data || exit 2
   installf -f -c cfgdata $PKGINST || exit 2
fi
exit 0

ここでは、クラスアクションスクリプトで installf が使用される珍しい例が示されています。space ファイルを使用して、対象のファイルシステム上でスペースを予約しているため、この新しいファイルは、pkgmap ファイルに含まれていない場合でも、安全に追加されます。

r.cfgdata 削除スクリプト

# the product manager for this package has suggested that
# the configuration data is so valuable that it should be
# backed up to $PKGSAV before it is removed!
while read path
do
# path names appear in reverse lexical order.
   mv $path $PKGSAV || exit 2
   rm -f $path || exit 2
done
exit 0

パッケージの互換性と依存関係の定義

このケーススタディーのパッケージでは、パッケージの互換性と依存関係を定義したり、インストール中に著作権に関するメッセージを表示したりするために、省略可能な情報ファイルを使用しています。

手法

このケーススタディーでは、次の手法の実例を示します。

これらのファイルについては、「情報ファイルの作成」を参照してください。

アプローチ

この説明での必要条件を満たすには、次の作業を行う必要があります。

ケーススタディーで使用するファイル

pkginfo ファイル

PKG=case3
NAME=Case Study #3
CATEGORY=application
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 3.0
CLASSES=none

copyright ファイル

Copyright (c) 1999 company_name
All Rights Reserved.
THIS PACKAGE CONTAINS UNPUBLISHED PROPRIETARY SOURCE CODE OF
company_name.
The copyright notice above does not evidence any
actual or intended publication of such source code

compver ファイル

Version 3.0
Version 2.3
Version 2.2
Version 2.1
Version 2.1.1
Version 2.1.3
Version 1.7

depend ファイル

P acu Advanced C Utilities
Issue 4 Version 1
P cc C Programming Language
Issue 4 Version 1
P dfm Directory and File Management Utilities
P ed Editing Utilities
P esg Extended Software Generation Utilities
Issue 4 Version 1
P graph Graphics Utilities
P rfs Remote File Sharing Utilities
Issue 1 Version 1
P rx Remote Execution Utilities
P sgs Software Generation Utilities
Issue 4 Version 1
P shell Shell Programming Utilities
P sys System Header Files
Release 3.1

標準クラスとクラスアクションスクリプトを使用したファイルの変更

このケーススタディーでは、標準クラスとクラスアクションスクリプトを使用して、パッケージのインストール中に既存のファイルを変更します。ここでは、3 種類の変更方法のうちの 1 つを使用します。ほかの 2 つの方法については、sed クラスと postinstall スクリプトを使用したファイルの変更」およびbuild クラスを使用したファイルの変更」を参照してください。変更する対象のファイルは、/etc/inittab です。

手法

このケーススタディーでは、インストールおよび削除クラスアクションスクリプトの使用方法を説明します。詳細については、「クラスアクションスクリプトの書き込み」を参照してください。

アプローチ

クラスおよびクラスアクションスクリプトを使用して、インストール中に /etc/inittab を変更するには、次の作業を完了する必要があります。

このケーススタディーは、次のケーススタディーよりも複雑です。sed クラスと postinstall スクリプトを使用したファイルの変更」を参照してください。2 つではなく 3 つのファイルを作成する必要があり、配信された /etc/inittab ファイルは実際には、挿入するエントリの断片を含んだ可変部分に過ぎません。pkgadd コマンドが i.inittab ファイルに渡すファイルを必要としなければ、これは i.inittab ファイルに組み込まれていたかも知れません。また、削除の手順も別個のファイル (r.inittab) に置く必要があります。この方法はうまく行きますが、複数のファイルをインストールする必要のある非常に複雑なケースに最も向いています。「インストール時の crontab ファイルの変更」を参照してください。

sed クラスと postinstall スクリプトを使用したファイルの変更」で使用されている sed プログラムは、inittab エントリの最後にあるコメントがパッケージのインスタンスに基づいているため、複数のパッケージのインスタンスをサポートします。build クラスを使用したファイルの変更」のケーススタディーでは、インストール中に /etc/inittab を編集するための、より効率的なアプローチが紹介されています。

ケーススタディーで使用するファイル

pkginfo ファイル

PKG=case5
NAME=Case Study #5
CATEGORY=applications
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1d05
CLASSES=inittab

prototype ファイル

i pkginfo
i i.inittab
i r.inittab
e inittab /etc/inittab ? ? ?

i.inittab インストールクラスアクションスクリプト

# PKGINST parameter provided by installation service
while read src dest
do
# remove all entries from the table that
# associated with this PKGINST
sed -e "/^[^:]*:[^:]*:[^:]*:[^#]*#$PKGINST$/d" $dest >
/tmp/$$itab ||
exit 2
sed -e "s/$/#$PKGINST" $src >> /tmp/$$itab ||
exit 2
mv /tmp/$$itab $dest ||
exit 2
done
if [ "$1" = ENDOFCLASS ]
then
/sbin/init q ||
exit 2
fi
exit 0

r.inittab 削除クラスアクションスクリプト

# PKGINST parameter provided by installation service
while read src dest
do
# remove all entries from the table that
# are associated with this PKGINST
sed -e "/^[^:]*:[^:]*:[^:]*:[^#]*#$PKGINST$/d" $dest >
/tmp/$$itab ||
exit 2
mv /tmp/$$itab $dest ||
exit 2
done
/sbin/init q ||
exit 2
exit 0

inittab ファイル

rb:023456:wait:/usr/robot/bin/setup

sed クラスと postinstall スクリプトを使用したファイルの変更

このケーススタディーでは、パッケージのインストール中に、インストール先マシンに存在しているファイルを変更します。ここでは、3 種類の変更方法のうちの 1 つを使用します。ほかの 2 つの方法については、「標準クラスとクラスアクションスクリプトを使用したファイルの変更」およびbuild クラスを使用したファイルの変更」を参照してください。変更する対象のファイルは、/etc/inittab です。

手法

このケーススタディーでは、次の手法の実例を示します。

アプローチ

インストール時に /etc/inittab を変更するには、sed クラスを使用して、次の作業を完了する必要があります。

この方法でインストール中に /etc/inittab を編集する場合、欠点が 1 つあります。それは、init q コマンドを実行するだけのために、完全なスクリプト (postinstall スクリプト) を提供する必要があるという点です。

ケーススタディーで使用するファイル

pkginfo ファイル

PKG=case4
NAME=Case Study #4
CATEGORY=applications
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1d05
CLASSES=sed

prototype ファイル

i pkginfo
i postinstall
e sed /etc/inittab ? ? ?

sed クラスアクションスクリプト (/etc/inittab)

!remove
# remove all entries from the table that are associated
# with this package, though not necessarily just
# with this package instance
/^[^:]*:[^:]*:[^:]*:[^#]*#ROBOT$/d
!install
# remove any previous entry added to the table
# for this particular change
/^[^:]*:[^:]*:[^:]*:[^#]*#ROBOT$/d
# add the needed entry at the end of the table;
# sed(1) does not properly interpret the '$a'
# construct if you previously deleted the last
# line, so the command
# $a\
# rb:023456:wait:/usr/robot/bin/setup #ROBOT
# will not work here if the file already contained
# the modification. Instead, you will settle for
# inserting the entry before the last line!
$i\
rb:023456:wait:/usr/robot/bin/setup #ROBOT

postinstall スクリプト

# make init re-read inittab
/sbin/init q ||
exit 2
exit 0

build クラスを使用したファイルの変更

このケーススタディーでは、パッケージのインストール中に、インストール先マシンに存在しているファイルを変更します。ここでは、3 種類の変更方法のうちの 1 つを使用します。ほかの 2 つの方法については、「標準クラスとクラスアクションスクリプトを使用したファイルの変更」およびsed クラスと postinstall スクリプトを使用したファイルの変更」を参照してください。変更する対象のファイルは、/etc/inittab です。

手法

このケーススタディーでは、build クラスの使用方法を説明します。build クラスの詳細については、build クラススクリプト」を参照してください。

アプローチ

このアプローチでは、/etc/inittab を変更するために build クラスを使用します。build クラススクリプトはシェルスクリプトとして実行され、実行されているファイルの新しいバージョンを出力します。つまり、このパッケージに付属するデータファイル /etc/inittab が実行され、その実行の出力が /etc/inittab になります。

build クラススクリプトは、パッケージのインストールおよび削除の際に実行されます。ファイルがインストール時に実行される場合には、引数 install がファイルに渡されます。サンプルの build クラススクリプトでは、この引数をテストすることで、インストールのアクションが定義されています。

build クラスを使用して /etc/inittab を編集するには、次の作業を完了する必要があります。

この解決方法は、「標準クラスとクラスアクションスクリプトを使用したファイルの変更」およびsed クラスと postinstall スクリプトを使用したファイルの変更」のケーススタディーで説明した欠点に対応しています。短いファイルがひとつ (pkginfo および prototype ファイル以外に) 必要になるだけです。PKGINST パラメータを使用することにより、このファイルはパッケージの複数のインスタンスを処理することができ、init q コマンドを build クラススクリプトから実行することにより、postinstall スクリプトが不要になります。

ケーススタディーで使用するファイル

pkginfo ファイル

PKG=case6
NAME=Case Study #6
CATEGORY=applications
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1d05
CLASSES=build

prototype ファイル

i pkginfo
e build /etc/inittab ? ? ?

構築ファイル

# PKGINST parameter provided by installation service
# remove all entries from the existing table that
# are associated with this PKGINST
sed -e "/^[^:]*:[^:]*:[^:]*:[^#]*#$PKGINST$/d" /etc/inittab ||
exit 2
if [ "$1" = install ]
then
# add the following entry to the table
echo "rb:023456:wait:/usr/robot/bin/setup #$PKGINST" ||
exit 2
fi
/sbin/init q ||
exit 2
exit 0

インストール時の crontab ファイルの変更

このケーススタディーでは、パッケージのインストール中に crontab ファイルを変更します。

手法

このケーススタディーでは、次の手法の実例を示します。

アプローチ

インストール中に複数のファイルを編集する最も効率的な方法は、クラスを定義し、クラスアクションスクリプトを作成することです。build クラスによるアプローチを使用した場合は、編集する crontab ファイルごとに 1 つの build クラススクリプトを作成する必要があります。cron クラスを定義する方法は、より汎用性のあるアプローチとなります。このアプローチで crontab ファイルを編集するには、次の作業を行う必要があります。

ケーススタディーで使用するファイル

次に示す i.cron および r.cron スクリプトは、スーパーユーザーによって実行されます。ほかのユーザーの crontab ファイルをスーパーユーザーとして編集すると、予期しない結果が生じる可能性があります。必要な場合は、各スクリプトで次に示すエントリを変更してください。

crontab $user < /tmp/$$crontab ||

から

su $user -c "crontab /tmp/$$crontab" ||

pkginfo コマンド

PKG=case7
NAME=Case Study #7
CATEGORY=application
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1.0
CLASSES=cron

prototype ファイル

i pkginfo
i i.cron
i r.cron
e cron /var/spool/cron/crontabs/root ? ? ?
e cron /var/spool/cron/crontabs/sys ? ? ?

i.cron インストールクラスアクションスクリプト

# PKGINST parameter provided by installation service
while read src dest
do
user=`basename $dest` ||
exit 2
(crontab -l $user |
sed -e "/#$PKGINST$/d" > /tmp/$$crontab) ||
exit 2
sed -e "s/$/#$PKGINST/" $src >> /tmp/$$crontab ||
exit 2
crontab $user < /tmp/$$crontab ||
exit 2
rm -f /tmp/$$crontab
done
exit 0

r.cron 削除クラスアクションスクリプト

# PKGINST parameter provided by installation service
while read path
do
user=`basename $path` ||
exit 2
(crontab -l $user |
sed -e "/#$PKGINST$/d" > /tmp/$$crontab) ||
exit 2
crontab $user < /tmp/$$crontab ||
exit 2
rm -f /tmp/$$crontab
done
exit 

crontab ファイル 1

41,1,21 * * * * /usr/lib/uucp/uudemon.hour > /dev/null
45 23 * * * ulimit 5000; /usr/bin/su uucp -c
"/usr/lib/uucp/uudemon.cleanup" >
/dev/null 2>&1
11,31,51 * * * * /usr/lib/uucp/uudemon.poll > /dev/null

crontab ファイル 2

0 * * * 0-6 /usr/lib/sa/sa1
20,40 8-17 * * 1-5 /usr/lib/sa/sa1
5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A

注 –

複数のファイルを編集することにより、ファイルの合計サイズが 10K を超えて増加する場合は、pkgadd コマンドがこの増加に対応できるように、space ファイルを作成してください。space ファイルについては、「ターゲットシステムでの追加領域の予約」を参照してください。


手続きスクリプトによるドライバのインストールと削除

このパッケージでは、ドライバをインストールします。

手法

このケーススタディーでは、次の手法の実例を示します。

これらのスクリプトの詳細については、「手続きスクリプトの書き込み」を参照してください。

アプローチ

ケーススタディーで使用するファイル

pkginfo ファイル

PKG=bufdev
NAME=Buffer Device
CATEGORY=system
BASEDIR=/
ARCH=INTEL
VERSION=Software Issue #19
CLASSES=none

prototype ファイル

インストール時にドライバをインストールするには、ドライバのオブジェクトおよび構成ファイルを prototype ファイルに含める必要があります。

この例では、ドライバの実行モジュールの名前は buffer です。add_drv コマンドは、このファイルに対して実行されます。カーネルは、構成ファイル buffer.conf をドライバの構成に利用します。

i pkginfo
i request
i postinstall
i preremove
f none $KERNDIR/buffer 444 root root
f none $KERNDIR/buffer.conf 444 root root

この例の prototype ファイルを見て、次の点に注意してください。

request スクリプト

trap 'exit 3' 15
# determine where driver object should be placed; location
# must be an absolute path name that is an existing directory
KERNDIR=`ckpath -aoy -d /kernel/drv -p \
“Where do you want the driver object installed”` || exit $?

# make parameters available to installation service, and
# so to any other packaging scripts
cat >$1 <<!

CLASSES='$CLASSES'
KERNDIR='$KERNDIR'
!
exit 0

postinstall スクリプト

# KERNDIR parameter provided by `request' script
err_code=1                    # an error is considered fatal
# Load the module into the system
cd $KERNDIR
add_drv -m '* 0666 root sys' buffer || exit $err_code
# Create a /dev entry for the character node
installf $PKGINST /dev/buffer0=/devices/eisa/buffer*:0 s
installf -f $PKGINST

preremove スクリプト

err_code=1                    # an error is considered fatal
# Unload the driver
rem_drv buffer || exit $err_code
# remove /dev file
removef $PKGINST /dev/buffer0 ; rm /dev/buffer0
removef -f $PKGINST

sed クラスと手続きスクリプトを使用したドライバのインストール

このケーススタディーでは、sed クラスと手続きスクリプトを使用してドライバをインストールする方法を説明します。このパッケージは絶対オブジェクトと再配置可能オブジェクトの両方から構成されるため、この方法は前のケーススタディー (「手続きスクリプトによるドライバのインストールと削除」を参照) とは異なります。

手法

このケーススタディーでは、次の手法の実例を示します。

アプローチ

ケーススタディーで使用するファイル

pkginfo ファイル

PKG=SUNWsst
NAME=Simple SCSI Target Driver
VERSION=1
CATEGORY=system
ARCH=sparc
VENDOR=Sun Microsystems
BASEDIR=/opt
CLASSES=sed

prototype ファイル

たとえばこのケーススタディーでは、パッケージオブジェクトについて、次の図に示す階層型レイアウトを使用しています。

図 5–1 パッケージの階層型ディレクトリ構造

この図については次に説明します。

パッケージオブジェクトは、上に示した pkg ディレクトリ内での場所と同じ場所にインストールされます。ドライバモジュール (sst および sst.conf) は /usr/kernel/drv にインストールされ、インクルードファイルは /usr/include/sys/scsi/targets にインストールされます。sstsst.conf、および sst_def.h ファイルは絶対オブジェクトです。テストプログラム sstest.c とそのディレクトリ SUNWsst は再配置可能オブジェクトです。それらのインストール場所は BASEDIR パラメータによって設定されます。

パッケージの残りのコンポーネント (すべての制御ファイル) は、開発マシン上でのパッケージの最上位ディレクトリにインストールされますが、sed クラススクリプトだけは例外です。このクラススクリプトは、それが変更するファイルにならって devlink.tab と呼ばれ、etc にインストールされます。このディレクトリには、実際の devlink.tab ファイルが格納されています。

pkg ディレクトリから pkgproto コマンドを次のように実行します。


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 ファイルはまだ完成していません。このファイルを完成するには、次の修正を加える必要があります。

最終的な 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)

ドライバの例では、sed クラススクリプトはドライバのエントリをファイル /etc/devlink.tab に追加するために使用されています。このファイルは、/dev から /devices へのシンボリックリンクを作成するために、devlinks コマンドによって使用されます。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 コマンドは、このスクリプトの削除に関する部分を実行しません。/etc/devlink.tab ファイルからエントリを削除するには、preremove スクリプトに sed を直接実行するための行を追加する必要があります。

postinstall インストールスクリプト

この例では、このスクリプトは 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 コマンドの動作の 1 つは、devlinks を実行することです。これは、sed クラススクリプトが /etc/devlink.tab に挿入したエントリを使用して、ドライバの /dev エントリを作成します。

postinstall スクリプトの終了コードは重要です。終了コード 20pkgadd コマンドに対して、ユーザーにシステムの再起動 (ドライバのインストール後に必要) を要求するように指示します。終了コード 2pkgadd コマンドに対して、インストールが部分的に失敗したことをユーザーに知らせるように指示します。

preremove 削除スクリプト

このドライバの例では、このスクリプトは /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 コマンドによって削除されます。

copyright ファイル

これは、著作権表示のテキストを格納した単純な 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.