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

コアファイルの管理 (coreadm)

コアファイルの管理は coreadm コマンドを使用して行います。たとえば、coreadm コマンドを使用して、プロセスコアファイルをすべて同じシステムディレクトリに置くようにシステムを構成できます。Solaris のプロセスやデーモンが異常終了した場合に、特定のディレクトリにあるコアファイルを調べればよいため問題の追跡が容易になります。

Solaris のこれまでのプロセスコアダンプ機能には次の制約がありました。

構成可能なコアファイルの設定

次の 2 つの構成可能な新しいコアファイルの設定は、個別に有効または無効にすることができます。

プロセスが異常終了すると、以前の Solaris リリースと同じように core ファイルが現在のディレクトリに作成されます。しかし、たとえば、グローバルコアファイルの設定が有効で /corefiles/core に設定されていると、プロセスが終了するたびにコアファイルが 2 つ、1 つは現在の作業ディレクトリに、1 つは /corefiles ディレクトリにそれぞれ作成されます。

デフォルトでは Solaris のコアの設定とコアファイルの保存方法は従来と同じです。

拡張されたコアファイル名

グローバルコアファイルディレクトリが有効な場合、次の表に示す変数を使って core ファイルを相互に区別できます。

変数名 

変数の定義 

%p

プロセス ID 

%u

実効ユーザー ID 

%g

実効グループ ID 

%f

実行可能ファイル名 

%n

システムノード名。uname -n の出力と同じ

%m

マシン名。uname -m での出力と同じ

%t

time(2) システム呼び出しの 10 進数

%%

リテラル % 

たとえば、グローバルコアファイル設定が次のように設定されている場合、

/var/core/core.%f.%p

PID 12345sendmail プロセスが異常終了すると、次の core ファイルが作成されます。

/var/core/core.sendmail.12345

コアファイル名パターンの設定

コアファイル名パターンは、グローバルに設定したりプロセス単位で設定したりできます。さらに、この設定をシステムリブート後も有効になるように保存するかどうかを指定できます。

たとえば、次の coreadm コマンドでは、init プロセスで起動されたすべてのプロセスに対しグローバルのコアファイルパターンを設定します。このパターンは複数のシステムリブート後も有効です。


$ coreadm -i /var/core/core.%f.%p

グローバルのコア値は /etc/coreadm.conf ファイルに格納されるため、この設定値はシステムリブート後も有効になるように保存されます。

次の coreadm コマンドでは、すべてのプロセスに対しプロセス別コアファイル名パターンを設定します。


$ coreadm -p /var/core/core.%f.%p $$

$$ 記号には、現在実行中のシェルのプロセス ID を指定します。プロセス別コアファイル名パターンは、すべての子プロセスに継承されます。

グローバルまたはプロセス別のコアファイル名パターンを設定したら、これを coreadm -e コマンドで有効にする必要があります。詳細は、次の手順を参照してください。

このコマンドをユーザーの $HOME/.profile または .login ファイルに入れておけば、ユーザーのログインセッションで実行するすべてのプロセスに対しコアファイル名パターンを設定できます。

setuid プログラムを有効にしてコアファイルを作成する

coreadm コマンドを使って setuid プログラムを有効または無効にすれば、次の設定を行うことによって、すべてのシステムプロセスに対して、または各プロセスに対してコアファイルを作成できます。

デフォルトでは、両方のフラグが無効になっています。セキュリティ上の理由により、グローバルコアファイル設定は、/ で始まるフルパス名であることが必要です。スーパーユーザーがプロセス別コアファイルを無効にすると、個別のユーザーがコアファイルを得ることはできなくなります。

setuid コアファイルはスーパーユーザーによって所有され、スーパーユーザーだけに読み取り/書き込み権が与えられます。通常ユーザーは、たとえ setuid コアファイルを生成したプロセスを所有していても、それらのファイルにアクセスできません。

詳細は、coreadm(1M) のマニュアルページを参照してください。

現在のコアダンプ構成を表示する方法

現在のコアダンプ構成を表示するには、オプションを指定しないで coreadm コマンドを実行します。


$ coreadm
               global core file pattern: /var/core/core.%f.%p
                 init core file pattern: core
                      global core dumps: enabled
                 per-process core dumps: enabled
                global setid core dumps: enabled
           per-process setid core dumps: disabled
               global core dump logging: disabled

コアファイル名パターンを設定する方法

  1. プロセス別コアファイルを設定するのか、グローバルコアファイルを設定するのかを決めて、次のどちらかの手順に従います。

    1. プロセス別コアファイル名パターンを設定します。


      # coreadm -p $HOME/corefiles/%f.%p $$
      
    2. グローバルコアファイル名パターンを設定します。

      まずスーパーユーザーになる必要があります。


      # coreadm -g /var/corefiles/%f.%p
      

コアファイル名パターンを表示する方法

現在のプロセスのコアファイル設定を知るには、次の coreadm コマンドを使用します。$$ 記号には、実行されているシェルのプロセス ID を指定します。


$ coreadm $$
278:    core.%f.%p

スーパーユーザーは coreadm process ID を指定すれば、どのユーザーのコアファイル設定でも照会できます。通常のユーザーは、自分のプロセスのコアファイル設定だけを照会できます。

プロセス別コアファイル設定を有効にする方法

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

  2. プロセス別コアファイル設定を有効にします。


    # coreadm -e process
    
  3. 現在のプロセスのコアファイル設定を表示して構成を確認します。


    $ coreadm $$
    1180:   /home/kryten/corefiles/%f.%p

グローバルのコアファイル設定を有効にする方法

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

  2. グローバルのコアファイル設定を有効にします。


    # coreadm -e global -g /var/core/core.%f.%p
    
  3. 現在のプロセスのコアファイル設定を表示して構成を確認します。


    # coreadm
          global core file pattern: /var/core/core.%f.%p
            init core file pattern: core
                 global core dumps: enabled
            per-process core dumps: enabled
           global setid core dumps: disabled
      per-process setid core dumps: disabled
          global core dump logging: disabled

コアファイルの問題解決

エラーメッセージ

NOTICE: 'set allow_setid_core = 1' in /etc/system is obsolete
NOTICE: Use the coreadm command instead of 'allow_setid_core'
原因

setuid コアファイルを許容する古いパラメータが /etc/system ファイルにあります。

解決方法

/etc/system ファイルから allow_setid_core=1 を削除し、coreadm コマンドを使ってグローバル setuid コアファイルの設定を有効にします。