Solaris のシステム管理 (第 2 巻)

第 22 章 アカウンティングの設定と管理作業

この章ではアカウンティングを設定し、管理する手順について説明します。

この章で説明する手順は次のとおりです。

システムアカウンティングの設定

システムアカウンティングは、システムがマルチユーザーモード (システム状態 2) のときに実行されるように設定できます。システムアカウンティングには、次の内容が含まれます。

  1. /etc/rc0.d/K22acct および /etc/rc2.d/S22acct ファイルの作成

  2. /var/spool/cron/crontabs/adm および /var/spool/cron/crontabs/root ファイルの変更

アカウント用スクリプトのほとんどは、/var/spool/cron/crontabs/adm データベースファイルに追加されます。表 22-1 に、デフォルトのアカウンティング管理スクリプトを説明します。

表 22-1 デフォルトのアカウンティング管理スクリプト

アカウンティングスクリプト 

目的 

実行方法 

ckpacct(1M)

/usr/adm/pacct ログファイルのサイズをチェックする

定期的 

runacct(1M)

接続、プロセス、ディスク、および料金のアカウンティング情報を処理する 

日次 

monacct(1M)

会計レポートを生成する。定期的に実行される 

会計期間に基づく 

これらのデフォルトは変更できます。上記エントリをデータベースに追加して、アカウンティングプログラムをインストールした後、アカウンティングは自動的に実行されるようになります。

システムアカウンティングを設定する方法

  1. スーパーユーザーになります。

  2. 必要な場合は、pkgadd または admintool コマンドを使用して、システムに SUNWaccrSUNWaccu パッケージをインストールします。

  3. 次のように入力して、/etc/init.d/acct を実行レベル 2 の起動スクリプトとしてインストールします。

    # ln /etc/init.d/acct /etc/rc2.d/S22acct
    
  4. /etc/init.d/acct を実行レベル 0 の停止スクリプトとしてインストールします。

    # ln /etc/init.d/acct /etc/rc0.d/K22acct
    
  5. プログラム ckpacctrunacct、および monacct が自動的に起動するように、ユーザー admcrontab ファイルを変更します。

    # EDITOR=vi; export EDITOR
    # crontab -e adm
    0 * * * * /usr/lib/acct/ckpacct
    30 2 * * * /usr/lib/acct/runacct 2> /var/adm/acct/nite/fd2log
    30 7 1 * * /usr/lib/acct/monacct
    
  6. プログラム dodisk が自動的に起動するように、root crontab ファイルを変更します。

    # crontab -e 
    30 22 * * 4 /usr/lib/acct/dodisk
    
  7. エディタを使用して、/etc/acct/holidays を編集して祭日と休日を取り入れます。

  8. システムをリブートするか、次のように入力します。

    # /etc/init.d/acct start
    

例 - アカウンティングを設定する

次の例は、/usr/lib/acct/ckpacct/usr/lib/acct/runacct、および /usr/lib/acct/monacct を実行する crontab エントリを /var/spool/cron/crontabs/adm に追加する方法を示します。

#ident  "@(#)adm        1.5     92/07/14 SMI"    /* SVr4.0 1.2   */
#
# The adm crontab file should contain startup of performance collection if
# the profiling and performance feature has been installed.
#
0 * * * * /usr/lib/acct/ckpacct
30 2 * * * /usr/lib/acct/runacct 2> /var/adm/acct/nite/fd2log
30 7 1 * * /usr/lib/acct/monacct

次の例は、/usr/lib/acct/dodisk を実行する crontab エントリを /var/spool/cron/crontabs/root に追加する方法を示します。

#ident  "@(#)root       1.16    98/04/28 SMI"   /* SVr4.0 1.1.3.1       */
#
# The root crontab should be used to perform accounting data collection.
#
# The rtc command is run to adjust the real time clock if and when
# daylight savings time changes.
#
10 3 * * 0,4 /etc/cron.d/logchecker
10 3 * * 0   /usr/lib/newsyslog
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
30 22 * * 4 /usr/lib/acct/dodisk

