2018年以降の記事はGitHub Pagesに移行しました

Solarisのパッケージを作ってみる もう少し学んだ版

前回までのあらすじ

もう少し調べてみた。

参考サイト

必要なもの

パッケージコンテンツ
ディレクトリ含めたソース一式。ざっくりソース一式とか言ってるのでここは作るものによってもう少しブレークダウンする必要がある
pkginfoファイル
パッケージ名等のパラメータを定義するファイル。コマンドではなくファイル。
Prototypeファイル
パッケージのコンポーネント一覧を記載するファイル

場合によって用意するもの(必須ではない)

compverファイル
パッケージと互換性がある以前のバージョンのパッケージの定義ファイル
dependファイル
パッケージと関連があるパッケージの定義ファイル
spaceファイル
インストールに必要なディスク容量の定義ファイル
copyrightファイル
インストール時に表示される著作権メッセージの定義ファイル

パッケージコンテンツの作成

作成ディレクトリと内訳。

$ pwd
/home/kk_Ataka/pkgroot/

MYAPpkg┳bin┳proccess
    ┃  ┗start
    ┣lib━common.lib
    ┗etc━etcFile

これを/直下にインストールしたい。

pkginfoファイル作成

/にインストールしたいので、BASEDIRが/でいいのか?

PKG="MYAPpkg"
NAME="MyApplyPackage"
ARCH="sparc"
VERSION="release 1.0 /svn revision r222"
CATEGORY="application"
DESC="This is my test packages."
VENDOR="MYAPPLY"
BASEDIR="/"
pkginfoファイル書式
PKG 必須 32文字以内 パッケージの省略名 英数字で構成、頭に数字は× 予約語(install, new等)は使用できない。最初の4文字は社名などがお勧め
NAME 必須 256文字以内 パッケージの完全名 英数字で構成 必要なタイミング、インストールするパーティション等を明瞭に記載する*1
ATCH 必須 16文字以内 アーキテクチャ 複数対応している場合はカンマ区切り
VERSION 必須 256文字以内 バージョン 先頭に(は×
CATEGORY 必須 16文字以内 カテゴリ 英数字で構成 最低でもsystemかapplicationには属する 複数に属している場合はカンマ区切り
DESC 必須ではない ? パッケージの説明。description
VENDOR 必須ではない ? 社名など
BASEDIR 必須ではない ? ファイルのデフォルトの位置
PSTAMP 必須ではない ? プロダクションのスタンプ。pkgmapで使用されるらしい。デフォルト値は「マシン名YYYYMMDDHHMISS」

Prototypeファイル作成

前回はviでパッケージにしたいパスをゴリゴリ書いてPrototypeファイルに変換したが、Prototype DIRで指定したDIRの下のファイルをPrototypeファイルのフォーマットにしてくれた。

$ pkgproto ./MYAPpkg/
d none MYAPpkg 0755 kk_Ataka users
d none MYAPpkg/bin 0755 kk_Ataka users
f none MYAPpkg/bin/proccess 0644 kk_Ataka users
f none MYAPpkg/bin/testbin 0644 kk_Ataka users
d none MYAPpkg/lib 0755 kk_Ataka users
f none MYAPpkg/lib/lib.lib 0644 kk_Ataka users
d none MYAPpkg/etc 0755 kk_Ataka users
f none MYAPpkg/etc/etcfile 0644 kk_Ataka users

これをリダイレクトさせてPrototypeファイルを作成する。

$ pkgproto ./MYAPpkg/ >> Prototype

作成したPrototypeファイルを微調整。pkginfoファイルを読み込むようにするためファイルの先頭に以下を記述する。

i pkginfo
Prototypeファイル書式

上の生成されたファイルを見る限り、かっこのものはなくてもよさげ

(part) ftype class path (major) (minor) mode owner group
part パッケージ オブジェクトを細かくグループ化できる、省略可能な数値フィールドです。デフォルト値は part 1 です。…らしい。
ftype オブジェクトの種類を指定するフィールド(後述)
class オブジェクトが所属するインストールクラス
path パッケージコンテンツのインストール場所を示すパス(後述)
major ブロック特殊デバイスまたは文字特殊デバイスのためのメジャーデバイス番号です。…らしい。
minor ブロック特殊デバイスまたは文字特殊デバイスのためのマイナーデバイス番号です。…らしい。
mode オブジェクトの実行権限を指定するフィールド
owner オブジェクトの所有者
group オブジェクトが所属するグループ
ftype

fとdが主に使用する事になるかな。

f 実行ファイル等
d ディレクトリ
l リンクファイル
s シンボリックリンク
i 情報ファイル・インストールスクリプト
e インストール・削除時に編集するファイル
v ログファイル等の揮発性ファイル
x このパッケージでのみアクセスできる排他的なディレクトリ
p 名前付きパイプ
c 文字特殊デバイス
b ブロック特殊デバイス
path

絶対パス指定と相対パス指定があり、相対パス指定はさらに集合的再配置と個別再配置にわかれる。今回はBASEDIRを指定しているから集合的再配置ってやつだろうか。

絶対パス Prototypeファイル内に絶対パスで指定 再配置する事はできない pkginfoファイルのBASEDIRは無視される?
集合的再配置 Prototypeファイル内に相対パスで指定 相対パス+pkginfoのBASEDIRを元にインストール?
個別再配置 Prototypeファイル内に相対パスで指定 そのパスの中にインストール変数を指定し、requestスクリプトというものを作成 インストール時に対話的にパスを決定する?

パッケージの構築

pkginfoファイルとPrototypeファイルを作成したため、構成はこんな感じになった。

$ pwd
/home/kk_Ataka/pkgroot/

MYAPpkg┳bin┳proccess
    ┃  ┗start
    ┣lib━common.lib
    ┗etc━etcFile
Prototype
pkginfo
package━

同じパスでパッケージ作ろうとすると警告が出たので、パッケージ保存用にpackageディレクトリ作成。そしてpackageにパッケージ作成。

$ pwd
/home/kk_Ataka/pkgroot/
$ pkgmk -o -r . -d ./package
## prototype ファイルから pkgmap を作成中です。
## pkginfo ファイルを処理中です。
    警告: パラメータ <PSTAMP> の値は "XXXXXXXX20110914163337" に設定されます。
    警告: パラメータ <CLASSES> の値は "none" に設定されます。
## pkgmap の 8 個の項目をボリューム単位で分割しようとしています。
第  1 部-- 37 ブロック, 23 エントリ
## 1 部をパッケージ処理中です。
/home/kk_Ataka/pkgroot/package/MYAPpkg/pkgmap
/home/kk_Ataka/pkgroot/package/MYAPpkg/pkginfo
/home/kk_Ataka/pkgroot/package/MYAPpkg/reloc/MYAPpkg/bin/process
/home/kk_Ataka/pkgroot/package/MYAPpkg/reloc/MYAPpkg/bin/start
/home/kk_Ataka/pkgroot/package/MYAPpkg/reloc/MYAPpkg/etc/etcFile
/home/kk_Ataka/pkgroot/package/MYAPpkg/reloc/MYAPpkg/lib/common.lib
## 制御スクリプトの妥当性検査中です。
## パッケージ処理は完了しました。

パッケージを作るとこうなる。

$ pwd
/home/kk_Ataka/pkgroot/

MYAPpkg┳bin┳proccess
    ┃  ┗start
    ┣lib━common.lib
    ┗etc━etcFile
Prototype
pkginfo
package━MYAPpkg┳pkginfo
        ┣pkgmap
        ┗reloc━MYAPpkg┳bin┳proccess
                ┃  ┗start
                ┣lib━common.lib
                ┗etc━etcFile

最後にできたパッケージをひとつに固める。

$ pwd
/home/kk_Ataka/pkgroot/

$ pkgtrans ./package MYAPpkg.pkg

The following packages are available:
  1  MYAPpkg     MyApplyPackage
                 (sparc) release 1.0 /svn revision r222

Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]:
Transferring <MYAPpkg> package instance

