Solaris のシステム管理 (上級編)

システムアカウンティングのコンポーネント

システムアカウンティングソフトウェアは、データから要約ファイルとレポートを生成する C 言語プログラムとシェルスクリプトを提供します。これらのプログラムは /usr/lib/acct ディレクトリにあります。アカウンティングレポートは、/var/adm/acct ディレクトリにあります。

日次アカウンティングによって、次の 4 種類の監査を行うことができます。

接続アカウンティング

接続アカウンティングでは、次のデータを調べることができます。

この接続セッション情報を提供するために、システムは次のデータを格納します。

これらのレコードは、dateinitloginttymonacctwtmp などのシステムプログラムの出力によって生成されます。これらは /var/adm/wtmpx ファイルに格納されます。

wtmpx ファイルのエントリには、次の情報を入れることができます。

プロセスアカウンティング

プロセスアカウンティングでは、システムで実行される各プロセスに関する次のデータを追跡できます。

プロセスが終了するたびに、exit プログラムは上記のデータを収集し、/var/adm/pacct ファイルに書き込みます。

ディスクアカウンティング

ディスクアカウンティングでは、各ユーザーがディスク上に持っているファイルについて、次のデータを収集しフォーマットできます。

これらのデータは、/usr/lib/acct/dodisk シェルスクリプトによって収集されますが、収集周期は /var/spool/cron/crontabs/root ファイルに追加するエントリによって決定されます。一方、dodisk スクリプトは、acctdisk コマンドと acctdusg コマンドを起動します。これらのコマンドは、ログイン名ごとのディスク使用量を収集します。


注意 – 注意 –

dodisk スクリプトを実行して収集された情報は /var/adm/acct/nite/disktacct ファイルに格納されます。これらの情報は、次に dodisk スクリプトを実行したときに上書きされます。したがって、dodisk スクリプトは同じ日に 2 回以上実行しないでください。


acctdusg コマンドは、ランダムに書き込まれたため穴があいたファイルに対して過剰に課金します。このような問題が起こるのは、acctdusg コマンドが、ファイルサイズを決めるときに、ファイルの間接ブロックを読み取らないからです。 acctdusg コマンドは、i ノードの現在のファイルサイズの値をチェックして、ファイルのサイズを決めます。

料金計算

chargefee ユーティリティーは、ユーザーに提供した特別なサービスに対する課金を、/var/adm/fee ファイルに格納します。特別なサービスとは、たとえば、ファイルの復元です。 このファイルの各エントリは、ユーザーのログイン名、ユーザー ID、および料金から構成されています。このファイルは、runacct スクリプトによって毎日チェックされて、新しいエントリが全体のアカウンティングレコードにマージされます。chargefee スクリプトを実行してユーザーに課金する方法については、「ユーザーに課金する方法」を参照してください。

日次アカウンティング機能の動作

次に、日次アカウンティング機能がどのように動作するかを要約して示します。

  1. システムをマルチユーザーモードに切り替えると、/usr/lib/acct/startup プログラムが実行されます。この startup プログラムは、それぞれ日次アカウンティング機能を呼び出す他のプログラムを実行します。

  2. acctwtmp プログラムは、/var/adm/wtmpx ファイルに「ブート」レコードを追加します。このレコードには、システム名が wtmpx レコード内のユーザー名として示されます。次の表に、raw アカウンティングデータがどのように収集され、どこに格納されるかをまとめて示します。

    /var/adm 内のファイル

    格納される情報 

    データを書き込むプログラム 

    表記形式 

    wtmpx

    接続セッション数  

    logininit

    バイナリ形式 

     

    変更

    date

    バイナリ形式 

     

    リブート

    acctwtmp

    バイナリ形式 

     

    シャットダウン

    shutacct

    バイナリ形式 

    pacctn

    プロセス数 

    カーネル (プロセス終了時)  

    バイナリ形式 

     

     

    turnacct switch (古いファイルの内容が 500 ブロックに達すると、新しいファイルが作成される)

    バイナリ形式 

    fee

    特別料金 

    chargefee

    ASCII 

    acct/nite/disktacct

    使用ディスク領域 

    dodisk

    バイナリ形式 

  3. turnacct スクリプトが -on オプションで起動されて、プロセスアカウンティングを開始します。具体的には、turnacct スクリプトは、/var/adm/pacct 引数を使用して accton プログラムを実行します。

  4. remove シェルスクリプトが、runacct によって sum ディレクトリに保存されている pacct および wtmpx ファイルを「整理」します。

  5. login および init プログラムが、 /var/adm/wtmpx ファイルにレコードを書き込み、接続セッションを記録します。すべての日付変更 (引数を指定して date を使用) も /var/adm/wtmpx ファイルに書き込まれます。リブート回数とシャットダウン回数も、acctwtmp コマンドを使用して、 /var/adm/wtmpx ファイルに記録されます。

  6. プロセスが終了すると、カーネルが /var/adm/pacct ファイルにプロセスごとに 1 レコードを acct.h 形式で書き込みます。

    cron コマンドは、1 時間ごとに ckpacct スクリプトを実行して、/var/adm/pacctファイルのサイズをチェックします。このファイルが 500 ブロック (デフォルト) よりも大きくなった場合は、turnacct switch コマンドが実行されます。このプログラムは pacct ファイルを pacctn ファイルに移動して、新しいファイルを作成します。pacct ファイルを小さく分けることの利点は、それらのレコードを処理するときに障害が発生して、runacct スクリプトを再起動しようとしたときに明らかになります。

  7. runacct スクリプトは、cron コマンドによって毎晩実行されます。runacct スクリプトは、アカウンティングファイルを処理し、ユーザー別のコマンド要約と利用状況要約を生成します。処理されるアカウンティングファイルは以下のとおりです。 /var/adm/pacct n/var/adm/wtmpx/var/adm/fee、および /var/adm/acct/nite/disktacct

  8. /usr/lib/acct/prdaily スクリプトは、runacct スクリプトによって1 日1 回実行され、/var/adm/acct/sum/rprtMMDD ファイルに日次アカウンティング情報を書き込みます。

  9. monacct スクリプトを月に 1 回 (または毎会計期の終わりなど、ユーザーが決めた周期で) 実行すべきです。monacct スクリプトは、sum ディレクトリに格納されているデータに基づいてレポートを作成します。これらのデータは runacct スクリプトによって毎日更新されています。このレポートを作成後、monacct スクリプトは sum ディレクトリを「整理」して、新しい runacct データを格納するためのファイルを準備します。

システムがシャットダウンしたときの動作

shutdown コマンドを使用してシステムをシャットダウンした場合は、shutacct スクリプトが自動的に実行されます。shutacct スクリプトは /var/adm/wtmpx ファイルに「理由レコード」を書き込み、プロセスアカウンティングを無効にします。