次に /etc/acct/holidays ファイルの例を示します。

* @(#)holidays  January 1, 1998
*
* Prime/Nonprime Table for UNIX Accounting System
*
* Curr  Prime   Non-Prime
* Year  Start   Start
*
  1997  0800    1800
*
* only the first column (month/day) is significiant.
*
* month/day     Company
*               Holiday
*
1/1             New Years Day
1/20            Martin Luther King's Day
2/17            President's Day
5/26            Memorial Day
7/3             Day before Indep. Day
7/4             Indep. Day
9/1             Labor Day
11/27           Thanksgiving
11/28           Day after Thanksgiving
12/25           Christmas
12/26           Winter Break
12/29           Winter Break
12/30           Winter Break
12/31           Winter Break

ユーザーへの課金

ファイルの復元、リモート印刷などの特別なユーザーサービスを要求時に提供する場合は、chargefee(1M) という機能を使用してユーザーに対する課金処理を行うことができます。chargefee は、課金をファイル /var/adm/fee に記録します。次に、runacct ユーティリティが実行されるたびに、新しいエントリが拾い出されて、全体のアカウンティングレコードにマージされます。

ユーザーに課金する方法

  1. スーパーユーザーになります。

  2. ユーザーに提供されたサービスに対して課金するように設定します。

    # chargefee username amount
    

    username

    課金したいユーザーアカウント 

    amount

    ユーザーに対する課金の単位数 

例 - ユーザーに課金する

次の例は、ユーザーがアカウント print_customer にログインするたびに 10 単位を課金します。

# chargefee print_customer 10

アカウンティング情報の管理

この節では、アカウンティング情報を保守する方法について説明します。

壊れたファイルと wtmp エラーを修復する

UNIX のアカウンティングシステムは堅固ではなく、ファイルが壊れたり失われることがあります。そのようなファイルにも、単に無視してよいものや、バックアップから復元できるものがあります。しかし、特定のファイルは、アカウンティングシステムの完全性を維持するために修復しなければなりません。

wtmp(4) ファイルは、アカウンティングシステムを日常的に運用する上で発生する大部分の問題の原因になっています。日付が変更され、システムがマルチユーザーモードになると、1 組の日付変更レコードが /var/adm/wtmp に書き込まれます。wtmpfix(1M) ユーティリティは、日付変更されたときの wtmp レコード内のタイムスタンプの調整用として用意されています。ただし、日付変更とリブートとの組み合わせによっては、wtmpfix のチェックから漏れて、acctcon の処理を失敗させることがあります。wtmp の問題を解決する手順については、wtmp ファイルを修復する方法」を参照してください。

wtmp ファイルを修復する方法

  1. スーパーユーザーになります

  2. ディレクトリ /var/adm/acct/nite に変更します。

  3. 次のように、バイナリファイル wtmp.MMDD を ASCII ファイル xwtmp に変換します。

    # fwtmp wtmp.MMDD xwtmp
    

    MMDD

    2 桁の数値で指定される月日 

  4. xwtmp を編集します。壊れたファイルを削除するか、始めから日付変更までのすべてのレコードを削除します。

  5. ASCII ファイル xwtmp をバイナリファイルに変換し、壊れたファイルを上書きします。

    # fwtmp -ic xwtmp wtmp.MMDD
    

tacct エラーを修復する

/var/adm/acct/sum/tacct の完全性は、システム資源に対してユーザーに課金している場合は重要です。負の番号、重複したユーザー ID、または 65535 のユーザー ID など、不可思議な tacct レコードが現れることがありますが、その場合は prtacct/var/adm/acct/sum/tacctprev を印刷して、チェックしてください。内容が正しい場合は、最新の /var/adm/acct/sum/tacct.MMDD ファイルを使用して、/var/adm/acct/sum/tacct ファイルを作成し直してください。次の手順は、簡単な修復手順の概要を説明しています。

tacct エラーを修復する方法

  1. スーパーユーザーになります。

  2. ディレクトリ /var/adm/acct/sum に変更します。

  3. 次のように、tacct.MMDD の内容をバイナリから ASCII 形式に変換します。

    # acctmerg -v tacct.MMDD xtacct
    

    MMDD

    2 桁の数字で指定される月日 

  4. xtacct ファイルを編集して、不良レコードを削除し、重複レコードを別のファイルに書き込みます。

  5. xtacct ファイルを ASCII 形式からバイナリに変換します。

    # acctmerg -i xtacct tacct.MMDD
    

    MMDD

    2 桁の数字で指定される月日 

  6. ファイル tacct.prvtacct.MMDD をマージしてファイル tacct を生成します。

    # acctmerg tacctprv tacct.MMDD tacct
    

runacct を再起動する

runacct プログラムはいろいろな原因で失敗することがあります。一番多い原因は、システムがクラッシュする、/var がディスク容量を使い果たす、wtmp ファイルが壊れたなどです。active.MMDD ファイルが存在する場合、まずエラーメッセージがないか調べます。active ファイルとロックファイルが存在する場合、異常なメッセージがないかどうか fd2log ファイルを調べます。

runacct は、引数を指定しないで実行すると、その日の最初の起動とみなします。runacct を起動し直し、もう一度 runacct にアカウンティングをやり直させる月日を指定する場合は、引数 MMDD が必要です。処理のエントリポイントは statefile の内容に基づきます。statefile を無効にするには、次のように処理を開始したい状態をコマンド行に指定します。


注意 - 注意 -

runacct プログラムを手動で実行するときは、ユーザー adm として実行していることを確認してください。


runacct を再起動する方法

  1. lastdate ファイルと lock* ファイル (もしあれば) を削除します。

    $ cd /var/adm/acct/nite
    $ rm lastdate lock*
    
  2. runacct プログラムを再起動します。

    $ runacct MMDD [state] 2> /var/adm/acct/nite/fd2log &
    

    MMDD

    月日を数値で指定する 

    state

    runacct 処理を開始させたい状態または開始点を指定する

システムアカウンティングの停止と無効

システムアカウンティングは、一時的に停止することも、永久に無効にすることもできます。

一時的にシステムアカウンティングを停止する方法

  1. スーパーユーザーになります。

  2. 適切な行をコメントアウトすることによって、プログラム ckpacctrunacct、および monacct の実行が停止するように、ユーザー admcrontab ファイルを変更します。

    # EDITOR=vi; export EDITOR
    # crontab -e adm
    #0 * * * * /usr/lib/acct/ckpacct
    #30 2 * * * /usr/lib/acct/runacct 2> /var/adm/acct/nite/fd2log
    #30 7 1 * * /usr/lib/acct/monacct
  3. 適切な行をコメントアウトすることによって、プログラム dodisk の実行が停止するように、ユーザー rootcrontab ファイルを変更します。

    # crontab -e 
    #30 22 * * 4 /usr/lib/acct/dodisk
  4. 次のように入力して、アカウンティングを停止します。

    # /etc/init.d/acct stop
    

システムアカウンティングを再び有効にするには、新たに追加したコメント記号を crontab ファイルから削除して、次のように入力します。

# /etc/init.d/acct start

システムアカウンティングを永久に無効にする方法

  1. スーパーユーザーになります。

  2. ユーザー admcrontab ファイルを変更して、プログラム ckpacctrunacct、および monacct 用のエントリを削除します。

    # EDITOR=vi; export EDITOR
    # crontab -e adm
    
  3. ユーザー rootcrontab ファイルを変更して、プログラム dodisk 用のエントリを削除します。

    # crontab -e
    
  4. 実行レベル 2 用の起動スクリプトのリンクを取り外します。

    # unlink /etc/rc2.d/S22acct
    
  5. 実行レベル 0 用の停止スクリプトのリンクを取り外します。

    # unlink /etc/rc0.d/K22acct
    
  6. 次のように入力して、アカウンティングを停止します。

    # /etc/init.d/acct stop