まだよくわかっていないが、第一引数には作成したパッケージのあるディレクトリ(package)を指定してやらないといけない。第二引数は相対パスにすると第一引数で指定したパス(package)からの相対になる。*2

パッケージインストール、アンインストール

$ pkgadd -d package/MYAPpkg.pkg
  • d をつけないと/var/spool/pkgの下を見に行く。
$ pkgrm MYAPpkg

pkginfoファイルのPKGで定義した名称で選択。探す場合はpkginfoコマンドから。

以下、コマンド。

pkgproto(コマンド)

Prototypeファイルを作成するコマンド。(まだよくわかってない)

pkgmk(コマンド)
  • pkgmk -o

パッケージに上書き。

  • pkgmk -d DEVICE

指定したDEVICE(パスでもいい)にパッケージが作成される。

  • pkgmk -r ROOTPATH

パッケージのルートパス指定?

pkginfo(コマンド)
  • pkginfo -i

現在インストールされているパッケージ情報を表示する

application SMCsvn1612                       subversion
system      TESTPKG                          This is a Test Package.
  • pkginfo -l PKG

指定したパッケージの内容を表示する。必須項目しか記載しなかったTESTPKGはこんな感じ。

$ pkginfo -l TESTPKG
   PKGINST:  TESTPKG
      NAME:  This is a Test Package.
  CATEGORY:  system
      ARCH:  sparc
   VERSION:  1.0
   BASEDIR:  /
    PSTAMP:  XXXXXXXX20110912170357
  INSTDATE:  9月 12 2011 17:21
    STATUS:  完全にインストールされました。
     FILES:        4 のインストールされたパス名
                   1 の共有パス名
                   3 のディレクトリ

