この項では、SAC で使用できる管理ファイルについて説明します。
サービスアクセスコントローラの管理ファイルには、SAC の管理下にある全ポートモニタの情報が入っています。このファイルは配布システムに入っています。最初、このファイルには SAC のバージョン番号の入ったコメント行が 1 行入っているだけです。システムにポートモニタを追加するときは、SAC の管理ファイルにエントリを作成します。エントリを追加するには、管理コマンド sacadm に -a オプションを付けて実行します。SAC の管理ファイルからエントリを削除するときも、sacadm を使用します。
SAC の管理ファイルの各エントリには、表 F-1 で示されている次の情報が含まれています。
表 F-1 SAC_sactab ファイル
フィールド |
説明 |
---|---|
PMTAG |
個々のポートモニタを一意的に識別できるタグ。ポートモニタの命名はシステム管理者が行う。SAC は、管理目的でポートモニタを識別するときはこのタグを使用する。PMTAG には、14 文字までの英数字が入る。 |
ポートモニタのタイプ。各ポートモニタには、それを一意に識別できるタグのほかにタイプ指示子がある。タイプ指示子は、同一エンティティを別々に起動したことによるポートモニタグループを示す。有効なポートモニタタイプの例として ttymon と listen が挙げられる。タイプ指示子を使用すると、関連ポートモニタからなるグループの管理が楽になる。タイプ指示子がないと、システム管理者は各ポートモニタタグがどのタイプのポートモニタなのか判断できない。PMTYPE には、14 文字までの英数字が入る。 |
|
FLGS |
現在定義されているフラグは次の 2 つがある。 -d 起動時にポートモニタを有効にしない。 -x ポートモニタを起動しない。 フラグを指定しないと、デフォルトのアクションが実行される。デフォルトでは、ポートモニタは起動され有効に設定される。 |
RCNT |
ポートモニタが何回エラーを起こしたらエラー停止状態になるかを示す。SAC は、エラー停止状態になったポートモニタは再起動しない。エントリ作成時にこの回数を指定しないと、このフィールドは 0 になる。再起動回数が 0 ということは、ポートモニタが一度でもエラーストップすると、以後再起動されないことを意味する。 |
COMMAND |
ポートモニタを起動するコマンドの文字列。文字列の最初の要素 (コマンド自身) は、フルパスで指定しなければならない。 |
各ポートモニタは、それぞれ 2 つの専用ディレクトリを持ちます。カレントディレクトリには、SAF で決められたファイル (_pmtab、_pid) と、サービスごとの構成スクリプト (作成した場合のみ) とがあります。ディレクトリ /var/saf/pmtag (pmtag はポートモニタのタグ) には、ポートモニタのプライベートファイルを入れることができます。
各ポートモニタは自分の管理ファイルを持っています。管理ファイルのサービスエントリの追加、削除、変更を行うときは、pmadm コマンドを使用します。pmadm で管理ファイルを変更するたびに、対応するポートモニタはそのファイルを読み直さなければなりません。ポートモニタの管理ファイルの各エントリでは、個々のポートの扱いと、そのポートで呼び出されるサービスとを定義します。
どのタイプのポートモニタでも省略できないフィールドがあります。エントリには、サービスを一意的に識別するためのサービスタグと、サービスが起動されたときに割り当てられる ID (たとえば、root) が必ず入っていなければなりません。
サービスタグとポートモニタタグを組み合わせると、サービスインスタンスが一意的に定義されます。別のポートモニタの下のサービスを識別するのに、同じサービスタグを使用することができます。レコードにはポートモニタに固有のデータも入っています。(たとえば、ポートモニタ ttymon の場合、ttymon にだけ必要なプロンプト文字列が入っています。) ポートモニタのタイプごとに、ポートモニタの固有データを引数とし、そのデータを適当な形式で管理ファイルの中に書き出すコマンドが提供されていなければなりません。ttymon に対しては ttyadm コマンドが、listen に対しては nlsadmin コマンドがこの処理を行います。ユーザがポートモニタを作成するときは、このような管理コマンドも同時に作成する必要があります。
ポートモニタ管理ファイルの各サービスエントリには、以下にリストする情報が次の形式で入っていなければなりません。
svctag:flgs:id: reserved: reserved: reserved: pmspecific# comment
SVCTAG はサービスを一意的に識別するタグです。タグは、サービスが提供されるポートモニタの中でのみ一意になるようにします。別のポートモニタのサービス (同一サービスまたは別のサービス) には、同じタグが付けられていてもかまいません。サービスを一意的に識別するには、ポートモニタタグとサービスタグの両方が必要です。
SVCTAG には、14 文字までの英数字が入ります。サービスエントリは、表 F-2 で定義されています。
表 F-2 SVCTAG サービスエントリ
サービスエントリ |
説明 |
---|---|
FLGS |
このフィールドには、現在次のフラグを入れることができる。 -x このポートは有効にしない。デフォルトでは有効になる。 -u このサービスの utmp エントリを作成する。デフォルトではサービスの utmp エントリは作成されない。 |
ID |
サービスを起動するときの ID。ID は、/etc/passwd に入っているログイン名と同じ形式を持つ。 |
PMSPECIFIC |
ポートモニタ固有情報の例として、アドレス、実行するプロセスの名前、接続を渡す STREAMS パイプの名前、が挙げられる。この情報はポートモニタのタイプごとに異なる。 |
COMMENT |
サービス呼び出し方法からみて、utmp を作成するのが適当でない場合は、ポートモニタが -u フラグを無視することに注意してください。サービスによっては、utmp エントリが作成されていないと正しく起動できないものもあります (たとえば、login サービス)。
各ポートモニタの管理ファイルには、次の形式の特殊なコメントが入っていなければなりません。
# VERSION=value
ここで、value はポートモニタのバージョン番号を表す整数です。バージョン番号により、ポートモニタの管理ファイルの形式がわかります。このコメント行は、ポートモニタをシステムに追加したときに自動的に作成されます。これだけが 1 行となってサービスエントリの前に入ります。
sacadm は、SAF 階層の上位レベル (すなわち、ポートモニタ管理) に対する管理コマンドです。(sacadm(1M) のマニュアルページを参照してください)。SAF では、sacadm コマンドを使用して SAC の管理ファイルを変更することによりポートモニタを管理します。sacadm は、次にのような機能があります。
指定されたポートモニタ情報を SAC 管理ファイルから取り出して印刷する。
ポートモニタの追加と削除を行う。
ポートモニタの有効・無効を切り換える。
ポートモニタの起動と停止を行う。
システムごとの構成スクリプトのインストールまたは置き換えを行う。
ポートモニタごとの構成スクリプトのインストールまたは置き換えを行う。
pmadm は、SAF 階層の下位レベル (すなわち、サービス管理) に対する管理コマンドです。(pmadm(1M) のマニュアルページを参照してください)。複数のポートで同じサービスを提供することは可能ですが、1 つのポートには 1 つのサービスしか結合できません。pmadm の機能を次に示します
指定されたサービスステータス情報をポートモニタの管理ファイルから取り出して印刷する。
サービスの追加と削除を行う。
サービスの有効・無効を切り換える。
サービスの有効・無効を切り換える。
サービスインスタンスを一意的に識別するには、pmadm コマンドで、サービス (-s) と、サービスが提供されるポートモニタ (-p または -t) の両方を指定しなければならないことに注意してください。
前の節では、_pmtab ファイル内の 2 つの情報、すなわち、ポートモニタのバージョン番号と、_pmtab ファイルのサービスエントリに入っているポートモニタ情報とを説明しました。新たなポートモニタを追加するときは、_pmtab ファイルを正しく初期化するためにバージョン番号がわかっていなければなりません。新たなサービスを追加するときは、_pmtab エントリのポートモニタ情報が正しくフォーマットされなければなりません。 各ポートモニタには、この 2 つの処理を行うための管理コマンドが必要です。ポートモニタの設計者は、そのような管理コマンドとその入力オプションも定義しなければなりません。
管理コマンドは、そのような入力オプションを指定して呼び出されると、サービスエントリのポートモニタ固有部分に必要な情報を、ポートモニタの _pmtab ファイルに入るようにフォーマットし、それを標準出力に書き出さなければなりません。バージョン番号を調べるときは、コマンドに -V オプションを付けて実行します。その場合管理コマンドは、ポートモニタの現在のバージョン番号を標準出力に書き出さなければなりません。
どちらの処理を実行している場合も、管理コマンドに何らかのエラーが起これば、標準出力には何も表示されません。
ポートモニタとサービスのインタフェースは、サービスの側から決まります。サービスを呼び出す方法の例として、2 つの方法を説明します。
インタフェースの 1 つに、要求ごとに新たにサービスを起動する方法があります。この場合、まずポートモニタに子プロセスの fork() を要求します。子プロセスは、exec() を実行することで、指定されたサービスになります。ポートモニタは、exec() が起こる前に、ポートモニタ固有のアクションを実行します。ただし、サービスごとの構成スクリプトがあれば、必ずそれを読み込んで実行しなければなりません。そのためには、ライブラリルーチン doconfig() を呼び出します。
現在実行中のサービスを呼び出すためのもう 1 つのインタフェースがあります。このインタフェースを使用するサービスは、ストリームパイプの一端をオープンにしておき、そこを通して接続を受信できるようにしておかなければなりません。
ポートモニタを開発するには、いくつかの一般的な条件が満たされていなければなりません。この節では、そのような条件を簡単に説明します。ポートモニタだけでなく、管理コマンドも同時に作成する必要があります。
ポートモニタが起動されるときは、次のような初期実行環境が整っていなければなりません。
オープンしているファイル記述子を持たない。
プロセスグループリーダにはならない。
/etc/utmp に、タイプが LOGIN_PROCESS のエントリを持つ。
環境変数 ISTATE
が "enabled" か "disabled" のどちらかに設定されており、ポートモニタの正しい初期状態を示す。
ポートモニタの管理ファイルの入ったディレクトリがカレントディレクトリになっている。
ポートモニタは、/var/saf/tag ディレクトリにプライベートファイルを作成できる。(ここで、tag はポートモニタのタグ)
カレントディレクトリには、次に示すポートモニタの主要ファイルが存在します。
表 F-3 ポートモニタの主要ファイル
ファイル |
説明 |
---|---|
ポートモニタの構成スクリプト。ポートモニタの構成スクリプトは SAC が実行する。SAC は init() により起動される。そのためには、/etc/inittab に sac を呼び出すためのエントリを入れておく。 |
|
ポートモニタの管理ファイル。このファイルには、ポートモニタの管理下にあるポートとサービスの情報が入っている。 |
|
ポートモニタが sac からのメッセージを受信するための FIFO。 |
|
svctag というタグを持つサービスの構成スクリプト。 |
|
ポートモニタが sac へのメッセージを送信するための FIFO。 |
ポートモニタは、ポートモニタ固有機能のほかに次のタスクを実行する責任があります。
sac とのメッセージ交換プロトコルに従う。
ポートモニタはサービスを起動するときに次のタスクを実行しなければなりません。
要求されたサービスに対する _pmtab エントリに "-u" フラグがあれば、utmp エントリを作成する。
サービスの起動方法から見て utmp エントリを作成する意味がなければ、ポートモニタは "-u" フラグを無視します。これとは反対に、utmp エントリが作成されていないと正しく起動できないサービスもあります。