ちなみにzshはこう。

$ pkginfo -l SUNWzsh
   PKGINST:  SUNWzsh
      NAME:  Z shell (zsh)
  CATEGORY:  system
      ARCH:  sparc
   VERSION:  11.10.0,REV=2005.01.08.05.16
   BASEDIR:  /
    VENDOR:  Sun Microsystems, Inc.
      DESC:  Z shell (zsh)
    PSTAMP:  sfw1020050108052452
  INSTDATE:  Jun 13 2011 09:41
   HOTLINE:  Please contact your local service provider
    STATUS:  完全にインストールされました。
     FILES:      594 のインストールされたパス名
                   6 の共有パス名
                   1 のリンクされたファイル
                  32 のディレクトリ
                  30 の実行可能ファイル
                5585 ブロック (概算値) が使われました

Subversionはこんな感じ。

$ pkginfo -l SMCsvn1612
   PKGINST:  SMCsvn1612
      NAME:  subversion
  CATEGORY:  application
      ARCH:  sparc
   VERSION:  1.6.12
   BASEDIR:  /usr/local
    VENDOR:  The Subversion Group
    PSTAMP:  Steve Christensen
  INSTDATE:  7月 22 2011 16:21
     EMAIL:  steve@smc.vnet.net
    STATUS:  完全にインストールされました。
     FILES:      787 のインストールされたパス名
                  32 の共有パス名
                 119 のディレクトリ
                 196 の実行可能ファイル
               32057 ブロック (概算値) が使われま
pkgadd(コマンド)
  • pkgadd PKG

パッケージのインストール

  • pkgadd -n PKG

パッケージのインストール(選択肢を全てデフォルトとする)

pkgrm(コマンド)
  • pkgrm PKG

パッケージのアンインストール

  • pkgrm -n PKG

パッケージのアンインストール(選択肢を全てデフォルトとする)

*1:たとえばこんな感じらしい。「Chip designers need CAD application software to design abc chips. Runs only on xyz hardware and is installed in the usr partition.」

*2:絶対パスは関係ない